6

UIMA 中是否有一种方法可以像在 CAS 调试器 GUI 中那样访问令牌中的注释?您当然可以访问索引存储库中的所有注释,但我想循环标记,并获取每个标记的所有关联注释。

原因很简单,我想检查一些注释并丢弃其他注释,这样更容易。任何帮助表示赞赏:)

4

3 回答 3

8

我是 uimaFIT 开发人员。

如果您想在另一个注释的边界内查找所有注释,您可能更喜欢更短更快的变体

JCasUtil.selectCovered(referenceAnnotation, <T extends ANNOTATION>);

请注意,创建具有所需偏移量的“虚拟”注释然后在其边界内搜索并不是一个好主意,因为这会立即在 CAS 中分配内存,除非收集完整的 CAS,否则不会被垃圾收集。

于 2013-06-22T08:56:02.127 回答
4

经过搜索和询问 cTAKES(Apache 临床文本分析和知识提取系统)的开发人员。您可以使用http://code.google.com/p/uimafit/上的以下库“uimafit” 。可以使用以下代码

List list = JCasUtil.selectCovered(jcas, <T extends Annotation>, startIndex, endIndex);

这将返回 2 个索引之间的所有值。

希望这会有所帮助

于 2013-02-06T12:33:51.287 回答
3

如果你不想使用 uimaFIT,你可以创建一个过滤迭代器来遍历感兴趣的注解。UIMA 参考文档在这里:UIMA 参考文档

我最近在一些代码中使用这种方法来查找包含正则表达式注释的句子注释(这种方法对于我们的项目是可以接受的,因为所有正则表达式匹配都比文档中的句子短,并且每个句子只有一个正则表达式匹配。显然,根据索引规则,你的里程可能会有所不同。如果你害怕碰到另一个shorterAnnotationType,将内部代码放入一个while循环中):

static ArrayList<annotationsPair> process(Annotation shorterAnnotationType, 
        Annotation longerAnnotationType, JCas aJCas){

    ArrayList<annotationsPair> annotationsList = new ArrayList<annotationsPair>();

    FSIterator it = aJCas.getAnnotationIndex().iterator();
    FSTypeConstraint constraint = aJCas.getConstraintFactory().createTypeConstraint();
    constraint.add(shorterAnnotationType.getType());
    constraint.add(longerAnnotationType.getType());
    it = aJCas.createFilteredIterator(it, constraint);

    Annotation a = null;
    int shorterBegin = -1;
    int shorterEnd = -1;
    it.moveTo((shorterAnnotationType));
    while (it.isValid()) {
        a = (Annotation) it.get();
        if (a.getClass() == shorterAnnotationType.getClass()){
            shorterBegin = a.getBegin();
            shorterEnd = a.getEnd();
            System.out.println("Target annotation from " + shorterBegin 
                    + " to " + shorterEnd);
            //because assume that sentence type is longer than other type, 
            //the sentence gets indexed prior
            it.moveToPrevious(); 
            if(it.isValid()){
                Annotation prevAnnotation = (Annotation) it.get();
                if (prevAnnotation.getClass() == longerAnnotationType.getClass()){
                    int sentBegin = prevAnnotation.getBegin();
                    int sentEnd = prevAnnotation.getEnd();
                    System.out.println("found annotation [" + prevAnnotation.getCoveredText()
                            + "] location: " + sentBegin + ", " + sentEnd);
                    annotationsPair pair = new annotationsPair(a, prevAnnotation);
                    annotationsList.add(pair);
                }
                //return to where you started
                it.moveToNext(); //will not invalidate iter because just came from next
            }
        }
        it.moveToNext();
    }

    return annotationsList;

}

希望这可以帮助!免责声明:我是 UIMA 的新手。

于 2014-04-30T13:17:01.987 回答