3

我有一个 RUTA 脚本,其中所有句子都用句子注释进行了注释,并且各种单词和短语都用它们自己的特定注释进行了注释。这一切都按预期工作。

这些注释中的每一个都具有包含它的句子索引的特征。所以在一个人为的例子中并给出文本

杰克和吉尔上了山。杰克摔倒了。

我有一个“向下”注释,我想将句子索引设置为 2,表示它在第二个句子中。我在想类似下面的事情,虽然我知道那是不正确的。

Sentence{CONTAINS(Down) -> Down.sentence_index = index

其中 index 是句子的索引。使用 RUTA 可以做到这一点吗?如果是这样,什么是合适的脚本。我可以在一个单独的分析引擎中执行此操作,并且过去已经这样做了,但我希望用 ruta 脚本替换其中的一些。

谢谢,

缺口

4

1 回答 1

3

在 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};};

该规则匹配所有包含 Down 注释的句子。此外,CURRENTCOUNT 将句子注释计数到匹配的位置,并将值存储在变量索引中。然后,内联规则(由第一个“->”表示)匹配匹配句子中的所有 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{-> ASSIGN(index, (index + 1)), Sentence.index = index};

示例已使用 UIMA Ruta 2.2.1-SNAPSHOT 进行了测试。

(我是 UIMA Ruta 的开发者)

于 2014-07-18T10:49:09.440 回答