我希望将自然语言解析库用于简单的聊天机器人。我可以得到词性标签,但我总是想知道。你用 POS 做什么。如果我知道演讲的部分,那又如何?
我想这将有助于回应。但是我可以使用什么数据结构和架构。
词性标注器为输入文本中的单词分配标签。例如,流行的 Penn Treebank 标记集有大约 40 个标签,例如“复数名词”、“比较形容词”、“过去时动词”等。标记器还解决了一些歧义。例如,许多英语单词形式既可以是名词也可以是动词,但在其他词的上下文中,它们的词性是明确的。因此,使用 POS 标签注释文本后,您可以回答以下问题:我有多少名词?有多少句子不包含动词?等。
对于聊天机器人,您显然需要的远不止这些。您需要弄清楚文本中的主语和宾语,以及它们所附加的动词(谓词);您需要解决照应(他或她指向哪个人),否定和量词的范围是什么(例如every,more than 3)等。
理想情况下,您需要将输入文本映射为某种逻辑表示(例如一阶逻辑),这将使您能够引入推理来确定两个句子的含义是否相同,或者是否存在蕴涵关系等。
虽然 POS 标记器会映射句子
Mary likes no man who owns a cat.
对这样的结构
Mary/NNP likes/VBZ no/DT man/NN who/WP owns/VBZ a/DT cat/NN ./.
你宁愿需要这样的东西:
SubClassOf(
ObjectIntersectionOf(
Class(:man)
ObjectSomeValuesFrom(
ObjectProperty(:own)
Class(:cat)
)
)
ObjectComplementOf(
ObjectSomeValuesFrom(
ObjectInverseOf(ObjectProperty(:like))
ObjectOneOf(
NamedIndividual(:Mary)
)
)
)
)
当然,虽然 POS 标记器的准确率和召回率接近 100%,但更复杂的自动处理性能会差很多。
一个很好的 NLP Java 库是LingPipe。然而,它并没有超越 POS 标记、分块和命名实体识别。
我将跳过很多细节并保持简单。词性标注可帮助您从句子中创建解析树。一旦你有了这个,你就会尝试尽可能明确地理解一个含义。此解析步骤的结果将极大地帮助您为您的聊天机器人构建合适的响应。
一旦有了词性标签,您就可以提取所有名词,例如,您可以大致了解某人正在谈论的事物或对象。
给你举个例子:
有人说“你可以打开一个新窗口。 ”当你有 POS 标签时,你知道它们不是在谈论罐头(如容器、罐子等,这在open的上下文中甚至是有意义的),而是一个窗口. 你也会知道open是一个动词。
有了这些信息,您的聊天机器人可以生成更好的回复,与开罐器等无关。
注意:您不需要解析器来获取 POS 标签。一个简单的词性标注器就足够了。解析器会为您提供更多信息(例如,主语是什么,句子的宾语是什么?)