You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@uima.apache.org by Roberto Franchini <ro...@gmail.com> on 2008/07/02 11:12:57 UTC
Cloning a CAS
Hi to all,
I'm developing a Segmenter for testing porpouse. At the end of our
pipeline, we want to serialize to disk the annotation created by each
annotators.
At the moment it doesn't work as I want :(
Let me explain the details.
To do that, each annotator "sign" the annotation it creates using a
feature called "annotatorId".
Now, in the segmeter, I'm able to extract, using constranints and
filtered iterator, the annotations created by each one:
//get le list of id:
AnnotationIndex annotationIndex = jcas.getAnnotationIndex(Annotation.type);
FSIterator iterator = annotationIndex.iterator();
iterator.moveToFirst();
Annotation current;
Set<String> annotatorsIds = new TreeSet<String>();
while (iterator.hasNext()) {
current = (Annotation) iterator.next();
annotatorsIds.add(current.getAnnoId());
}
CAS cas = jcas.getCas();
Type type = cas.getTypeSystem().getType(Annotation.class.getName());
FSIndex index = cas.getAnnotationIndex(type);
//get annnotaions for each annototar
for (String id : annotatorsIds) {
logger.info("------>getting annotation produced by ::" + id);
Annotation template = new Annotation(jcas);
template.setAnnoId(id);
ConstraintFactory cf = cas.getConstraintFactory();
FSStringConstraint stringConstraint = cf.createStringConstraint();
stringConstraint.equals(id);
ArrayList path = new ArrayList();
path.add("annoId");
FSMatchConstraint cons = cf.embedConstraint(path, stringConstraint);
FSIterator filteredIterator =
cas.createFilteredIterator(index.iterator(), cons);
filteredIterator.moveToFirst();
Now, to serialize it, I want to create a new cas and put in only this
annotation and then serialize it to xmi:
JCas newJCas = getEmptyJCas();
while (filteredIterator.isValid()) {
try {
FeatureStructure anno = (FeatureStructure) filteredIterator.next();
FeatureStructure clone = (FeatureStructure) anno.clone();
newJCas.setDocumentText(doc);
newJCas.addFsToIndexes(clone);
serialize(newJCas);
} catch (ResourceProcessException e) {
logger.error(e.getMessage(), e);
} finally {
newJCas.release();
}
}
where serialize(jcasnew) simply calls XMICasSerializer, after
calcutaing the right path for the file.
Well, it doesn't work:
org.apache.uima.cas.CASRuntimeException: Error - the Annotation "NX
sofa: _InitialView
[cut]
" is over view "_InitialView" and cannot be added to indexes
associated with the different view "_InitialView".
at org.apache.uima.cas.impl.CASImpl.addFsToIndexes(CASImpl.java:3781)
at org.apache.uima.jcas.impl.JCasImpl.addFsToIndexes(JCasImpl.java:1410)
at it.celi.components.AnnotatorIdSegmenter.next(AnnotatorIdSegmenter.java:176)
at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.callAnalysisComponentNext(PrimitiveAnalysisEngine_impl.java:489)
at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl$AnalysisComponentCasIterator.next(PrimitiveAnalysisEngine_impl.java:594)
at org.apache.uima.analysis_engine.impl.AnalysisEngineImplBase.process(AnalysisEngineImplBase.java:221)
at org.apache.uima.collection.impl.cpm.engine.ProcessingUnit.processNext(ProcessingUnit.java:892)
at org.apache.uima.collection.impl.cpm.engine.ProcessingUnit.run(ProcessingUnit.java:577)
I understand that the annotation is in charge of the original CAS, in
fact I want to clone it and put this new one in the new CAS/Jcas.
What I missed?
Thank in advance, regards,
R.
--
Roberto Franchini
http://www.celi.it
http://www.blogmeter.it
http://www.memesphere.it
Tel +39-011-6600814
jabber:ro.franchini@gmail.com skype:ro.franchini
Re: Cloning a CAS
Posted by Roberto Franchini <ro...@gmail.com>.
On Wed, Jul 2, 2008 at 1:31 PM, Thilo Goetz <tw...@gmx.de> wrote:
> Hi Roberto,
>
> see org.apache.uima.util.CasCopier, and in particular,
> the copyFs() method. This should provide what you need.
>
Thanks a lot, now it works!
I'vo got my segmenter/serializer!
--
Roberto Franchini
http://www.celi.it
http://www.blogmeter.it
http://www.memesphere.it
Tel +39-011-6600814
jabber:ro.franchini@gmail.com skype:ro.franchini
Re: Cloning a CAS
Posted by Thilo Goetz <tw...@gmx.de>.
Hi Roberto,
see org.apache.uima.util.CasCopier, and in particular,
the copyFs() method. This should provide what you need.
--Thilo
Roberto Franchini wrote:
> Hi to all,
> I'm developing a Segmenter for testing porpouse. At the end of our
> pipeline, we want to serialize to disk the annotation created by each
> annotators.
> At the moment it doesn't work as I want :(
> Let me explain the details.
> To do that, each annotator "sign" the annotation it creates using a
> feature called "annotatorId".
> Now, in the segmeter, I'm able to extract, using constranints and
> filtered iterator, the annotations created by each one:
>
> //get le list of id:
> AnnotationIndex annotationIndex = jcas.getAnnotationIndex(Annotation.type);
> FSIterator iterator = annotationIndex.iterator();
> iterator.moveToFirst();
> Annotation current;
> Set<String> annotatorsIds = new TreeSet<String>();
>
> while (iterator.hasNext()) {
>
> current = (Annotation) iterator.next();
> annotatorsIds.add(current.getAnnoId());
> }
>
>
> CAS cas = jcas.getCas();
> Type type = cas.getTypeSystem().getType(Annotation.class.getName());
> FSIndex index = cas.getAnnotationIndex(type);
>
> //get annnotaions for each annototar
>
> for (String id : annotatorsIds) {
> logger.info("------>getting annotation produced by ::" + id);
> Annotation template = new Annotation(jcas);
> template.setAnnoId(id);
>
> ConstraintFactory cf = cas.getConstraintFactory();
>
> FSStringConstraint stringConstraint = cf.createStringConstraint();
> stringConstraint.equals(id);
>
> ArrayList path = new ArrayList();
> path.add("annoId");
>
> FSMatchConstraint cons = cf.embedConstraint(path, stringConstraint);
>
> FSIterator filteredIterator =
> cas.createFilteredIterator(index.iterator(), cons);
> filteredIterator.moveToFirst();
>
>
> Now, to serialize it, I want to create a new cas and put in only this
> annotation and then serialize it to xmi:
>
> JCas newJCas = getEmptyJCas();
>
> while (filteredIterator.isValid()) {
> try {
> FeatureStructure anno = (FeatureStructure) filteredIterator.next();
> FeatureStructure clone = (FeatureStructure) anno.clone();
>
> newJCas.setDocumentText(doc);
>
> newJCas.addFsToIndexes(clone);
>
> serialize(newJCas);
> } catch (ResourceProcessException e) {
> logger.error(e.getMessage(), e);
>
> } finally {
> newJCas.release();
> }
> }
>
>
> where serialize(jcasnew) simply calls XMICasSerializer, after
> calcutaing the right path for the file.
>
> Well, it doesn't work:
>
> org.apache.uima.cas.CASRuntimeException: Error - the Annotation "NX
> sofa: _InitialView
> [cut]
> " is over view "_InitialView" and cannot be added to indexes
> associated with the different view "_InitialView".
> at org.apache.uima.cas.impl.CASImpl.addFsToIndexes(CASImpl.java:3781)
> at org.apache.uima.jcas.impl.JCasImpl.addFsToIndexes(JCasImpl.java:1410)
> at it.celi.components.AnnotatorIdSegmenter.next(AnnotatorIdSegmenter.java:176)
> at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.callAnalysisComponentNext(PrimitiveAnalysisEngine_impl.java:489)
> at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl$AnalysisComponentCasIterator.next(PrimitiveAnalysisEngine_impl.java:594)
> at org.apache.uima.analysis_engine.impl.AnalysisEngineImplBase.process(AnalysisEngineImplBase.java:221)
> at org.apache.uima.collection.impl.cpm.engine.ProcessingUnit.processNext(ProcessingUnit.java:892)
> at org.apache.uima.collection.impl.cpm.engine.ProcessingUnit.run(ProcessingUnit.java:577)
>
> I understand that the annotation is in charge of the original CAS, in
> fact I want to clone it and put this new one in the new CAS/Jcas.
> What I missed?
>
> Thank in advance, regards,
> R.