Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用NLP分析聊天对话中的问题_Python_Nlp_Chat_Bots - Fatal编程技术网

如何在python中使用NLP分析聊天对话中的问题

如何在python中使用NLP分析聊天对话中的问题,python,nlp,chat,bots,Python,Nlp,Chat,Bots,我已经用python编写了一个连接到discord的聊天机器人,它能够完成一些任务。任务之一是查询特定计算机游戏的资源列表,并返回所查询资源的详细位置。 现在,我想尽可能地将这些功能集成到聊天中。所以我想我可以使用NLP技术 举个例子: 用户1想知道在哪里可以找到资源木材。因此,他/她在discord聊天中问道:我在哪里可以找到木头 我的程序现在应该能够将这个问题识别为资源位置的有效查询,并用资源木材的位置进行响应 这可能涉及几个步骤: 确定事实上提出了一个问题 确定请求的资源的名称 ??? 我

我已经用python编写了一个连接到discord的聊天机器人,它能够完成一些任务。任务之一是查询特定计算机游戏的资源列表,并返回所查询资源的详细位置。 现在,我想尽可能地将这些功能集成到聊天中。所以我想我可以使用NLP技术

举个例子: 用户1想知道在哪里可以找到资源木材。因此,他/她在discord聊天中问道:我在哪里可以找到木头

我的程序现在应该能够将这个问题识别为资源位置的有效查询,并用资源木材的位置进行响应

这可能涉及几个步骤:

确定事实上提出了一个问题 确定请求的资源的名称 ??? 我不是编程新手,但是我是NLP新手。此外,我还是深入学习的初学者/已经使用tensorflow/keras开发了RNN模型

对于这个项目,我发现了nltk和spaCy,它们都是用于NLP的python模块。我已经了解到文本分析由几个不同的工作组成,并不是所有的工作都对我的项目感兴趣。但是,标记化和词性标记似乎都很有趣。但不知何故,我正在努力寻找一种可行的方法来完成这项任务。它已经从如何识别短信是否是一个问题开始。我的研究表明,这不是NLP库提供的现成功能,而且预先训练的深度学习模型通常用于对这样的句子进行分类

到目前为止,我的想法是:

1.逐句分析每条聊天信息 将句子标记化,使用词干,然后进行词性标记,然后迭代所有标记,以确定是否:

动词查找我在哪里可以找到。。。或者去哪里我可以得到。。。或者是在哪里。。。包含 检查是否包含名词,如果包含,如果该名词是有效的资源名称,则更好的方法可能是找出该名词实际上是与动词相关的对象。这可能吗? 通过检查最后一个标记是否为,检查句子是否为疑问句? 2使用某种匹配,比如spaCy基于规则的匹配

构建几个模式,这些模式可以识别所需的问题/问题类型 匹配每条聊天信息上的模式 如果匹配,则提取资源名称 3使用非NLP技术 如果其他一切都不可行/太复杂,我仍然可以提出一种硬编码的方法,在这种方法中,我只需预先定义两种问题类型,然后字符串搜索它们在聊天消息中出现的位置,并尝试使用字符串操作手动提取资源名称。 这可能是最容易出错和最不灵活的解决方案,但我将把它作为一种后备方案

当然,我确实希望实现一个尽可能灵活的解决方案,这样它可以检测各种形式和类型的问题,而无需事先对所有可能类型的问题进行硬编码。它应该尽可能靠近机器人,只是理解聊天内容并尽可能回答问题

有人能给我一个好的解决方案吗?不是要求完整的代码,而是我将使用的技术/步骤/库

也许作为旁注:在以后的版本中,我想扩展功能。然后,其他用户可以在discord聊天中命名资源的位置,如果尚未包含该位置,则bot应将该位置添加到其数据库中。因此,聊天对话可能如下所示:

User 1: Where can I find cryptonite?
User 2: It can be found in lex luthors lab
Bot: Shall I add "lex luthors lab" as location for resource "cryptonite"?
User 2: @bot: yes
Bot: Done.  
tl:dr 看起来你基本上有一个意图/实体问题

1.逐句分析每条聊天信息。 这可以通过意向分类来解决

2使用某种匹配,比如spaCy基于规则的匹配 这可以通过实体提取来解决

意图 意图是整个句子的分类

例如,您可以有一个意图:查找资源。 然后,您需要将示例语句归类为find_resource。 例如:

X = [
  'Where can I find wood?',
  'What is the location of wood?',
  'Where do I find fire?',
  'Give me the coordinates of lemons.',
  'What is the best place to gather coal?',
  'Do you know where I can find tomatoes?',
  'Tell me a spot to collect wood.'
]
你可以训练一个神经网络来执行这个分类任务,但是有更简单的模型,你可以先试试。一个好的机器学习库提供了现成的传统机器学习分类方法。它还有一个用于处理文本的feature_extraction.text子包

