InputString :士兵可能有瘀伤,伤痕,伤痕,脱臼或其他伤害他的伤害。
ExpectedOutput :
瘀伤
伤口
标记
位错
损伤
广播模式尝试:
".[\s]?(\w+?)"+ // bruises. "(?:(\s)?,(\s)?(\w+?))*"+ // wounds marks dislocations "[\s]?(?:or|and) other (\w+)."; // Injuries
该模式应该能够匹配其他输入字符串,例如:士兵可能有伤痕或其他伤害他的伤害。
在尝试上面的通用模式时,输出为: 瘀伤 错位 伤
“(?:( \ s)?,(\ s)?(\ w +?))*”的捕获组有问题。捕获组还有一个出现..但它只返回“脱臼”。 “标记”和“错位:被吞噬。
请问你应该建议什么是正确的模式,错误在哪里? 这个问题最接近question,但该解决方案没有帮助。
感谢。
答案 0 :(得分:0)
正则表达式不适合(自然)语言处理。使用正则表达式,您只能匹配定义良好的模式。你应该真的,真的放弃用正则表达式做这个的想法。
您可能想要开始一个新问题,您可以在其中指定用于执行此任务的编程语言,并在那里询问指针。
修改强>
PSpeed发布了一个有希望的链接到第三方库Gate,它可以执行许多语言处理任务。它是用Java编写的。我自己并没有使用它,但看着正在研究它的人/机构,看起来非常可靠。
答案 1 :(得分:0)
有效的模式是:\ w +(?:\ s *,\ s * \ w +)*然后手动分离CSV 使用Java Regex没有其他方法可以做到这一点。
理想情况下,Java正则表达式不适合NLP。一个有用的文本挖掘工具是:gate.ac.uk
感谢Bart K.和PSpeed。
答案 2 :(得分:0)
当捕获组使用量词[即:(foo)*]进行注释时,您将只获得最后一场比赛。如果你想获得所有这些,那么你需要在捕获内部量化,然后你必须手动解析值。作为我的正则表达者的忠实粉丝,我不认为这在任何原因上是合适的......即使你最终没有做NLP。
如何解决:(?:( \ s)?,(\ s)?(\ w +?))*
好吧,量词在这种情况下基本上涵盖了整个正则表达式,你也可以使用Matcher.find()来逐步完成每个匹配。另外,我很好奇为什么你有空白的捕获组。如果你要做的就是找到一个以逗号分隔的单词集,那就是:\ w +(?:\ s *,\ s * \ w +)*然后不要打扰捕获组,只是拆分整个匹配。
对于任何更复杂的问题:NLP,GATE是一个非常强大的工具。学习曲线有时很陡峭,但你有一整个科学行业的人可以借鉴:http://gate.ac.uk/