java - 无法使用通过 Ruta DECLARE 声明的变量

标签 java uima ruta

我正在尝试编写一些 Ruta 规则来捕获事物之间的“is-a”关系。我有一个 Relation 类,其中包含实体 1 和实体 2 属性,它们指向关系中涉及的两个事物。

我的理解是,我必须使用已声明的注释“捕获”这两个元素,以便稍后将它们设置为关系注释的属性。

所以我的规则是这样的:

 DECLARE Token Thing1;
 DECLARE Token Thing2;

但不知何故,当我尝试将 token 标记为 Thing1 或 Thing2 时,Ruta 告诉我它无法访问该类型。

这是一个说明问题的测试

@Test
public void test__Ruta__BUG__DeclareNotWorking() throws UIMAException, IOException, URISyntaxException {
    final class RulesRunner {
        public void applyRules(JCas cas, String[] rules) throws AnalysisEngineProcessException, InvalidXMLException, ResourceInitializationException, ResourceConfigurationException, IOException, URISyntaxException {
            for (String aRule: rules) {
                Ruta.apply(cas.getCas(), aRule);
            }
        }
    }

    RulesRunner runner = new RulesRunner();

    JCas cas = JCasFactory.createJCas();
    cas.setDocumentText("A cat is a kind of mammal.");

    // Tokenize the string
    String[] rules = new String[] {
            "ANY{REGEXP(\"[a-zA-Z0-9]+\") -> Token};",
            "ANY{REGEXP(\"[^ a-zA-Z0-9]+\") -> Token};"
    };
    runner.applyRules(cas, rules);

    // Capture the "is-a" relation between 'cat' and 'mammal' and 'car' and 'vehicle'
    rules = new String[] {
        "DECLARE Token Thing1; \n" +
           "DECLARE Token Thing2; \n" +
           // This results in: 'not able to resolve type: Thing1'
           "Token{ -> MARK(Thing1)} " +
           "Token{REGEXP(\"is\") -> RutaNevermind}  " +
           "Token{REGEXP(\"a\") -> RutaNevermind}  " +
           "Token{REGEXP(\"kind\") -> RutaNevermind}  " +
           "Token{REGEXP(\"of\") -> RutaNevermind}  " +
           "Token{ -> MARK(Relation, 1, 6)}  " +
           ";" 
    };
    runner.applyRules(cas, rules);

    for (Relation aRelation: JCasUtil.select(cas, Relation.class)) {
        System.out.println("Got Relation="+aRelation.getCoveredText());
    }
}

请注意,我还尝试使用以下声明:

DECLARE Thing1;
DECLARE Thing2;

DECLARE Thing1 Token;
DECLARE Thing2 Token;

DECLARE Token thing1; // Obviously, changed the MARK statement accordingly
DECLARE Token thing2;

最佳答案

尚未找到使空操作起作用的方法,但我确实找到了解决方法。基本上,我有一个注释类 RutaNull,每当我需要使用空操作时,我都会使用 MARK(RutaNull)。但如果有人知道如何使空操作发挥作用,我仍然很想听听。

关于java - 无法使用通过 Ruta DECLARE 声明的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43265485/

相关文章:

java - Java的Matcher.replaceAll如何获取内部匹配结果?

java - 如何从 NetBeans IDE 外部运行 .jar 可执行 java 文件?

java - 注释器依赖项 : UIMA Type Capabilities?

nlp - 准确度:UIMA的ANNIE,斯坦福大学,OpenNLP

machine-learning - 训练数据集的局限性是什么 -Uima Ruta

uima - 标记文档中的第一句话

java - Chrome 放弃 NPAPI 后启动 webstart 的替代方法?

java - 如果ID是IDENTITY COLUMN,如何删除或更改ID?

java - UIMA 用于结构化数据

apache - 如何使用 Apache UIMA Ruta 从两个子字符串中提取 ID 和日期?