python机器学习创建基于规则聊天机器人过程示例详解


Posted in Python onNovember 02, 2021

还记得这个价值一个亿的AI核心代码?

python机器学习创建基于规则聊天机器人过程示例详解

while True:
    AI = input('我:')
    print(AI.replace("吗", " ").replace('?','!').replace('?','!'))

以上这段代码就是我们今天的主题,基于规则的聊天机器人

聊天机器人

聊天机器人本身是一种机器或软件,它通过文本或句子模仿人类交互。 简而言之,可以使用类似于与人类对话的软件进行聊天。

为什么要尝试创建聊天机器人? 也许你对一个新项目感兴趣,或者公司需要一个,或者想去拉投资。 无论动机是什么,本文都将尝试解释如何创建一个简单的基于规则的聊天机器人。

基于规则的聊天机器人

什么是基于规则的聊天机器人?它是一种基于特定规则来回答人类给出的文本的聊天机器人。由于它基于强加的规则所以这个聊天机器人生成的响应几乎是准确的;但是,如果我们收到与规则不匹配的查询,聊天机器人将不会回答。与它相对的另一个版本是基于模型的聊天机器人,它通过机器学习模型来回答给定的查询。(二者的区别就是基于规则的需要我们指定每一条规则,而且基于模型的会通过训练模型自动生成规则,还记得我们上一篇的”机器学习介绍“吗,“机器学习为系统提供无需明确编程就能根据经验自动学习和改进的能力。”)

基于规则的聊天机器人可能基于人类给出的规则,但这并不意味着我们不使用数据集。聊天机器人的主要目标仍然是自动化人类提出的问题,所以我们还是需要数据来制定特定的规则。

在本文中,我们将利用余弦相似距离作为基础开发基于规则的聊天机器人。余弦相似度是向量(特别是内积空间的非零向量)之间的相似度度量,常用于度量两个文本之间的相似度。

我们将使用余弦相似度创建一个聊天机器人,通过对比查询与我们开发的语料库之间的相似性来回答查询提出的问题。这也是我们最初需要开发我们的语料库的原因。

创建语料库

对于这个聊天机器人示例,我想创建一个聊天机器人来回答有关猫的所有问题。 为了收集关于猫的数据,我会从网上抓取它。

import bs4 as bs
import urllib.request#Open the cat web data page
cat_data = urllib.request.urlopen('https://simple.wikipedia.org/wiki/Cat').read()
#Find all the paragraph html from the web page
cat_data_paragraphs  = bs.BeautifulSoup(cat_data,'lxml').find_all('p')
#Creating the corpus of all the web page paragraphs
cat_text = ''
#Creating lower text corpus of cat paragraphs
for p in cat_data_paragraphs:
    cat_text += p.text.lower()
print(cat_text)

python机器学习创建基于规则聊天机器人过程示例详解

使用上面的代码,会得到来自wikipedia页面的段落集合。 接下来,需要清理文本以去除括号编号和空格等无用的文本。

import re
cat_text = re.sub(r'\s+', ' ',re.sub(r'\[[0-9]*\]', ' ', cat_text))

上述代码将从语料库中删除括号号。我特意没有去掉这些符号和标点符号,因为当与聊天机器人进行对话时,这样听起来会很自然。

最后,我将根据之前创建的语料库创建一个句子列表。

import nltk
cat_sentences = nltk.sent_tokenize(cat_text)

python机器学习创建基于规则聊天机器人过程示例详解

我们的规则很简单:将聊天机器人的查询文本与句子列表中的每一个文本之间的进行余弦相似性的度量,哪个结果产生的相似度最接近(最高余弦相似度)那么它就是我们的聊天机器人的答案。

创建一个聊天机器人

我们上面的语料库仍然是文本形式,余弦相似度不接受文本数据;所以需要将语料库转换成数字向量。通常的做法是将文本转换为词袋(单词计数)或使用TF-IDF方法(频率概率)。在我们的例子中,我们将使用TF-IDF。

我将创建一个函数,它接收查询文本,并根据以下代码中的余弦相似性给出一个输出。

