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
-- 
Roberto Franchini
http://www.celi.it
http://www.blogmeter.it
http://www.memesphere.it
Tel +39-011-6600814
jabber:[email protected] skype:ro.franchini

Reply via email to