1

我正在使用 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 中是否有办法将第一个匹配注释的特征与同一规则内最后一个匹配注释的特征进行比较?

4

1 回答 1

0

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

然而,在 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 的开发人员

于 2016-10-01T17:21:02.337 回答