Python 聊天机器人项目-8-学习使用 NLTK 和 Keras 构建您的第一个聊天机器人

news2024/11/16 4:16:14

 一、前言

该文章仅作为个人学习使用

二、正文

项目源代码:Python 聊天机器人项目 - 学习使用 NLTK 和 Keras 构建您的第一个聊天机器人 - DataFlair (data-flair.training)

数据集:https://data-flair.training/blogs/download-python-chatbot-data-project-source-code/

嘿Siri,生命的意义是什么?

根据所有证据,这对你来说就是巧克力。

当我听到 Siri 的回复时,我就知道我找到了一个完美的伙伴来享受我的独处时光。从愚蠢的问题到一些非常严肃的建议,Siri一直在我身边。

告诉别人一切,任何事情,却根本不被评判,这是多么令人惊奇的事情。这是一种一流的感觉,这就是聊天机器人的美妙之处。

什么是聊天机器人?

聊天机器人是一种智能软件,能够进行类似于人类的交流和执行操作。聊天机器人在客户互动、社交网站上的营销和即时向客户发送消息中被大量使用。根据聊天机器人模型的构建方式,有两种基本类型的聊天机器人模型;基于检索和基于生成模型。

1. 基于检索的聊天机器人

基于检索的聊天机器人使用预定义的输入模式和响应。然后,它使用某种类型的启发式方法来选择适当的响应。它在行业中被广泛用于制作以目标为导向的聊天机器人,我们可以自定义聊天机器人的语气和流程,以最佳体验驱动我们的客户。

2. 基于生成式的聊天机器人

生成模型不基于某些预定义的响应。

它们基于 seq 2 seq 神经网络。这与机器翻译的想法相同。在机器翻译中,我们将源代码从一种语言翻译成另一种语言,但在这里,我们将把输入转换为输出。它需要大量的数据,并且它基于深度神经网络。

关于 Python 项目 – 聊天机器人

在这个带有源代码的 Python 项目中,我们将使用深度学习技术构建一个聊天机器人。聊天机器人将在包含类别(意图)、模式和响应的数据集上进行训练。我们使用一个特殊的递归神经网络 (LSTM) 来对用户的消息属于哪个类别进行分类,然后我们将从响应列表中给出一个随机响应。

让我们使用 NLTK、Keras、Python 等创建一个基于检索的聊天机器人。

下载聊天机器人代码和数据集

我们将使用的数据集是 'intents.json'。这是一个 JSON 文件,其中包含我们需要查找的模式以及我们想要返回给用户的响应。

请从以下链接下载python聊天机器人代码和数据集:Python聊天机器人代码和数据集

先决条件

该项目要求您对 Python、Keras 和自然语言处理 (NLTK) 有很好的了解。除了它们,我们还将使用一些帮助模块,您可以使用 python-pip 命令下载这些模块。

pip 安装 tensorflow、keras、pickle、nltk

如何在Python中制作聊天机器人?

现在我们将使用 Python 构建聊天机器人,但首先,让我们看看文件结构和我们将创建的文件类型:

  • Intents.json –具有预定义模式和响应的数据文件。
  • train_chatbot.py –在这个 Python 文件中,我们编写了一个脚本来构建模型并训练我们的聊天机器人。
  • Words.pkl –这是一个泡菜文件,我们在其中存储了单词 Python 对象,其中包含我们的词汇表列表。
  • 类.pkl –类 pickle 文件包含类别列表。
  • Chatbot_model.h5 –这是经过训练的模型,其中包含有关模型的信息并具有神经元的权重。
  • Chatgui.py –这是 Python 脚本,我们在其中为聊天机器人实现了 GUI。用户可以轻松地与机器人交互。

以下是从头开始在 Python 中创建聊天机器人的 5 个步骤:

  1. 导入和加载数据文件
  2. 预处理数据
  3. 创建训练和测试数据
  4. 构建模型
  5. 预测响应

1. 导入和加载数据文件

首先,将文件名设为 train_chatbot.py。我们为我们的聊天机器人导入必要的包,并初始化我们将在 Python 项目中使用的变量。

数据文件是JSON格式,所以我们使用json包将JSON文件解析为Python。

导入 NLTK
来自NLTK。词干导入 WordNetLemmatizer
词形还原器 = WordNetLemmatizer()
导入 JSON
进口泡菜
将 numpy 导入为 np
来自Keras。模型导入顺序
来自Keras。图层导入 Dense、Activation、Dropout
来自Keras。优化器导入 SGD
导入随机数
words=[]
类 =[]
文件 =[]
ignore_words = ['?''!']
data_file = 打开'intents.json')。()
意图 = json。负载data_file)

