UIMA环境中的Ruta。在纯Java

时间:2017-01-27 00:28:28

标签: java uima ruta

我是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中使用词典。不过,我想知道如何使用配置参数将值分配给变量?

1 个答案:

答案 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);

一些意见:

  • STRINGLIST在规则中声明,并使用两个配置参数填充。
  • 我重构了内联规则:不需要析取组合规则元素(多个规则会做同样的事情),不需要多个规则元素/规则。
  • 现在不再需要块了。我删除了它。
  • 如果发布的Ruta版本存在问题,则需要重写规则:使用字符串变量而不是直接比较标签表达式的功能。
  • 使用外部字典的方法非常相似,例如,具有INLIST条件。

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