如何比较 Ruta 规则中两个不同注释的特征?

How to compare features of two different annotations within a Ruta rule?

我正在使用 UIMA Ruta 处理文本并希望删除重复的注释。如果某些特征(例如名称)具有相同的值,我认为注释是重复的。我尝试过不同的方法但没有成功,但我希望以下示例能够让您了解我正在尝试做的事情:

STRING nameVal;
Person {-> GETFEATURE("name", nameVal)}  
ANY+? 
Person.name == nameVal {-> UNMARK(Person)};

我也试过这个变体:

STRING nameVal;
Person {-> GETFEATURE("name", nameVal)}  
ANY+? 
Person {-> UNMARK(Person)} <- { Person.name == nameVal; };

如果我将变量 nameVal 替换为文字(见下一个示例),则规则运行良好并且似乎接近我想要的,但不完全是。

Person
ANY+? 
Person.name == "Mustermann" {-> UNMARK(Person)};

我认为,问题在于,在评估比较时,全局变量尚未初始化。 Ruta 中有没有办法将同一规则中第一个匹配的注释的特征与最后一个匹配的注释的特征进行比较?

是的,问题是在评估所有条件后,当完整规则匹配时执行操作。您需要一个将特征值分配给变量的操作,但您需要一个条件来将变量与另一个特征进行比较。

然而,在 Ruta 中有很多方法可以解决这个问题,例如,使用更多规则、BLOCK 或操作内联规则。最好的方式是标签表达。 UIMA Ruta 2.5.0 让我们的生活更轻松。你可以这样写:

p1:Person # p2:Person{p1.name == p2.name -> UNMARK(Person)};

p1:Person # Person.name==p1.name{ -> UNMARK(Person)};

如果使用 STRINGLIST,您可能会编写更快的规则:如果值包含在列表中,则取消标记注释,如果不包含,则将值添加到列表中。

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