我要检索由空格,符号和其他标点符号分隔的短语。
我花了很多时间试图找到最佳方法。
选项1.最简单的方法。
DECLARE T1, T2;
"cool rules" -> T1;
"cool rule" -> T2;
输入:" 123cool规则"。 结果:触发T1和T2;
选项2.使用WORDLIST和WORDTABLE。
让wordlist 1.txt包含2行:
cool rules
cool
提取代码如下
WORDLIST WList = '1.txt';
DECLARE W1;
Document{-> MARKFAST(W1, WList, true, 2)};
输入:"酷炫规则"。 结果:仅提取第一行。我想在这种情况下,不会触发相交的规则。
选项3.标记两个令牌的组合
DECLARE T1;
("cool" "rule") {-> T1};
输入:"酷炫规则酷规则1cool规则" 结果:2个注释:酷规则+ 1cool规则。提取速度损失10倍。
选项4. REGEXP匹配 也许有可能匹配这样的模式" cool \\ srule",但我不知道如何定义类型表达式。 SW * {REGEXP(" cool \\ srule") - > T1}不提供结果。
如您所见,我试图解决一项非常简单的任务,但尚未成功。选项3是一个非常好的方法,但提取过程会变慢10倍。
答案 0 :(得分:0)
如果要识别特定短语,则应使用字典查找,而不是直接规则。
因此,我建议使用MARKFAST选项2.但是,有两个问题:(a)仅支持最长匹配且(b)您要么需要更改分段(标记化),要么进行一些后期处理。
(a)这无法解决。如果确实需要,则应使用不同的字典注释器。参见例如UIMA邮件列表。
(b) MARKFAST适用于为每个最小部分自动创建的RutaBasic注释。由于默认的播种机,令牌" 1cool"由两个RutaBasics组成,一个用于NUM,一个用于SW。如果您不想更改预处理,则可以简单地应用修复该规则的规则,如
RETAINTYPE(WS);
ANY{-PARTOF(WS)} t:@T1{-> UNMARK(t)};
顺便说一下,选项4不会起作用,因为REGEXP条件检查匹配的注释SW的覆盖文本,该注释仅代表一个标记。如果您执行类似(SW+){REGEXP("cool\\srule")->T1}
的操作,那么如果之后有另一个SW,则规则将不匹配。
免责声明:我是UIMA Ruta的开发者