实例 训练数据 是例句 X=[ “我在哪里可以找到木头?”, “木材的位置是什么?”, “我在哪里能找到火?”, “给我柠檬的坐标。”, “收集煤炭的最佳地点是什么?”, “你知道我在哪里能找到西红柿吗?”, “告诉我一个收集木材的地方。”, “我怎样才能增强力量?”, “我如何训练伐木?”, “我在哪里可以练习游泳技巧?”, “我能跑得更好吗?”, “我在哪里可以训练我的樵夫?” g技能?” ] y是对应于X中句子的意图类 y=[ “查找资源”, “查找资源”, “查找资源”, “查找资源”, “查找资源”, “查找资源”, “查找资源”, “提高技能”, “提高技能”, “提高技能”, “提高技能”, “提高技能” ] 定义分类器 从sklearn.feature\u extraction.text导入TfidfVectorizer 从sklearn.linear_模型导入SGDClassizer 从sklearn.pipeline导入管道 clf=管道 [ “tfidf”,tfidf矢量器, “sgd”,sgd分类机 ] 训练分类器 clf.fitX,y 测试你的分类器 不在X中的新句子和你以前从未见过的模型 新句子=[ “木头的坐标是多少?”, “我在哪里可以找到纸?”, “我怎样才能改进伐木?”, “我在哪里可以提高我的跳跃技巧?” ] 预测的意图=clf.predictnew\u句子 印刷品 >[“查找资源”“查找资源”“提高技能”“提高技能”] 实体提取 实体提取是在句子中查找特定子字符串的任务。这可以是地点、时间、人名等。。。或者在您的情况下,资源类型

典型的培训数据如下所示:

X = [
    'Where can I find [wood](resource_type)?',
    'What is the location of [wood](resource_type)?',
    'Where do I find [fire](resource_type)?',
    'How can I level up [strength](skill_type)?',
    'Where can I train my [woodcutting](skill_type) skill?'
]
确实提供了最先进的模型。它有预先训练过的实体类型,但也允许您在您的案例中使用自定义实体资源类型对其进行扩展

旁注 您可以将您的问题建模为:

意图:

X = [
  'Where can I find cryptonite?'
  'It can be found in lex luthors lab',
  'yes'
] 

y = [
  'find_resource',
  'provide_location',
  'affirm'
]
实体:

X = [
  'Where can I find [cryptonite](resource_type)?'
  'It can be found in [lex luthors lab](location)',
  'yes'
] 
诀窍在于你要弄清楚用户2是否真的回复了用户1。此外,您需要保持对话的状态,但这取决于您使用的bot框架。然而,这不再是NLP问题。

tl:dr 看起来你基本上有一个意图/实体问题

1.逐句分析每条聊天信息。 这可以通过意向分类来解决

2使用某种匹配,比如spaCy基于规则的匹配 这可以通过实体提取来解决

意图 意图是整个句子的分类

例如,您可以有一个意图:查找资源。 然后,您需要将示例语句归类为find_resource。 例如:

X = [
  'Where can I find wood?',
  'What is the location of wood?',
  'Where do I find fire?',
  'Give me the coordinates of lemons.',
  'What is the best place to gather coal?',
  'Do you know where I can find tomatoes?',
  'Tell me a spot to collect wood.'
]
你可以训练一个神经网络来执行这个分类任务,但是有更简单的模型,你可以先试试。一个好的机器学习库提供了现成的传统机器学习分类方法。它还有一个用于处理文本的feature_extraction.text子包

实例 训练数据 是例句 X=[ “我在哪里可以找到木头?”, “木材的位置是什么?”, “我在哪里能找到火?”, “给我柠檬的坐标。”, “收集煤炭的最佳地点是什么?”, “你知道我在哪里能找到西红柿吗?”, “告诉我一个收集木材的地方。”, “我怎样才能增强力量?”, “我如何训练伐木?”, “我在哪里可以练习游泳技巧?”, “我能跑得更好吗?”, “我在哪里可以训练我的伐木技能?” ] y是对应于X中句子的意图类 y=[ “查找资源”, “查找资源”, “查找资源”, “查找资源”, “查找资源”, “查找资源”, “查找资源”, “提高技能”, “提高技能”, “提高技能”, “提高技能”, “提高技能” ] 定义分类器 从sklearn.feature\u extraction.text导入TfidfVectorizer 从sklearn.linear_模型导入SGDClassizer 从sklearn.pipeline导入管道 clf=管道 [ “tfidf”,tfidf矢量器, “sgd”,sgd分类机 ] 训练分类器 clf.fitX,y 测试你的分类器 不在X中的新句子和你以前从未见过的模型 新句子=[ “木头的坐标是多少?”, “我在哪里可以找到纸?”, “我怎样才能改进伐木?”, “我在哪里可以提高我的跳跃技巧?” ] 预测的意图=clf.predictnew\u句子 印刷品 >[“查找资源”“查找资源”“提高技能”“提高技能”] 实体提取 实体提取是在句子中查找特定子字符串的任务。这可以是地点、时间、人名等。。。或者在您的情况下,资源类型

