5

我在管道中使用了一些 UIMA 注释器。它运行以下任务:

  • 分词器
  • 分句器
  • 公报员
  • 我的注释器

问题是我不想将所有注释(令牌、句子、子令牌、时间、myAnnotations 等)写入磁盘,因为文件很快就会变得非常大。

我想删除所有注释并仅保留My Annotator创建的注释。

我正在使用下一个库:

  1. uimaFIT 2.0.0
  2. 清除TK 1.4.1
  3. 马文

我正在使用一个org.apache.uima.fit.pipeline.SimplePipeline

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())
);

我要做的是使用 Standford NLP 注释器(来自 ClearTK)并删除无用的注释。

我该怎么做呢?

据我所知,您可以将removeFromIndexes();方法 from 与 A​​nnotation 实例一起使用。

我是否需要创建 UIMA 处理器并将其添加到我的管道中?

4

3 回答 3

7

最后我创建了一个引擎来删除无用的注释:

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();
            }
        }
}

我正在删除所有注释,只留下mypackage.MyAnnotation注释

于 2014-01-01T23:11:10.000 回答
2

是的:在 MyAnnotator 和 XWriter 之间添加另一个注释器,该注释器删除除您之外的所有注释。

于 2013-12-31T12:30:06.630 回答
1

我使用 java 8 重写了德国 Attanasios 解决方案,并将其更改为过滤掉具有不同 annotationTypePrefix 的任何内容:

public void filterAnnotations(JCas jcas, String annotationTypePrefix) {

    JCasUtil.selectAll(jcas)
            .stream()
            .filter(t -> !t.getType().getName().startsWith(annotationTypePrefix))
            .forEach(TOP::removeFromIndexes);
}
于 2018-12-06T14:40:43.933 回答