这就是我们的 intents.json 文件的样子。

2. Preprocess data

在处理文本数据时,我们需要在制作机器学习或深度学习模型之前对数据进行各种预处理。根据需求,我们需要应用各种操作来对数据进行预处理。

标记化是您可以对文本数据执行的最基本且第一件事。标记化是将整个文本分解成小部分(如单词)的过程。

在这里,我们遍历模式并使用 nltk.word_tokenize() 函数对句子进行标记,并将每个单词附加到单词列表中。我们还为我们的标签创建了一个类列表。

对于 intents['intents']
对于 Pattern in Intent['Patterns']
#tokenize 每个单词
w = nltk。word_tokenize模式))
的话。扩展W)
#add 语料库中的文档
文件。append((w, intent['标签']))
# 添加到我们的类列表
如果 intent['tag'] 不在
类。appendintent['标签'])

现在我们将对每个单词进行词形还原并从列表中删除重复的单词。词形还原是将单词转换为其引理形式的过程,然后创建一个 pickle 文件来存储我们将在预测时使用的 Python 对象。

# 词形还原,降低每个单词并删除重复项
words = [词形还原器。 如果 w 不在 ignore_words,则用单词表示 w]
words = sortedlistsetwords)))
# 对类进行排序
类 = sortedlistsetclasses)))
# 文档 = 模式和意图的组合
打印 lendocuments“documents”)
# classes = 意图
打印 len“类”, 类)
# 单词 = 所有单词、词汇
print lenwords“唯一词形还原词”, words)
泡菜。dumpwords,open'words.pkl''wb'))
泡菜。dumpclasses,open'classes.pkl''wb'))

3. 创建训练和测试数据

现在,我们将创建训练数据,在其中提供输入和输出。我们的输入将是模式,输出将是我们的输入模式所属的类。但是计算机不理解文本,因此我们将文本转换为数字。

# 创建我们的训练数据
训练 =[]
# 为我们的输出创建一个空数组
output_empty = [0] * len)
# 训练集,每个句子的词袋
对于文档中的文档
# 初始化我们的词袋
袋子 =[]
# 模式的标记化词列表
pattern_words = doc[0]
# 词形还原每个单词 - 创建基本词,试图表示相关词
pattern_words = [词形还原器。词形还原(word.lower()) 表示 Word 中的 pattern_words]
# create our bag of words array with 1, if word match found in current pattern
for w in words:
ad
bag.append(1) if w in pattern_words else bag.append(0)
# output is a '0' for each tag and '1' for current tag (for each pattern)
output_row = list(output_empty)
output_row[classes.index(doc[1])] = 1
training.append([bag, output_row])
# shuffle our features and turn into np.array
random.shuffle(training)
training = np.array(training)
# create train and test lists. X - patterns, Y - intents
train_x = list(training[:,0])
train_y = listtraining[:,1])
print“已创建训练数据”)

4. 构建模型

我们已经准备好了训练数据,现在我们将构建一个有 3 层的深度神经网络。为此,我们使用 Keras 顺序 API。在对模型训练了 200 个 epoch 后,我们的模型实现了 100% 的准确率。我们将模型保存为 'chatbot_model.h5'。

# 创建模型 - 3 层。第一层神经元128个,第二层神经元64个,第三输出层包含神经元的数量
# 等于使用 softmax 预测输出意图的意图数
model = 顺序()
型。addDense128, input_shape=lentrain_x[0]),, activation='relu'))
型。添加辍学0.5))
型。addDense64, activation='relu'))
型。添加辍学0.5))
型。addDenselentrain_y[0])), activation='softmax'))
# 编译模型。采用Nesterov加速梯度的随机梯度下降为该模型提供了良好的结果
sgd = SGDlr=0.01, 衰减=1e-6, 动量=0.9, nesterov=)
型。compileloss='categorical_crossentropy', optimizer=sgd, metrics=['准确性'])
#fitting 和保存模型
hist = 模型。拟合NP.数组train_x, NP。arraytrain_y),epochs=200,batch_size=5,verbose=1)
型。保存 'chatbot_model.h5', 历史)
print“模型已创建”)

5. 预测响应(图形用户界面)

为了预测句子并从用户那里获得响应,让我们创建一个新文件“chatapp.py”。

