从句子中提取信息


11

我正在创建一个简单的聊天机器人。我想从用户响应中获取信息。一个示例场景:

Bot : Hi, what is your name?
User: My name is Edwin.

我希望从句子中提取出埃德温的名字。但是,用户可以通过不同的方式进行响应,例如

User: Edwin is my name.
User: I am Edwin.
User: Edwin. 

我试图依靠单词之间的依赖关系,但结果效果不佳。

关于可以使用哪种技术来解决此问题的任何想法?

[更新]

我使用命名实体识别以及部分语音标记器和解析器进行了测试。我发现大多数模型都是以某种方式训练的,即人名或专有名词的实体的第一个字符必须为大写。这对于普通文档可能是正确的,但是对于聊天机器人则无关紧要。例如

User: my name is edwin.

大多数NER未能意识到这一点。


这就解释了现代聊天机器人是如何构建的,但是我不会这么简单。您可以通过搜索“问题答案”来了解更多信息。
Emre

我喜欢人们问问题和收到答案的方式,将答案标记为可接受的答案:P
chewpakabra

Answers:


7

您可以将命名实体识别和语法分析结合使用-当Edwin这个词肯定会受到支持时,请想象一下这样的情况,名称为Edward Philip Martel。NER将每个单词检测为一个单独的实体(因此有3个不同的实体)-因此,您仍然必须根据某种逻辑将它们串联在一起。此外,在存在多个名称的情况下,很难消除歧义(例如John和Ramsey在Winterfell用餐)。

在这里,对句子语法的分析也将有所帮助(假设最终用户输入了相对连贯且正确的句子-如果使用语和简短形式的文本,即使是Stanford NLP也只能在一定程度上提供帮助)。

以下示例是利用语法分析/解析和NER的一种方法-

 1. User: Edwin is my name.
 2. User: I am Edwin.
 3. User: My name is Edwin.

在每种情况下(通常也是如此),实体名称(专有名词/名词)与动词紧密相关。因此,如果您首先解析句子以确定动词,然后将NER应用于周围的(+/- 1或2)个单词,则可能会有相对不错的方法来解决问题。该解决方案将主要取决于您创建的用于识别NER的语法规则以及动词周围的窗口。


2
您可能会实现“非确定性有限自动机”,其中每个句子都是模式接受的响应。一些语法是在这样的东西上实现的。(NLP /语法)。如果你需要如何做到这一点,看看框架stanfordnlp.github.io/CoreNLP
Intruso


4

这可以通过CRF轻松完成。您可以使用BIO编码来标记句子。然后将其传递给CRF。您只需创建一些加标签的句子以进行培训,如下所示,

 I am Edwin.
 O O  B-NAME

 You can call me Alfred
 O   O    O    O B-NAME

 My name is  Edwin   thomas
 O  O     O  B-NAME  I-NAME

CRFsuiteCRF ++是一些好的实现。CRFsuite有一个名为pycrfsuite的python包装器,非常容易实现。在github上查看此ipython笔记本此代码段以获取NER的端到端实现。

请使用NER和用python编写的意图分类在github上检查此开源聊天机器人项目。他们具有易于使用的培训用户界面,您可以在其中培训机器人以从句子中提取信息。


0

为了高精度地执行此类任务,建议您在word2vec的帮助下使用词嵌入构建LSTM模型。如果句子中已经存在一组单词,则LSTM可以帮助从句子中检索信息并预测下一个字符或单词。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.