我是Ruta的初学者,我现在想掌握的想法是如何在UIMA环境(纯Java)中处理类变量/集合。我已经尝试按照documentation中给出的示例进行操作;但是Ruta规则既可以作为脚本文件在外部应用,也可以使用Ruta.apply(cas,rule)在“现场”应用。这些选项均不允许我使用例如文件词典或任何预定义的Java集合。您能给我任何提示/解决方案吗?

通常,我使用UIMA AE解析句子,然后在Ruta脚本中使用创建的注释基于其句法结构匹配特定类型的句子。因此,由于设置了POStag,因此我编写的Ruta规则相当简单,但体积很大。所以我想在Ruta内部获得一些灵活性。如果对此主题也有任何建议,我将不胜感激。

编辑:例如,我有一条规则考虑由AE(Stanford Parser)创建的一组POSTags。因此,为了匹配所需的句子结构,我将通过以下方式对其进行硬编码(我意识到这是最幼稚的方式):

String rutaSampleRule = "BLOCK(ForEach) Sentence{}{Document{-> Asyndeton} " + "<- {((Constituent.label==\"NN\" COMMA Constituent.label==\"NN\") |" + " (Constituent.label==\"NNP\" COMMA Constituent.label==\"NNP\") |" + " (Constituent.label==\"NNPS\" COMMA Constituent.label==\"NNPS\") |" + " (Constituent.label==\"NNS\" COMMA Constituent.label==\"NNS\"));};}";
Ruta.apply(cas, rutaSampleRule);


现在,我要声明的是声明一个此类POStag的集合(即NNS,NN),在Ruta中对其进行迭代并匹配相应的句子结构(此处为连续名词)。这将使我的规则更加灵活和实用。

第二种选择是使用词典而不是集合,但是我认为它们只能在Ruta内单独使用(与MARKFAST一起使用)(而不是纯Java);至少我找不到任何例子。

因此,总结一下我的问题:在简单的Ruta脚本(不引入任何新类型)中,是否有可能(以及如何做)在纯Java中使用外部定义的集合/词典?

希望我能更好地解释它。提前致谢。

编辑1:我通过弄清楚指南中的路径和example弄清楚了如何在纯Java内部使用词典。不过,我想知道如何使用配置参数将值分配给变量?

最佳答案

这应该可以解决问题(使用当前的主干进行测试):

String rutaSampleRule = "STRINGLIST posList;"
    + "Sentence{-> Asyndeton} <- {"
    + "c1:Constituent{CONTAINS(posList, c1.label)} COMMA c2:Constituent{c2.label == c1.label};"
    + "};";

List<String> posList = Arrays.asList(new String[] { "NN", "NNP", "NNPS", "NNS" });
Map<String, Object> additionalParams = new HashMap<>();
additionalParams.put(RutaEngine.PARAM_VAR_NAMES, new String[] { "posList" });
additionalParams.put(RutaEngine.PARAM_VAR_VALUES, new String[] { StringUtils.join(posList, ",") });
Ruta.apply(cas, rutaSampleRule, additionalParams);


一些评论:


规则中声明了一个STRINGLIST,并使用两个配置参数进行填充。
我重构了内联规则:不需要分离的组成规则元素(几个规则也可以这样做),不需要多个规则元素/规则。
现在,示例中不再需要块。我删除了
如果已发布的Ruta版本存在问题,则需要重写规则:使用字符串变量,而不是直接比较标签表达式的功能。
使用外部字典的方法将非常相似,例如具有INLIST条件。


免责声明:我是UIMA Ruta的开发人员

关于java - UIMA环境中的Ruta。在纯Java中使用预定义的集合/集和词典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41885359/

10-08 23:22