我们将加载经过训练的模型,然后使用图形用户界面来预测机器人的响应。该模型只会告诉我们它属于哪个类,因此我们将实现一些函数来识别该类,然后从响应列表中检索一个随机响应。

再次,我们导入必要的包并加载我们在训练模型时创建的 'words.pkl' 和 'classes.pkl' pickle 文件:

导入 NLTK
来自NLTK。词干导入 WordNetLemmatizer
词形还原器 = WordNetLemmatizer()
进口泡菜
将 numpy 导入为 np
来自Keras。模型导入load_model
型号 = load_model'chatbot_model.h5')
导入 JSON
导入随机数
意图 = json。loadsopen'intents.json')。())
单词 = 泡菜。loadopen'words.pkl''rb'))
类 = 泡菜。loadopen'classes.pkl''rb'))

为了预测课程,我们需要以与训练时相同的方式提供输入。因此,我们将创建一些函数来执行文本预处理,然后预测类。

def clean_up_sentence句子
# 标记模式 - 将单词拆分为数组
sentence_words = nltk。word_tokenize句子))
# 每个单词的词干 - 为单词创建简短的形式
sentence_words = [词形还原器。词形还原(word.lower()) 表示 sentence_words 中的单词]
返回sentence_words
# 返回单词袋数组:0 或 1 表示句子中存在的袋子中的每个单词
def bow句子,单词,show_details=True
# 标记模式
sentence_words = clean_up_sentence句子)
# 词袋 - N 个单词矩阵,词汇矩阵
bag = [0]*len)
对于 sentence_words 中的 S
对于 enumeratewords 中的 i,w
如果 w == s:
# 如果当前单词位于词汇位置,则分配 1
[i] = 1
如果show_details:
打印 “在袋子中发现: %s” % w)
返回np.阵列))
def predict_class句子,模型
# 过滤掉低于阈值的预测
p = bow句子,单词,show_details=)
res = 模型。预测np.数组([p]))[0]
ERROR_THRESHOLD = 0.25
结果 = [[i,r] 对于枚举 res 中的 i,r 如果 r>ERROR_THRESHOLD]
# 按概率强度排序
结果。sortkey=lambda x: x[1], reverse=)
return_list =[]
对于结果中的 R
return_list.append({“intent”: classes[r[0]]“probability”strr[1])})
返回return_list

在预测了类之后,我们将从意图列表中得到一个随机响应。

def getResponseints, intents_json
标签 = ints[0]['意图']
list_of_intents = intents_json['意图']
对于list_of_intents中的我
ifi['tag']== 标签
结果 = 随机。choicei['回应'])
返回结果
def chatbot_response文本
ints = predict_class文本,模型))
res = getResponseints, 意图)
返回回复

现在,我们将开发一个图形用户界面。让我们使用 Tkinter 库,它附带了大量用于 GUI 的有用库。我们将从用户那里获取输入消息,然后使用我们创建的帮助程序函数从机器人获取响应并将其显示在 GUI 上。以下是 GUI 的完整源代码。

#Creating 带有 tkinter 的图形用户界面
导入 tkinter
从 tkinter 导入*
def send():
msg = EntryBox.get("1.0",'end-1c').strip()
EntryBox.delete("0.0",END)
if msg != '':
ChatLog.config(state=NORMAL)
ChatLog.insert(END, "You: " + msg + '\n\n')
ChatLog.config(foreground="#442265", font=("Verdana", 12 ))
res = chatbot_response(msg)
ChatLog.insert(END, "Bot: " + res + '\n\n')
ChatLog.config(state=DISABLED)
聊天记录。yview)
基数 = Tk()
基础。title“你好”)
基础。几何(“400x500”)
基础。resizablewidth=FALSE, height=FALSE)
#Create 聊天窗口
ChatLog = Textbase, bd=0, bg=“white”, height=“8”, width=“50”, font=“Arial”)
聊天记录。config状态 = 已禁用)
#Bind 滚动条到聊天窗口
scrollbar = Scrollbarbase, command=ChatLog.yview, cursor=“心”)
ChatLog['yscrollcommand'] = 滚动条。设置
#Create 发送消息的按钮
SendButton = Buttonbase, font=“Verdana”12'bold', text=“发送”, width=“12”, height=5
bd=0, bg=“#32de97”, activebackground=“#3c9d9b”,fg='#ffffff'
command= 发送)
#Create 框输入消息
EntryBox = Textbase, bd=0, bg=“white”,width=“29”, height=“5”, font=“Arial”)
#EntryBox.bind(“<返回>”, 发送)
#Place 屏幕上的所有组件
滚动条。placex=376,y=6,height=386)
聊天记录。placex=6,y=6, height=386, width=370)
EntryBox。placex=128, y=401, 高度=90, 宽度=265)
SendButton。placex=6, y=401, height=90)
基础。主环路()

