2

InputString:一名士兵可能有瘀伤、伤口、标记、脱臼或其他伤害他的伤病。

ExpectedOutput :
瘀伤
伤口
标记
脱臼
受伤

广义模式尝试

       ".[\s]?(\w+?)"+ // 瘀伤。
      "(?:(\s)?,(\s)?(\w+?))*"+ // 伤口标记位错
      "[\s]?(?:or|and) 其他 (\w+)."; // 伤害

该模式应该能够匹配其他输入字符串,例如:一名士兵可能有瘀伤或其他伤害他的伤害。

在尝试上面的广义模式时,输出是: bruises dislocations Injuries

“(?:(\s)?,(\s)?(\w+?))*”的捕获组有问题。捕获组又出现了一次..但它只返回“错位”。“标记”和“错位”:被吞噬。

您能否建议正确的模式应该是什么,错误在哪里?这个问题最接近这个问题,但该解决方案没有帮助。

谢谢。

4

3 回答 3

0

正则表达式不适合(自然)语言处理。使用正则表达式,您只能匹配定义明确的模式。您真的应该放弃使用正则表达式执行此操作的想法。

您可能想开始一个新问题,在其中指定您用于执行此任务的编程语言并在此处请求指针。

编辑

PSpeed发布了一个指向第三方库Gate的有前途的链接,该库能够执行许多语言处理任务。它是用 Java 编写的。我自己没有使用过它,但看看从事它的人/机构,它似乎很可靠。

于 2010-02-18T09:42:19.097 回答
0

有效的模式是: \w+(?:\s*,\s*\w+)* 然后手动分离 CSV Java Regex 没有其他方法可以做到这一点。

理想情况下,Java 正则表达式不适合 NLP。文本挖掘的一个有用工具是:gate.ac.uk
感谢 Bart K. 和 PSpeed。

于 2010-02-18T14:51:02.617 回答
0

当捕获组使用量词 [ie: (foo)*] 进行注释时,您只会得到最后一个匹配项。如果你想获得所有这些,那么你需要在捕获中进行量化,然后你将不得不手动解析出这些值。尽管我是 regex 的忠实粉丝,但出于多种原因,我认为它在这里不合适……即使你最终没有做 NLP。

如何修复: (?:(\s)?,(\s)?(\w+?))*

好吧,在这种情况下,量词基本上涵盖了整个正则表达式,您不妨使用 Matcher.find() 来逐步完成每个匹配项。另外,我很好奇为什么你有空白的捕获组。如果您要做的只是找到一组以逗号分隔的单词,那么就像: \w+(?:\s*,\s*\w+)* 然后不要打扰捕获组,只需拆分整个匹配。

对于任何更复杂的 re: NLP,GATE 是一个非常强大的工具。学习曲线有时很陡峭,但你有整个行业的科学人可以借鉴: http: //gate.ac.uk/

于 2010-02-18T19:03:25.943 回答