【发布时间】:2016-09-07 20:20:54
【问题描述】:
我正在尝试构建一个系统,该系统可以根据人工输入的书面文本识别各种命令和输入。我将从一个例子开始,让事情变得更干净。假设用户输入以下文本:
我的名字是 John Doe,我的年龄是 28 岁,我的地址是 巴克利街没有。 7 哈瓦那。 我喜欢 草莓和香草巧克力蛋糕。
基于一组预定义的标记(例如“姓名是”、“年龄是”、“地址是”、“我喜欢”),我想检测它们对应的 值(例如“John Doe”、“28”、“巴克利街……哈瓦那”、“巧克力蛋糕……香草”)。
我目前的尝试是通过一些正则表达式模式来解决这个问题:对于每个标记,我构建了一个正则表达式,大致如下:“如果你找到标记 X,则取其与 X、Y、Z 中的任何一个之间的所有文本你可以找到的标记”。那是在 标记之间提取文本,但是基于正则表达式构建所有内容将非常麻烦,尤其是当我开始考虑弯曲和小的变化时。
我在 NLP 方面没有太多经验,所以我不确定我应该从哪里开始寻找合适的解决方案。有哪些合适的方法/解决方案/库来解决这个问题?
【问题讨论】:
-
虽然我可能不太了解 NLP,但我可以 100% 肯定地告诉你:正则表达式 NOT 强大到足以生成可靠的文本解释。自然语言极其复杂且经常相互矛盾,甚至比正则表达式更强大的构造(如context-free grammars)也不足以处理自然语言文本。
-
您可以尝试根据标记拆分字符串。 regexformat.com/version_files/Rx5_ScrnSht01.jpg
-
然后您可以根据不同的标记进一步拆分结果,直到您可以制定。回顾:在主要标记上拆分,然后在次要标记上拆分(可能是主要标记的子集)。
-
好吧,我非常同意 Sebastian 的观点,即正则表达式不够强大,也不够适合这种情况。但是,我不确定从哪里开始选择替代方案。标记的问题在于,即使我执行一组“规则”,人们仍然可以写出诸如“我的名字是约翰,我的年龄是 28 岁”,“叫约翰,年龄 28”,“我被称为约翰”、“我叫约翰”等
-
你可以尝试类似RegEx JSON parser实现的方法,看看
Sub ParseJson()。你用标记替换一些元素字符序列和搭配,然后用另一个标记替换一些标记组合,循环重复,直到你得到一些顶级标记,这意味着成功识别。然后根据token的嵌套和结构提取必要的数据。
标签: regex nlp artificial-intelligence text-parsing information-extraction