You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@uima.apache.org by Chuong Ngo <cn...@gmail.com> on 2013/07/12 20:16:22 UTC

Getting all Features for any Annotator

Is there a way to get all the features for an annotator, no matter which
one it is?

For example, I want to convert all annotators I get back into a JSON
respresenting that annotator.  My annotators have different number and
types of features.  For example, a person may have firstName, lastName
while an organization may have type, health, etc...  Is there another way
to do that besides casting each one to a predetermined type and then using
the getters to extract the feature values?  Thanks in advance.

Chuong Ngo

Re: Getting all Features for any Annotator

Posted by Richard Eckart de Castilho <ri...@gmail.com>.
You'd want to change that a little to avoid having duplications.

1) Get an iterator over all annotations in the CAS.getAnnotationIndex().iterator()

2) Fetch type of the current annotation from the type system

3) iterate through the features and get their values

Depending on your type system, 3 needs to be able to handle cases where
a feature is not a primitive type, but a reference to another feature structure.
If you have such cases, you may also want/need to handle features structures
being referenced from multiple other FSes. If you have a simple type system,
you can skip this advice.

Some features you'll want to skip, e.g. the SofA.

-- Richard

Am 12.07.2013 um 23:41 schrieb Chuong Ngo <cn...@gmail.com>:

> Alright, so if I understand correctly, what I need to do is something along
> the following:
> 
> 1)  Get the TypeSystem from the cas:
>  TypeSystem typeSystem = cas.getTypeSystem
> 
> 2)  Get an iterator and iterate over the TypeSystem:
>  Iterator<Type> itr = ts.getTypeIterator();
>  while(itr.hasNext()) {
>    Type type = itr.next();
>    ...
> 
> 3)  For each type, retrieve the qualified name of the type and use it to
> retrieve all annotations of that type.  Also grab the list of features for
> the type:
>    List<Feature> featureList = type.getFeatures();
>    AnnotationIndex<AnnotationFS> indexAnn = cas.getAnnotationIndex(type);
>    Iterator<AnnotationFS> itrAnn = indexAnn.iterator();
>    while(itr.hasNext()) {
>      FeatureStructure fs = (FeatureStructure) itrAnn.next();
>      ...
> 
> 4)  Iterate though the list of freatures extracted and pull out the feature
> name and values:
>     for(Feature feature : featureList) {
>       String featureName = feature.getShortName();
>       String featureValue = fs.getFeatureValueAsString(feature);
>       ...
> 
> 
> On Fri, Jul 12, 2013 at 2:58 PM, Richard Eckart de Castilho <
> richard.eckart@gmail.com> wrote:
> 
>> People tend to fall back to using Java Reflections on the JCas wrappers,
>> before using the lower-level UIMA interfaces (CAS and AnnotationFS/
>> FeatureStructure).
>> 
>> Every UIMA annotation implements the interface FeatureStructure. This
>> interface in conjunction with the type system information you can obtain
>> from the CAS, provides all you need to extract all information.
>> 
>> There is no need to resort to reflection.
>> 
>> You may want to have a look at the source code of the CasCopier class too.
>> 
>> -- Richard
>> 
>> Am 12.07.2013 um 20:16 schrieb Chuong Ngo <cn...@gmail.com>:
>> 
>>> Is there a way to get all the features for an annotator, no matter which
>>> one it is?
>>> 
>>> For example, I want to convert all annotators I get back into a JSON
>>> respresenting that annotator.  My annotators have different number and
>>> types of features.  For example, a person may have firstName, lastName
>>> while an organization may have type, health, etc...  Is there another way
>>> to do that besides casting each one to a predetermined type and then
>> using
>>> the getters to extract the feature values?  Thanks in advance.
>>> 
>>> Chuong Ngo


Re: Getting all Features for any Annotator

Posted by Chuong Ngo <cn...@gmail.com>.
Alright, so if I understand correctly, what I need to do is something along
the following:

1)  Get the TypeSystem from the cas:
  TypeSystem typeSystem = cas.getTypeSystem

2)  Get an iterator and iterate over the TypeSystem:
  Iterator<Type> itr = ts.getTypeIterator();
  while(itr.hasNext()) {
    Type type = itr.next();
    ...

3)  For each type, retrieve the qualified name of the type and use it to
retrieve all annotations of that type.  Also grab the list of features for
the type:
    List<Feature> featureList = type.getFeatures();
    AnnotationIndex<AnnotationFS> indexAnn = cas.getAnnotationIndex(type);
    Iterator<AnnotationFS> itrAnn = indexAnn.iterator();
    while(itr.hasNext()) {
      FeatureStructure fs = (FeatureStructure) itrAnn.next();
      ...

4)  Iterate though the list of freatures extracted and pull out the feature
name and values:
     for(Feature feature : featureList) {
       String featureName = feature.getShortName();
       String featureValue = fs.getFeatureValueAsString(feature);
       ...


On Fri, Jul 12, 2013 at 2:58 PM, Richard Eckart de Castilho <
richard.eckart@gmail.com> wrote:

> People tend to fall back to using Java Reflections on the JCas wrappers,
> before using the lower-level UIMA interfaces (CAS and AnnotationFS/
> FeatureStructure).
>
> Every UIMA annotation implements the interface FeatureStructure. This
> interface in conjunction with the type system information you can obtain
> from the CAS, provides all you need to extract all information.
>
> There is no need to resort to reflection.
>
> You may want to have a look at the source code of the CasCopier class too.
>
> -- Richard
>
> Am 12.07.2013 um 20:16 schrieb Chuong Ngo <cn...@gmail.com>:
>
> > Is there a way to get all the features for an annotator, no matter which
> > one it is?
> >
> > For example, I want to convert all annotators I get back into a JSON
> > respresenting that annotator.  My annotators have different number and
> > types of features.  For example, a person may have firstName, lastName
> > while an organization may have type, health, etc...  Is there another way
> > to do that besides casting each one to a predetermined type and then
> using
> > the getters to extract the feature values?  Thanks in advance.
> >
> > Chuong Ngo
>
>

Re: Getting all Features for any Annotator

Posted by Richard Eckart de Castilho <ri...@gmail.com>.
People tend to fall back to using Java Reflections on the JCas wrappers,
before using the lower-level UIMA interfaces (CAS and AnnotationFS/
FeatureStructure). 

Every UIMA annotation implements the interface FeatureStructure. This
interface in conjunction with the type system information you can obtain
from the CAS, provides all you need to extract all information.

There is no need to resort to reflection.

You may want to have a look at the source code of the CasCopier class too.

-- Richard

Am 12.07.2013 um 20:16 schrieb Chuong Ngo <cn...@gmail.com>:

> Is there a way to get all the features for an annotator, no matter which
> one it is?
> 
> For example, I want to convert all annotators I get back into a JSON
> respresenting that annotator.  My annotators have different number and
> types of features.  For example, a person may have firstName, lastName
> while an organization may have type, health, etc...  Is there another way
> to do that besides casting each one to a predetermined type and then using
> the getters to extract the feature values?  Thanks in advance.
> 
> Chuong Ngo