Hi Roberto -

It might be nice to extract this onto the UIMA Wiki - maybe start a new
section for things like this :-)

-Marshall

Roberto Franchini wrote:
> On Wed, Jan 7, 2009 at 11:55 AM, Roberto Franchini
> <[email protected]> wrote:
>   
>> Hi,
>> I need to get a parent annotation of a given one.
>> Example: given a Token annotation, I want to know the parent Sentence.
>> I need to extract it from a cas. Maybe filters or constraint?
>> I mean a sort of "parentIterator", as the subiterator, but "reversed" :)
>> Regards,
>> Roberto
>>     
>
> Here's the answer with filtered iterator:
>
> public static FSIterator getAnnotationParent(JCas jcas, Annotation
> son, Type parent) {
>               ConstraintFactory cf = jcas.getConstraintFactory();
>               
>               FSIntConstraint beginCons = cf.createIntConstraint();
>               beginCons.leq(son.getBegin());
>               
>               FSIntConstraint endCons = cf.createIntConstraint();
>               endCons.geq(son.getEnd());
>               
>               FSTypeConstraint typeCons = cf.createTypeConstraint();
>               
>               Type type = jcas.getTypeSystem().getType(parent.getName());
>               typeCons.add(type);
>               
>               Feature beginFeature = type.getFeatureByBaseName("begin");
>               FeaturePath beginPath = jcas.createFeaturePath();
>               beginPath.addFeature(beginFeature);
>
>               Feature endFeature = type.getFeatureByBaseName("end");
>               FeaturePath endPath = jcas.createFeaturePath();
>               endPath.addFeature(endFeature);
>
>               FSMatchConstraint begin = cf.embedConstraint(beginPath, 
> beginCons);
>               
>               FSMatchConstraint end  = cf.embedConstraint(endPath, endCons);
>               
>               FSMatchConstraint beginAndEnd  = cf.and(begin, end);
>               
>               FSMatchConstraint beginAndEndAndType  = cf.and(beginAndEnd, 
> typeCons);
>               FSIterator filteredIterator =
> jcas.createFilteredIterator(jcas.getAnnotationIndex(parent).iterator(),
> beginAndEndAndType);
>               
>               return filteredIterator;
>
>       }
>
>
> Here's a test (junit).
>
>       @Test
>       public void getParent() throws Exception {
>
>               AnalysisEngine tokenizer = AnnotatorFactory.createTokenizer();
> //this is my own factory for tests!!!
>               JCas jcas = tokenizer.newJCas();
>               jcas.setDocumentText("My name is .");
>               Sentence sentence = new Sentence(jcas, 0, 
> jcas.getDocumentText().length());
>               sentence.addToIndexes();
>               tokenizer.process(jcas);
>               FSIterator iterator = 
> jcas.getAnnotationIndex(Token.type).iterator();
>               iterator.moveToNext();
>               Token token = (Token) iterator.get();
>
>               FSIterator parentIt = CasUtil.getAnnotationParent(jcas, token,
> sentence.getType());
>               assertNotNull(parentIt);
>
>               parentIt.moveToFirst();
>               Sentence sentence2 = (Sentence) parentIt.get();
>               assertNotNull(sentence2);
>               assertEquals(sentence.getCoveredText(), 
> sentence2.getCoveredText());
>
>       }
>
> It works :)
> Roberto
>   

Reply via email to