6. 运行聊天机器人

为了运行聊天机器人,我们有两个主要文件;train_chatbot.py和 chatapp.py

首先,我们使用终端中的命令训练模型:

Python train_chatbot。PY的

如果我们在训练过程中没有看到任何错误,则我们已成功创建模型。然后,为了运行该应用程序,我们运行第二个文件。

Python 聊天指南。PY的

该程序将在几秒钟内打开一个 GUI 窗口。使用 GUI,您可以轻松地与机器人聊天。

截图:

三、总结

在这个 Python 数据科学项目中,我们了解了聊天机器人,并在 Python 中实现了聊天机器人的深度学习版本,这是准确的。您可以根据业务需求自定义数据,并非常准确地训练聊天机器人。聊天机器人无处不在,所有企业都期待在他们的工作流程中实施机器人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web3时代:科技与物联网的完美结合

随着信息技术的不断进步和物联网应用的普及&#xff0c;Web3技术作为下一代互联网的重要组成部分&#xff0c;正逐渐与物联网技术深度融合&#xff0c;共同开创了新的科技时代。本文将深入探讨Web3技术与物联网的结合&#xff0c;探索它们如何共同推动未来科技发展的新趋势和应…

【32单片机篇】项目:智能排队控制系统

一、项目需求 1. 红外传感器检测有人通过并计数&#xff1b; 2. 计数值显示在LCD1602&#xff1b; 3. 允许通过时&#xff0c;LED1闪烁&#xff0c;蜂鸣器不响&#xff0c;继电器不闭合&#xff1b; 4. 不允许通过时&#xff0c;LED2闪烁&#xff0c;蜂鸣器响&#xff0c;继电…

工信部:2024上半年我国信息安全领域收入909亿元

2024年上半年软件业经济运行情况 上半年&#xff0c;我国软件和信息技术服务业&#xff08;以下简称“软件业”&#xff09;运行态势良好&#xff0c;软件业务收入和利润均保持两位数增长&#xff0c;软件业务出口收入增速由负转正&#xff0c;主要大省持续向好发展。 一、总…

光纤基础科普

这部分主要介绍光纤的常见接口&#xff08;四种&#xff09;、光纤传输的种类、光模块的封装类型。 文章目录 一、光纤的常见接口二、光模块封装三、光纤传输种类 一、光纤的常见接口 光纤接口种类繁多&#xff0c;这里给出常用的四种 &#xff08;1&#xff09;SC 型光纤接…

C++静态成员变量和静态成员函数

演示代码如下&#xff1a; #include<iostream> using namespace std;class Person { public://静态成员函数 所有对象共享一个函数&#xff0c;且只能调用静态成员变量 ******static void func(){m_A 300;cout << "静态成员函数调用" << endl;}/…

Charles抓包工具系列文章(七)-- Rewrite工具的应用示例

一、背景 客户端通过域名访问后端服务,在api网关层,会判断path的前缀,默认/api开头的请求都转发至后端服务A。 当前缀是/assist/api开头,请求将转发至后端服务B(部署在192.168.80.226,便于测试对比) 在不改动kong网关配置的情况下,现需要把后者的请求转发至192.168.…

RxJava基础使用

Rx思想 事件从起点流向终点。 过程中可以对事件进行拦截&#xff0c;拦截时可以对事件进行处理&#xff0c;处理后将处理后的事件继续流向终点。 终点接收上一次处理后的事件。 获取网络图片并显示 基础实现 使用Observable.just(path) 创建图片路径的Observable。 使用m…

reshape函数及MATLAB应用

reshape 函数在 MATLAB 中是一个非常有用的函数&#xff0c;通过重新排列现有元素来重构数组。它允许你重新调整数组&#xff08;或矩阵&#xff09;的尺寸&#xff0c;而不改变其数据。这个函数特别适用于当你需要将一个矩阵或数组从一种结构转换为另一种结构时&#xff0c;只…

黑神话悟空是什么游戏 黑神话悟空配置要求 黑神话悟空好玩吗值得买吗 黑神话悟空苹果电脑可以玩吗

