在 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 的开发者)