Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用与声明一起声明的变量_Java_Uima_Ruta - Fatal编程技术网

Java 无法使用与声明一起声明的变量

Java 无法使用与声明一起声明的变量,java,uima,ruta,Java,Uima,Ruta,我试图写一些Ruta规则来捕捉事物之间的“是-是”关系。我有一个包含entity1和entity2属性的关系类,它们指向关系中涉及的两个方面 我的理解是,我必须用声明的注释“捕获”这两个元素,以便以后可以将它们设置为关系注释的属性 所以我的规则是: DECLARE Token Thing1; DECLARE Token Thing2; 但不知何故,当我试图将令牌标记为Thing1或Thing2时,Ruta告诉我它无法访问该类型 下面是一个说明问题的测试 @Test public void

我试图写一些Ruta规则来捕捉事物之间的“是-是”关系。我有一个包含entity1和entity2属性的关系类,它们指向关系中涉及的两个方面

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

所以我的规则是:

 DECLARE Token Thing1;
 DECLARE Token Thing2;
但不知何故,当我试图将令牌标记为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;


我还没有找到一种让空动作有效的方法,但我确实找到了一个解决方法。基本上,我有一个注释类RutaNull,当我需要使用空操作时,我将使用MARK(RutaNull)。但是,如果有人对如何让空动作起作用有了答案,我还是很想听听。

还没有找到让空动作起作用的方法,但我确实找到了解决办法。基本上,我有一个注释类RutaNull,当我需要使用空操作时,我将使用MARK(RutaNull)。但是,如果有人对如何使空动作有效的答案,我还是很乐意听到。

< P> >这里有几件事要考虑:

DECLARE不声明变量,而是声明UIMA类型。类型的变量声明如下:
typemytypevar。我想你的问题不是指变量,而是指类型

创建CAS后,UIMA中CAS的类型系统是静态的。在执行规则时,当分析引擎处理CAS时,ruta规则不能通过DECLARE语句对其进行扩展。Ruta中有单独的功能来创建Ruta脚本的类型系统描述,该脚本包含每个声明的类型描述。通常,这是在“编译”级别上完成的,例如,通过rutamaven插件或rutaworkbench。如果需要像在问题的代码中那样以编程方式使用它,可以手动添加类型,也可以使用RutaDescriptorFactory。下面是它的一些工作原理。如果要使用uimaFIT的工厂创建CA,只需将创建的TypeSystemDescription用作参数即可

规则元素上不需要操作。您可以简单地忽略它们,但还需要删除箭头
->
。您还可以编写规则,而无需执行单个操作,例如,在Ruta工作台的查询视图中将其用作查询语句

DECLARE语句声明新类型。您可以为新类型提供可选的父类型,这当然是新类型的超级类型。如果
Thing1
是您的新类型,则
声明Thing1令牌无效。但是
声明令牌内容1是<代码>声明内容1
将超级类型设置为
uima.tcas.Annotation
。我不建议使用令牌作为超级类型

问题中未给出类型
关系的定义。这种类型已经存在吗?如果不是,则与其他类型相同:您需要将其包括在CAS的类型系统中

可能是最重要的注意事项:您甚至不需要声明一个新类型,这可能会从整体上避免您的问题。有几种方法可以用其他注释填充注释的特征。ruta文档部分有几个示例,例如创建、收集、隐式操作、变量、标签表达式。它主要取决于
关系的定义和实际用例。在您的示例中,规则可能如下所示(关系是您的类型之一,没有转义引号):

或者

Token "is" "a" "kind" "of" Token{-> GATHER(Relation,1,6,"source"=1,"target"=6)};
您可能应该通过使用不同的匹配条件、FILTERTYPE或-PARTOF来优化此规则


免责声明:我是UIMA RUTA的开发人员/P> < P> >这里有几件事要考虑:

DECLARE不声明变量,而是声明UIMA类型。类型的变量声明如下:
typemytypevar。我想你的问题不是指变量,而是指类型

创建CAS后,UIMA中CAS的类型系统是静态的。在执行规则时,当分析引擎处理CAS时,ruta规则不能通过DECLARE语句对其进行扩展。Ruta中有单独的功能来创建Ruta脚本的类型系统描述,该脚本包含每个声明的类型描述。通常,这是在“编译”级别上完成的,例如,通过rutamaven插件或rutaworkbench。如果需要像在问题的代码中那样以编程方式使用它,可以手动添加类型,也可以使用RutaDescriptorFactory。下面是它的一些工作原理。如果要使用uimaFIT的工厂创建CA,只需将创建的TypeSystemDescription用作参数即可

规则元素上不需要操作。您可以简单地忽略它们,但还需要删除箭头
->
。您还可以编写规则,而无需执行单个操作,例如,在Ruta工作台的查询视图中将其用作查询语句

DECLARE语句声明新类型。您可以为新类型提供可选的父类型,这当然是新类型的超级类型。如果
Thing1
是您的新类型,则
声明Thing1令牌无效。但是
声明令牌内容1是<代码>声明内容1
将超级类型设置为
uima.tcas.Annotation
。我不建议使用令牌作为超级类型

问题中未给出类型
关系的定义。这种类型已经存在吗?如果不是,则与其他类型相同:您需要将其包括在CAS的类型系统中

也许是最重要的一点:你应该
DECLARE Token thing1; // Obviously, changed the MARK statement accordingly
DECLARE Token thing2;
//DECLARE Relation (Token source, Token target); just a comment how the Relation type is assumed to be defined
(t1:Token "is" "a" "kind" "of" t2:Token){-> Relation, Relation.source=t1, Relation.target=t2};
Token "is" "a" "kind" "of" Token{-> GATHER(Relation,1,6,"source"=1,"target"=6)};