介绍
聊天机器人对商业组织和客户都非常有用。大多数人喜欢直接从聊天框聊天,而不是呼叫服务中心。Facebook发布的数据证明了机器人的价值。每月在人员与公司之间发送超过 20 亿条消息。HubSpot 研究告诉我们,71% 的用户希望从消息应用程序获得客户支持。这是解决他们问题的一种快速方法,因此聊天机器人在组织中有着光明的未来。
今天,我们将在聊天机器人上构建一个令人兴奋的项目。我们将从头开始实施一个聊天机器人,它将能够理解用户正在谈论的内容,并给出适当的响应。
先决条件
为了实现聊天机器人,我们将使用 Keras,这是一个深度学习库,NLTK,这是一个自然语言处理工具包,以及一些有用的库。运行以下命令以确保安装所有库:
pip install tensorflow keras pickle nltk
如果你想免费学习Python,那么这里是学习Python的硕士指南是免费的。
聊天机器人如何工作?
聊天机器人只不过是一个智能软件,可以像人类一样与人互动和沟通。很有趣,不是吗?现在让我们看看它们实际上是如何运作的。
所有聊天机器人都属于 NLP(自然语言处理)概念。NLP 由两个部分组成:
-
NLU(自然语言理解):机器理解人类语言的能力,如英语。
-
NLG(自然语言生成):机器生成类似于人类书面句子的文本的能力。
想象一下,一个用户向聊天机器人问一个问题:”嘿,今天新闻有什么?
聊天机器人会将用户句子分成两样:意图和实体实体提供有关意图的具体详细信息,因此”今天”将是实体。因此,机器学习模型用于识别聊天的意图和实体。
项目文件结构
项目完成后,您将保留所有这些文件。让我们快速浏览每个。它将让您了解如何实施该项目。
-
Train_chatbot.py – 在此文件中,我们将构建并训练深度学习模型,该模型可以对用户的要求进行分类和识别。
-
Gui_Chatbot.py – 此文件将构建一个图形用户界面,以便与我们经过培训的聊天机器人聊天。
-
意向.json – 意图文件包含我们将用于训练模型的所有数据。它包含标记的集合及其相应的模式和响应。
-
Chatbot_model.h5 – 这是一个分层数据格式文件,我们在其中存储了定型模型的权重和体系结构。
-
类.pkl = 泡菜文件可用于存储预测消息时要分类的所有标记名称。
-
单词.pkl – 单词.pkl 泡菜文件包含所有独特的单词,这是我们模型的词汇。
下载源代码和数据集:https://drive.google.com/drive/folders/1r6MrrdE8V0bWBxndGfJxJ4Om62dJ2OMP?usp=sharing
如何构建您自己的聊天机器人
我已经通过 5 个步骤简化了此聊天机器人的构建:
步骤 1。导入库并加载数据
创建一个新的 python 文件并将其命名为train_chatbot然后我们将导入所有必需的模块。之后,我们将在 Python 程序中读取 JSON 数据文件。
xxxxxxxxx
2222px;”>
将numpy导入为np
从喀拉拉邦。模型导入顺序
从喀拉拉邦。图层导入密集激活丢弃
从喀拉拉邦。优化器进口SGD
导入随机
9896px;”>
从nltk.干导入字网表垫机
垫机字网表垫 ()
导入json
进口泡菜
intents_file打开("意图.json")。读取()
意图json.负载(intents_file)
模型不能获取原始数据。它必须经过大量的预处理,机器才能容易理解。对于文本数据,有许多预处理技术可用。第一种技术是标记化,在其中,我们将句子分成单词。
通过观察意向文件,我们可以看到每个标记都包含一个模式和响应列表。我们标记每个模式,并在列表中添加单词。此外,我们创建一个类和文档列表,以添加与模式关联的所有意图。
xxxxxxxxx
1px;”[字]
类= |
文档= |
ignore_letters ="!'?'',''.']
意图的意图="意图"*:
意图中的模式 ="模式"*:
#tokenize每个单词
1px;”[字] nltk.word_tokenize(图案)
单词。扩展(字)
#add文件库中的文档
文档。追加((字意图="标记"*))
• 添加到我们的班级列表
如果意图="标记"不在类中:
类
9896px;”>
打印(文档)
xxxxxxxxx
2222px;”>
• 使每个单词都调低并删除重复项
单词= = =或用器。莱马西泽(w. . .低w在单词中,如果w不在ignore_letters|
字排序(列表(集(单词) )
• 排序类
类排序(列表(集(类) )
9896px;”>
印刷(文件"文件")
• 类 = 意图
印刷(len(类" 类"类)
• 单词 = 所有单词、词汇
印刷(len(单词"独特的语言化单词"单词)
泡菜。转储(单词,打开('字.pkl' ,'wb')
1px;”•泡菜。转储(类,打开(‘类.pkl’ ,‘wb’)
最后,单词包含我们项目的词汇量,类包含要分类的总实体。为了在文件中保存 python 对象,我们使用 pickle.dump() 方法。这些文件将有所帮助后,培训完成,我们预测聊天。
步骤 3.创建培训和测试数据
为了训练模型,我们将每个输入模式转换为数字。首先,我们将对模式的每个单词进行表化,并创建与总单词数长度相同的零列表。我们将值 1 设置为仅那些包含模式中单词的索引。同样,我们将通过将 1 设置为模式所属的类输入来创建输出。
9722px;”>
xxxxxxxxxx
• 创建培训数据
培训[ ]
• 为输出创建空数组
output_empty = =0=len(类)
1px;”•• 训练套装,每个句子的单词袋
文档中的文档 :
• 初始化单词袋
袋[ ]
• 模式的标记化单词列表
word_patterns文档=0|
• 使每个单词都完记 - 创建基词,试图表示相关单词
word_patterns == =
下())字在word_patterns|
• 如果在当前模式中找到单词,则创建具有 1 的单词包数组
字里行:
袋。追加(1如果单词在word_patterns其他袋。追加(0)
• 输出是每个标记的"0",当前标记的输出为"1"(对于每个模式)
output_row列表(output_empty)
1px;”[ output_row]类.索引(文档=1+)= = 1
培训。追加(*袋output_row*)
• 随机播放要素,使 numpy 数组
随机的.洗牌(培训)
培训np.数组(训练)
• 创建培训和测试列表。X - 模式,Y - 意图
train_x列表(培训[:,0])
1px;”[train_y =列表(培训#:,1*)
打印("创建训练数据")
步骤 4.训练模型
我们的模型的体系结构将是一个由 3 个密集层组成的神经网络。第一层有128个神经元,第二层有64个神经元,最后一层的神经元与类数相同。引入掉板图层以减少模型的过度拟合。我们使用 SGD 优化器并拟合数据来开始模型的训练。完成 200 个纪元的训练后,我们使用 Keras 模型保存训练的模型 chatbot_model。
xxxxxxxxx
2222px;”>
• 深度神经网字模型
型号顺序()
模型。添加(密集(128input_shape+(len(train_x=0激活='relu')
模型。添加(掉部 (0.5)
模型。添加(密集(64激活="relu"))
模型。添加(丢弃(0
9896px;”>
模型。添加(密集(len(train_y=0激活="软最大值")
• 编译模型。SGD 与 Nesterov 加速梯度为此模型提供了良好的结果
sgdSGD(lr=0.01衰减=1e-6动量=0.9嵌套罗夫=True)
模型。编译(损耗="categorical_crossentropy"优化器=sgd指标="准确性"*)
9896px;”>
他模型。拟合(np.数组(train_xnp.数组(train_y纪元=200batch_size=5详细=1)
模型。保存('chatbot_model.h5'hist)
打印("模型已创建" )
步骤 5.与聊天机器人互动
我们的模型可以聊天了,所以现在让我们在新文件中为我们的聊天机器人创建一个不错的图形用户界面。您可以将文件命名为gui_chatbot。py
在我们的 GUI 文件中,我们将使用 Tkinter 模块构建桌面应用程序的结构,然后捕获用户消息并再次执行一些预处理,然后再将消息输入到我们定型的模型中。
然后,模型将预测用户消息的标记,我们将从意向文件中的响应列表中随机选择响应。
下面是 GUI 文件的完整源代码干导入字网表垫机
垫化器 = 字网表垫()
进口泡菜
将 numpy 导入为 np
从 keras.模型导入load_model
模型 = load_model(”chatbot_model.h5″)
导入 json
导入随机
意图 = json.loads(打开(’意向.json’)read())
单词 = 泡菜.load(打开(”单词.pkl’,”rb”))
类 = 泡菜.load(打开(’类.pkl’,’rb’))
clean_up_sentence(句子):
• 标记模式 – 将单词拆分为数组
sentence_words = nltk.word_tokenize(句子)
• 词干每个单词 – 减少到基本形式
sentence_words = [泽.lemmatize(字.lower()))sentence_words中单词]
返回sentence_words
• 返回单词数组袋:0 或 1 表示句子中存在的单词
bag_of_words(句子、单词、show_details=真):
• 标记模式
sentence_words = clean_up_sentence(句子)
• 单词袋 – 词汇表
袋 = {0}len(单词)
sentence_words 中的 s:
对于 i,枚举中的单词(单词):
如果单词 = s:
• 如果当前单词位于词汇位置,则分配 1
包[i] = 1
如果show_details:
打印(”在袋中找到:%s”% 字)
返回(np.array(袋))
predict_class(句子):
• 低于阈值预测的筛选器
p = bag_of_words(句子、单词、show_details=假)
res = 模型.预测(np.array([p]))[0]
ERROR_THRESHOLD = 0.25
结果 = [i,r] 对于 i,r 在枚举(res)中,如果 r>ERROR_THRESHOLD]
• 排序强度概率
结果.排序(键_lambda x: x{1},反向 =True)
return_list = |
对于结果中的 r:
return_list.app([“意图”:类\r{0},”概率”:str(r_1_)))
返回return_list
def get响应(int,intents_json):
标记 = ints{0}”意图”}
list_of_intents = intents_json[意图]
在list_of_intents:
如果(i’tag’_ 标记):
结果 = 随机.选择(i=”响应”*)
打破
返回结果
#Creating tkinter GUI
进口 tkinter
从 tkinter 导入 |
def 发送():
msg = EntryBox.get(”1.0″,’结束-1c’。条()
条目框.delete(”0.0″,结束)
如果 msg != “”:
聊天框.配置(状态=正常)
ChatBox.插入(结束,”您:”= msg = ‘\n\n’)
ChatBox.config(前景=”#446665″,字体=(”Verdana”,12 )
int = predict_class(msg)
res = get 响应(int,意图)
聊天框配置(状态 = 已禁用)
聊天框. Yview (完)
根 = Tk ()
根. 标题 (”聊天机器人”)
根几何(”400×500″)
根. 可调整大小(宽度 = FALSE,高度 = FALSE)
#Create聊天窗口
ChatBox = 文本(根,bd = 0,BG = “白色”,高度 = “8”,宽度 = “50”,字体 = “Arial”,)
聊天框配置(状态 = 已禁用)
#Bind滚动条到聊天窗口
滚动条 = 滚动条(根,命令 = 聊天框. Yview, 光标 = “心”)
聊天框 [‘ yscroll 命令 ‘] = 滚动条. 集
#Create按钮发送消息
发送按钮 + 按钮 (根, 字体 = (”Verdana”, 12, ‘粗体’), 文本 = “发送”, 宽度 = “12”, 高度 = 5,
BD = 0,bg = “#f9a602″,活动背景 = “#3c9d9b”,FG = “#000000″,
命令 = 发送)
#Create框输入消息
条目框 = 文本(根,bd = 0,BG = “白色”,宽度 = “29”,高度 = “5”,字体 = “Arial”)
#EntryBox. 绑定(”< 返回 >”,发送)
#Place屏幕上的所有组件
滚动条. 位置 (x = 376, y = 6, 高度 = 386)
聊天盒. 地点 (x = 6, y = 6, 高度 = 386, 宽度 = 370)
入口框位置(x = 128,y = 401,高度 = 90,宽度 = 265)
发送按钮. 位置 (x = 6, y = 401, 高度 = 90)
根主循环 () “数据朗 +” 文本/x-Python”*
xxxxxxxxxx
1px;”•进口 nltk
从nltk.干导入字网表垫机
垫机字网表垫 ()
进口泡菜
将numpy导入为np
从喀拉拉邦。模型导入load_model
模型load_model("chatbot_model
9896px;”>
导入json
导入随机
意图json.负载(打开("意图.json")读取()
单词泡菜。负载(打开("单词.pkl",'rb')
类泡菜。负载(打开("类.pkl",'rb')
clean_up_sentence(句子):
1px;”•标记模式 – 将单词拆分为数组
sentence_words·nltk.word_tokenize(句子)
• 词干每个单词 - 减少到基本形式
sentence_words = = =或用器。莱姆马蒂兹(字)。sentence_words中字的较低 |
返回sentence_words
• 返回单词数组袋:0 或 1 表示句子中存在的单词
9896px;”>
• 标记模式
sentence_wordsclean_up_sentence(句子)
• 单词袋 - 词汇表
袋= =0== len(单词)
为sentence_words中:
对于i,枚举中的单词(单词):
9896px;”>
• 如果当前单词位于词汇位置,则分配 1
袋=i1
如果show_details:
打印("在袋中找到: %s"%字)
返回(np. .阵列(袋)
predict_class(句子):
1px;”• = 低于阈值的预测
pbag_of_words(句子单词,show_details=假)
res模型。预测(np. . .数组(*p+)) =0|
ERROR_THRESHOLD0.25
结果==i ,rfori,r在枚举(res如果r>ERROR_THRESHOLD]
• 排序强度概率
1px;”*结果.排序(键=lambda x: x=1°,反向=真)
return_list = |
对于结果中的r :
return_list.追加(="意图"类=r=0"概率"str(r=1+)))
返回return_list
defget 响应(intintents_json):
1px;”•标记= ints=0=“意图”|
list_of_intentsintents_json[意图]
在list_of_intents:
如果(i='标记'标记):
结果随机。选择(i="响应"*)
打破
返回结果
9896px;”>
#Creating tkinter GUI
进口tkinter
从tkinter导入|
def发送():
msg条目盒.获取("1.0","结束 1c")。条 ()
条目框.删除("0.0",结束)
1px;”如果msg! = ”:
聊天框.配置(状态-正常)
聊天框.插入(结束"你:"'''''''''''''''''''''''''''''''''''''''''''''''''''''
聊天框.配置(前景-"#446665"做-("Verdana"12 )
intspredict_class(msg)
9896px;”>
聊天框.插入(结束"机器人:""res"
聊天框.配置(状态-已禁用)
聊天框.yview(完)
根Tk()
标题(“聊天机器人”)
根。几何体("400x500")
根。可调整大小(宽度=FALSE高度=FALSE)
#Create聊天窗口
ChatBox文本(根bd=0bg="白色"高度="8"宽度="50"字体="Arial",)
配置(状态=禁用)
#Bind滚动条到聊天窗口
滚动条滚动条滚动条(根命令=聊天框.yview光标="心")
聊天框="滚动命令"滚动条。设置
#Create按钮发送消息
发送按钮(根字体= ("Verdana",12,"粗体"文本="发送"宽度="12"高度=5,
1px;”[ b=0, bg=“#f9a602″,活动背景=“#3c9d9b”,fg=“#000000”
命令发送)
#Create框输入消息
条目框文本(根bd=0bg="白色",宽度="29"高度="5"字体="Arial")
#EntryBox.bind("<返回>",发送)
1px;”•#Place屏幕上的所有组件
滚动条.地点(x=376,y=6高度=386)
聊天框.地点(x=6,y=6高度=386宽度=370)
条目框.地点(x=128y=401高度=90宽度=265)
发送按钮.地点(x=6y=401高度=90)
1px;”•根。主循环()
使用源代码探索更多Python 项目。
运行聊天机器人
现在我们有两个独立的文件,一个是train_chatbot.py,我们将首先用它来训练模型。
python train_chatbot.py