我正在尝试编写一个RegEx模式,该模式将提取自然语言短语的关键短语,以便构建查询并返回数据。到目前为止,一切都进展顺利,直到我遇到了一个问题,试图从主张中有效地拉出主要主题。例如:
让我们假设我的短语是“显示我上个月关闭的所有门票”。我可以解析构建查询所需的每个元素,但是如果我尝试“向我显示上周关闭的所有票证和请求”这样的内容,那么这一切都会崩溃。
我很难获得这两个科目(门票和请求)。理想情况下,它们会被带入单独的命名组,例如度量:票证,请求和逻辑:和。需要注意的是,某些度量可能包含空格,因此必须对其进行说明。
到目前为止我只能想出这个:
(\S+\s?)+(?=and|or)
当使用"#sla met and tickets"
的测试短语时,它只会拉#sla met。
我从昨天起才开始使用正则表达式,所以任何提示都会非常有用!
答案 0 :(得分:1)
快速回答解决问题的一个非常狭窄的部分:
(.+)((and|or)(.+))
这将获取与and
或or
连接的任意数量的字词。它不会为您单独捕获每个字词,但您可以在split
和and
上or
结果。当然,您可以使用.+
获得相同的结果。
你看到了问题吗? 正则表达式不允许您解析自然语言。你正试图用勺子穿过一座山。我实际上不得不删除并重新创建我的答案,因为我花了五分钟试图让捕获工作最终放弃。这就是正则表达式对于这项任务的不足。
如果你真的想要解析自然语言,你需要开始阅读研究论文。其中很多。
编辑:这是一个正则表达式,可以找到多个匹配项(不是一个匹配多个组的匹配项),每个匹配项都有一个捕获组作为项目。
(?:\s+(?:and|or)\s+)?(\S+)
免责声明:有很多方法可以欺骗这个正则表达式。我现在可以想到三到四个,但肯定还有更多。