I'm using some UIMA annotators in a pipeline. It run tasks like:
The problem is that I don't want to write ALL the annotations (Token, Sentence, SubToken, Time, myAnnotations, etc..) to the disk because the files gets very large quicky.
I want to remove all the annotations and keep only the created by My Annotator.
I'm working with the next libraries:
And I'm using a org.apache.uima.fit.pipeline.SimplePipeline
with:
SimplePipeline.runPipeline(
UriCollectionReader.getCollectionReaderFromDirectory(filesDirectory), //directory with text files
UriToDocumentTextAnnotator.getDescription(),
StanfordCoreNLPAnnotator.getDescription(),//stanford tokenize, ssplit, pos, lemma, ner, parse, dcoref
AnalysisEngineFactory.createEngineDescription(//
XWriter.class,
XWriter.PARAM_OUTPUT_DIRECTORY_NAME, outputDirectory,
XWriter.PARAM_FILE_NAMER_CLASS_NAME, ViewURIFileNamer.class.getName())
);
What I'm trying to do is to use the Standford NLP annotator(from ClearTK) and remove the useless annotation.
How do I do this?
From what I know, you can use the removeFromIndexes();
method from with an Annotation instance.
Do I need to create an UIMA processor and add it to my pipeline?
Finally I created an Engine to remove the useless annotation:
public class AnnotationRemover extends JCasAnnotator_ImplBase {
public static AnalysisEngineDescription getDescription() throws ResourceInitializationException {
return AnalysisEngineFactory.createEngineDescription(AnnotationRemover.class);
}
public void initialize(UimaContext context) throws ResourceInitializationException {
super.initialize(context);
}
public void process(JCas jCas) throws AnalysisEngineProcessException {
List<TOP> tops = new ArrayList<TOP>(JCasUtil.selectAll(jCas));
for (TOP t : tops) {
if (!t.getType().getName().equals("mypackage.MyAnnotation"))
t.removeFromIndexes();
}
}
}
I'm removing all the annotations leaving only the mypackage.MyAnnotation annotations
Yes: between MyAnnotator and XWriter add another annotator that removes all annotation but yours.
I rewrote German Attanasios solution using java 8 and changed it to filter out anything with a different annotationTypePrefix:
public void filterAnnotations(JCas jcas, String annotationTypePrefix) {
JCasUtil.selectAll(jcas)
.stream()
.filter(t -> !t.getType().getName().startsWith(annotationTypePrefix))
.forEach(TOP::removeFromIndexes);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With