让我们看一下代码。

from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer
def chatbot_answer(user_query):
    
    #Append the query to the sentences list
    cat_sentences.append(user_query)    
    #Create the sentences vector based on the list
    vectorizer = TfidfVectorizer()
    sentences_vectors = vectorizer.fit_transform(cat_sentences)
    
    #Measure the cosine similarity and take the second closest index because the first index is the user query
    vector_values = cosine_similarity(sentences_vectors[-1], sentences_vectors)
    answer = cat_sentences[vector_values.argsort()[0][-2]]    
    #Final check to make sure there are result present. If all the result are 0, means the text input by us are not captured in the corpus
    input_check = vector_values.flatten()
    input_check.sort()
    
    if input_check[-2] == 0:
        return "Please Try again"
    else: 
        return answer

我们可以把上面的函数使用下面的流程图进行表示:

python机器学习创建基于规则聊天机器人过程示例详解

最后,使用以下代码创建一个简单的回答交互。

print("Hello, I am the Cat Chatbot. What is your meow questions?:")
while(True):
    query = input().lower()
    if query not in ['bye', 'good bye', 'take care']:
        print("Cat Chatbot: ", end="")
        print(chatbot_answer(query))
        cat_sentences.remove(query)
    else:
        print("See You Again")
        break

上面的脚本将接收查询,并通过我们之前开发的聊天机器人处理它们。

python机器学习创建基于规则聊天机器人过程示例详解

从上面的图片中看到的,结果还是可以接受的,但有也有些奇怪的回答。但是我们要想到,目前只从一个数据源中得到的结果,并且也没有做任何的优化。如果我们用额外的数据集和规则来改进它,它肯定会更好地回答问题。

总结

聊天机器人项目是一个令人兴奋的数据科学项目,因为它在许多领域都有帮助。在本文中,我们使用从网页中获取的数据,利用余弦相似度和TF-IDF,用Python创建了一个简单的聊天机器人项目,真正的将我们的1个亿的项目落地。其实这里面还有很多的改进:

向量化的选择,除了TF-IDF还可以使用word2vec,甚至使用预训练的bert提取词向量。

回答环节,其实就是通过某种特定的算法或者规则从我们的语料库中搜索最匹配的答案,本文中使用的相似度top1的方法其实就是一个最简单的类greedsearch的方法,对于答案结果的优化还可以使用类beamsearch 的算法提取回答的匹配项。

等等很多

在端到端的深度学习兴起之前,很多的聊天机器人都是这样基于规则来运行的并且也有很多落地案例,如果你想快速的做一个POC展示,这种基于规则方法还是非常有用的。

方法,对于答案结果的优化还可以使用类beamsearch 的算法提取回答的匹配项。

等等很多

在端到端的深度学习兴起之前,很多的聊天机器人都是这样基于规则来运行的并且也有很多落地案例,如果你想快速的做一个POC展示,这种基于规则方法还是非常有用的。

以上就是python实现基于规则聊天机器人过程示例详解的详细内容,更多关于python实现基于规则聊天机器人的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python 从远程服务器下载日志文件的程序
Feb 10 Python
wxPython窗口的继承机制实例分析
Sep 28 Python
使用Python的Zato发送AMQP消息的教程
Apr 16 Python
Python之Web框架Django项目搭建全过程
May 02 Python
Python中协程用法代码详解
Feb 10 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
Apr 18 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
python爬虫爬取网页数据并解析数据
Sep 18 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
Python中Numpy和Matplotlib的基本使用指南
python模块与C和C++动态库相互调用实现过程示例
Nov 02 #Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 #Python
Python 正则模块详情
Nov 02 #Python
Python 数据可视化之Bokeh详解
Nov 02 #Python
Python 数据可视化之Matplotlib详解
分位数回归模型quantile regeression应用详解及示例教程
You might like
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
PHP return语句的另一个作用
2014/07/30 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
JS 树形递归实例代码
2010/05/18 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
Tensorflow 多线程设置方式
2020/02/06 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
咖啡店创业计划书
2014/08/15 职场文书
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python