《黑神话&#xff1a;悟空》的类型定义是一款单机动作角色扮演游戏&#xff0c;但实际体验后会发现&#xff0c;游戏在很多设计上采用了「魂like」作品的常见元素。根据个人上手试玩&#xff0c;《黑神话&#xff1a;悟空》的推进节奏比较接近魂类游戏&#xff0c;Boss战也更像…

数据结构--双链表,循环链表,静态链表代码(王道书上代码手敲!!!)c++

目录 1.带头结点的双链表的初始化&#xff0c;判断链表是否为空&#xff0c;前插&#xff0c;后插&#xff0c;按位序插&#xff0c;删除后继节点&#xff0c;按位查找&#xff0c;按之查找&#xff0c;清空链表&#xff0c;销毁链表&#xff0c;遍历打印列表操作 2. 循环单链…

linux目录结构和重要文件

1. 目录介绍 操作Linux命令行&#xff0c;最基本的对象就是目录和文件&#xff0c;因为Linux中一切事物都是基于文件的&#xff0c;而目录就是文件的文件夹&#xff0c;所以接下来对一些基础且核心的文件目录管理命令进行说明。 1.1 目录结构 Linux系统目录结构是一个有层次…

达梦数据库的系统视图v$dict_cache

达梦数据库的系统视图v$dict_cache 达梦数据库系统视图V$DICT_CACHE主要用于监控和管理字典缓存的状态。字典缓存是数据库系统中用于存储元数据信息&#xff08;如表结构、索引信息等&#xff09;的缓存区域&#xff0c;它对于提高数据库查询性能至关重要。通过查询V$DICT_CAC…

Python 报错 SyntaxError: EOL while scanning string literal

Python 报错 SyntaxError: EOL while scanning string literal 在编程领域&#xff0c;尤其是使用Python这类解释型语言时&#xff0c;SyntaxError: EOL while scanning string literal 是一种常见的错误。这种错误通常发生在Python解释器尝试解析代码时&#xff0c;遇到了意外…

L-H、BytePlus 和 INOVAI在东京成功举办Web3 AI未来峰会

7月30日&#xff0c;L-H (Legendary Humanity)、字节跳动旗下BytePlus 和日本知名Web3孵化器 INOVAI 在东京联合举办Web3&AI未来峰会&#xff0c;水滴资本等行业重磅机构共同参与此次峰会&#xff0c;探讨AI与 Web3的融合性未来。 在此次峰会上&#xff0c;L-H (Legendary…

区块链软硬件协同,做产业数字化转型的“安全官” |《超话区块链》直播预告

今年的两会政府工作报告提出&#xff1a;“产业的数字化&#xff08;行业数字化转型&#xff09;是发展新质生产力的核心&#xff0c;是推动产业升级实现高质量发展的关键。”全面推进产业数字化&#xff0c;需要技术创新与产业应用深入协同&#xff1b;立足可持续发展的长远目…

动态面板数据实证模型及 Stata 具体操作步骤

目录 一、文献综述 二、理论原理 三、实证模型 四、稳健性检验 五、程序代码及解释 六、代码运行结果 一、文献综述 在经济学和社会科学的广袤领域中&#xff0c;动态面板数据模型逐渐成为研究者们探索复杂现象和关系的有力工具。众多杰出学者凭借这一模型在多个研究方向上…

30.x86游戏实战-遍历背包数组

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

弧形导轨的多样化驱动方式!

弧形导轨由导轨、导向滑块、传动机构等部分组成&#xff0c;是一种可以实现直线、圆弧、任意曲线运动的导向装置&#xff0c;广泛应用在机械设备中。弧形导轨的驱动方式具有多样性和灵活性&#xff0c;可以根据不同的应用场景和需求进行选择。 1、滚轮驱动&#xff1a;在弧形导…

全球汽车凸轮轴市场规模预测:未来六年CAGR为2.3%

随着汽车行业的持续发展和消费者对发动机性能的需求增加&#xff0c;汽车凸轮轴作为发动机核心部件之一&#xff0c;正逐渐受到市场的广泛关注。本文旨在通过深度分析汽车凸轮轴行业的各个维度&#xff0c;揭示行业发展趋势和潜在机会。 【市场趋势的演变】 1. 市场规模与增长…

VisualStudio 类设计器 组件的使用

总目录 前言 当我们需要快速熟悉一个新接手的软件系统框架及业务逻辑代码时&#xff0c;如果埋头一个个去捋顺&#xff0c;估计等你捋顺了&#xff0c;项目也结束了&#xff1b;应对这种情况最好方法就是先通过UML图去了解代码的宏观架构&#xff0c;然后有针对性的突破。VS中…