我是Ruta的初学者,我现在想要掌握的想法是如何在UIMA环境(普通Java)中处理类变量/集合。我试过按照documentation给出的例子;但是Ruta规则既可以作为脚本文件在外部应用,也可以在现场使用#34;使用Ruta.apply(cas,rule)。这两个选项都不允许我使用,例如,文件词典或任何预定义的Java集合。你能不能给我一些提示/解决方案来解决我的问题?
通常,我使用UIMA AE来解析句子,然后在Ruta脚本中使用创建的注释,根据句法结构匹配特定类型的句子。因此,我写的Ruta规则相当简单,但由于POStags设置而笨重。所以我想在Ruta内部获得一些灵活性。如果对这个topis有任何建议,我将不胜感激。
编辑:例如,我有一个规则,它考虑由AE(斯坦福分析师)创建的一组POSTag。因此,为了匹配所需的句子结构,我会用以下方式对其进行硬编码(我意识到它是最天真的方式):
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);
现在,我想要的是声明这样的POStags(即NNS,NN)的集合,在Ruta内迭代它并匹配相应的句子结构(这里是连续的名词)。这将使我的规则更加灵活和实用。
第二种选择是使用词典而不是收集,但我认为它们只能在Ruta中使用(使用MARKFAST)(不是普通的Java);至少我找不到任何例子。
所以,总结一下我的问题:在简单的Ruta脚本(不引入任何新类型)中,是否可以(以及如何)在普通Java中使用外部定义的集合/词典?< /强>
我希望,我能够以更好的方式解释它。提前谢谢。
编辑1:我想通过使用路径和指南中的example来了解如何在普通Java中使用词典。不过,我想知道如何使用配置参数将值分配给变量?
答案 0 :(得分:1)
这应该可以解决问题(使用当前主干测试):
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);
一些意见:
免责声明:我是UIMA Ruta的开发者