典型的培训数据如下所示:

X = [
    'Where can I find [wood](resource_type)?',
    'What is the location of [wood](resource_type)?',
    'Where do I find [fire](resource_type)?',
    'How can I level up [strength](skill_type)?',
    'Where can I train my [woodcutting](skill_type) skill?'
]
确实提供了最先进的模型。它有预先训练过的实体类型,但也允许您在您的案例中使用自定义实体资源类型对其进行扩展

旁注 您可以将您的问题建模为:

意图:

X = [
  'Where can I find cryptonite?'
  'It can be found in lex luthors lab',
  'yes'
] 

y = [
  'find_resource',
  'provide_location',
  'affirm'
]
实体:

X = [
  'Where can I find [cryptonite](resource_type)?'
  'It can be found in [lex luthors lab](location)',
  'yes'
] 

诀窍在于你要弄清楚用户2是否真的回复了用户1。此外,您需要保持对话的状态,但这取决于您使用的bot框架。尽管如此,这已不再是NLP问题。

首先感谢您的回复。按照计划,我能够训练一个SGD分类机。我让它学习了3个类别:查找资源,f
按位置和聊天记录查找资源,聊天记录只是随机/不相关的聊天信息。我已经创建了大约2000个示例问题,还向train添加了1000条无关的聊天信息。结果让我非常惊讶:通过另外6000条随机聊天消息验证,它成功地找到了这两种类型的资源查询,即使是我在培训中没有的结构,但到目前为止,我无法找到缺少的匹配项。关于实体提取:我想我将只进行字符串搜索,因为我有一个完整的/已知的资源名称列表,我可以在聊天信息中查找。这也将使我能够处理这样的事情:有人知道我在哪里可以找到木材、石头和黄金吗?。到目前为止,我对这个解决方案非常满意。我以前没有使用过SGD分类器。我只使用过sklearn的线性回归,并使用了几种深度学习方法。我也学到了一些新东西。我知道我不能提供足够的训练数据,但目前效果似乎很好。顺便说一句,我还发现:似乎它既可以进行意图分类,也可以进行实体提取。我想知道这是否会表现得更好?然而,由于每个单词都需要标记,因此为培训组装一个更大的数据集肯定是一件痛苦的事情。@user826955很高兴您从中得到了一些新东西:D确实,这种空间意图解析器将更难训练,因为它需要的训练数据确实是特定的,并且更难注释。然而,它将能够找出更复杂的句子结构。由于您提到SGDClassizer的性能几乎达到100%,我看不出它还能改进多少;事实上,分类器并不能识别所有的句子。结果表明,它可以检测出这些问题,但这取决于所要求的资源。我想,这是因为我的训练句子看起来像是“我在哪里能找到木头?”你知道木头在哪里吗?有人知道我在哪里能找到木头吗?。现在,如果有人要木材,它会被完美地检测出来,但是如果要另一种资源,分类就会失败。这使我扩展了训练集,以包括所有可能的资源名称。但这样一来,培训数据就非常庞大。首先,感谢您的回复。按照计划,我能够训练一个SGD分类机。我学习了3个类别:查找资源、按位置查找资源和聊天,其中聊天只是随机/不相关的聊天信息。我已经创建了大约2000个示例问题,还向train添加了1000条无关的聊天信息。结果让我非常惊讶:通过另外6000条随机聊天消息验证,它成功地找到了这两种类型的资源查询,即使是我在培训中没有的结构,但到目前为止,我无法找到缺少的匹配项。关于实体提取:我想我将只进行字符串搜索,因为我有一个完整的/已知的资源名称列表,我可以在聊天信息中查找。这也将使我能够处理这样的事情:有人知道我在哪里可以找到木材、石头和黄金吗?。到目前为止,我对这个解决方案非常满意。我以前没有使用过SGD分类器。我只使用过sklearn的线性回归,并使用了几种深度学习方法。所以我也学到了一些新的东西。我知道我不能提供足够的训练数据,但目前效果似乎很好。顺便说一句,我还发现:似乎它既可以进行意图分类,也可以进行实体提取。我想知道这是否会表现得更好?然而,由于每个单词都需要标记,因此为培训组装一个更大的数据集肯定是一件痛苦的事情。@user826955很高兴您从中得到了一些新东西:D确实,这种空间意图解析器将更难训练,因为它需要的训练数据确实是特定的,并且更难注释。然而,它将能够找出更复杂的句子结构。由于您提到SGDClassizer的性能几乎达到100%,我看不出它还能改进多少;事实上,分类器并不能识别所有的句子。结果表明,它可以检测出这些问题,但这取决于所要求的资源。我想,这是因为我的训练句子看起来像是“我在哪里能找到木头?”你知道木头在哪里吗?有人知道我在哪里能找到木头吗?。现在,如果有人要木材,它会被完美地检测出来,但是如果要另一种资源,分类就会失败。这使我扩展了训练集,以包括所有可能的资源名称。但这样一来,训练数据就大了。