我有一个RUTA脚本,其中所有句子都用Sentence注释注释,各种单词和短语都用自己的特定注释注释。这一切都按预期工作。
这些注释中的每一个都具有包含它的句子索引的特征。所以在一个人为的例子中并给出了文本
杰克和吉尔上山了。杰克跌倒了。
我有一个“向下”注释,我希望将句子索引设置为2,表示它在第二句中。我想的是以下内容,虽然我知道这不正确。
Sentence{CONTAINS(Down) -> Down.sentence_index = index
其中索引是句子的索引。这可能与RUTA有关吗?如果是这样,那么适当的脚本是什么。我可以在一个单独的分析引擎中执行此操作,并且过去已经这样做了,但我希望用ruta脚本替换其中一些。
感谢,
尼克
答案 0 :(得分:2)
有几种方法可以在UIMA Ruta中表达这一点。我的第一个猜测是:
// just to have an executable example
DECLARE Sentence;
DECLARE Annotation Down (INT sentence_index);
((# PERIOD){-> Sentence})+;
"down" -> Down;
// the acutal rule with a helper variable
INT index;
Sentence{CONTAINS(Down), CURRENTCOUNT(Sentence, index)} ->
{Down{-> Down.sentence_index = index};};
规则匹配包含向下注释的所有句子。此外,CURRENTCOUNT将Sentence注释计数到匹配位置,并将值存储在变量索引中。然后,内联规则(由第一个" - >"表示)匹配匹配句子中的所有Down注释,并将变量的值分配给匹配的Down注释的特征。根据您是否要以0或1开头,您需要增加指定的值:
... Down.sentence_index = (index+1)};};
条件CURRENTCOUNT也可以接受最小值和最大值,以便像真实条件一样行事。它真的很古老,所以我不知道它如何扩展到大型文档。
这是另一个例子,但这次没有CURRENTCOUNT条件,并且在Sentence注释中存储索引:
DECLARE Annotation Sentence (INT index);
DECLARE Annotation Down (INT sentence_index);
INT index;
(# PERIOD){-> Sentence, ASSIGN(index, (index + 1)), Sentence.index = index};
PERIOD (# PERIOD){-> Sentence, ASSIGN(index, (index + 1)), Sentence.index = index};
"down" -> Down;
Sentence{CONTAINS(Down) -> ASSIGN(index, Sentence.index)}
-> {Down{-> Down.sentence_index = index};};
请注意,在第一个示例中创建Sentence注释的规则不能使用,因为它只使用一个规则匹配,并且其操作应用于匹配的片段。第二个示例中的规则导致许多规则匹配,从而在处理下一个规则匹配之前应用操作。不同匹配范围的feautre值之间的复制并不是很好,但有时可能会有所改进。
如果您已经有Sentence注释,则可以使用以下内容分配索引:
Sentence{-> ASSIGN(index, (index + 1)), Sentence.index = index};
使用UIMA Ruta 2.2.1-SNAPSHOT测试了实例。
(我是UIMA Ruta的开发人员)