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