从句子中提取信息

数据挖掘 Python nlp
2021-09-26 03:13:57

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

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

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

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

我试图依赖单词之间的依赖关系,但结果并不好。

关于我可以使用什么技术来解决这个问题的任何想法?

[更新]

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

User: my name is edwin.

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

4个回答

您可能会结合使用命名实体识别和句法分析 - 虽然Edwin这个词肯定是支持的,但想象一下名字是Edward Philip Martel的情况。NER 将每个单词检测为一个单独的实体(因此有 3 个不同的实体) - 因此,无论如何您都必须根据某些逻辑将它们串在一起。此外,在存在多个名称的情况下,消除歧义会变得更加困难(例如,John & Ramsey 在 Winterfell 用餐)。

这就是句子句法分析也有帮助的地方(假设最终用户输入了一个相对连贯和正确的句子——如果使用俚语和短文本形式,即使是斯坦福 NLP 也只能在一定程度上有所帮助)。

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

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

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

您应该使用命名实体识别,例如来自 NLTK。您可以在此处找到使用示例它非常适合您描述的案例。

这可以通过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 包装器,它很容易实现。检查这个 ipython 笔记本github 上的这个代码片段,了解 NER 的端到端实现。

使用 Python 编写的 NER 和 Intent Classification 检查 github 上的这个开源聊天机器人项目。他们有一个易于使用的培训 UI,您可以在其中训练您的机器人从句子中提取信息。

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