← 返回蜂巢洞察

构建您的第一个 Python 聊天机器人项目

介绍 聊天机器人对商业组织和客户都非常有用。大多数人喜欢直接从聊天框聊天,而不是 … Read More

Socrates

Laptop with code on screen

介绍

聊天机器人对商业组织和客户都非常有用。大多数人喜欢直接从聊天框聊天,而不是呼叫服务中心。Facebook发布的数据证明了机器人的价值。每月在人员与公司之间发送超过 20 亿条消息。HubSpot 研究告诉我们,71% 的用户希望从消息应用程序获得客户支持。这是解决他们问题的一种快速方法,因此聊天机器人在组织中有着光明的未来。

今天,我们将在聊天机器人上构建一个令人兴奋的项目。我们将从头开始实施一个聊天机器人,它将能够理解用户正在谈论的内容,并给出适当的响应。

先决条件

为了实现聊天机器人,我们将使用 Keras,这是一个深度学习库,NLTK,这是一个自然语言处理工具包,以及一些有用的库。运行以下命令以确保安装所有库:

pip install tensorflow keras pickle nltk

如果你想免费学习Python,那么这里是学习Python的硕士指南是免费的。

您可能还喜欢:
自行构建:使用 Keras/TensorFlow 模型构建聊天机器人 API

聊天机器人如何工作?

聊天机器人只不过是一个智能软件,可以像人类一样与人互动和沟通。很有趣,不是吗?现在让我们看看它们实际上是如何运作的。

所有聊天机器人都属于 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 数据文件。

Python

xxxxxxxxx
1
14
1
将numpy导入为np
2
从喀拉拉邦。模型导入顺序
3
从喀拉拉邦。图层导入密集激活丢弃
4
从喀拉拉邦。优化器进口SGD
5
导入随机
6

7
8
从nltk.干导入字网表垫机
9
垫机字网表垫 ()
10
导入json
11
进口泡菜
12

13
intents_file打开("意图.json")。读取()
14
意图json.负载(intents_file)
Python

xxxxxxxxx
1
17
字]

2
类= |
3
文档= |
4
ignore_letters ="!'?'',''.']
5

6
意图的意图="意图"*:
7
意图中的模式 ="模式"*:
8
#tokenize每个单词
字] nltk.word_tokenize(图案)

10
单词。扩展(字)
11
#add文件库中的文档
12
文档。追加((字意图="标记"*))
13
• 添加到我们的班级列表
14
如果意图="标记"不在类中:
15
类

9896px;”>

16

17
打印(文档)
另一种技术是莱姆化。我们可以把单词转换成lemma形式,这样我们才能减少所有的规范词。例如,游戏、播放、播放、播放等词都将替换为”播放”。这样,我们可以减少词汇总单词的数量。因此,现在我们对每个单词进行词化并删除重复的单词。
Python

xxxxxxxxx
1
14
1
• 使每个单词都调低并删除重复项
2
单词= = =或用器。莱马西泽(w. . .低w在单词中,如果w不在ignore_letters|
3
字排序(列表(集(单词) )
4
• 排序类
5
类排序(列表(集(类) )
6
7
印刷(文件"文件")
8
• 类 = 意图
9
印刷(len(类" 类"类)
10
• 单词 = 所有单词、词汇
11
印刷(len(单词"独特的语言化单词"单词)
12

13
泡菜。转储(单词,打开('字.pkl' ,'wb')
泡菜。转储(类,打开(‘类.pkl’ ,‘wb’)

最后,单词包含我们项目的词汇量,类包含要分类的总实体。为了在文件中保存 python 对象,我们使用 pickle.dump() 方法。这些文件将有所帮助后,培训完成,我们预测聊天。

步骤 3.创建培训和测试数据

为了训练模型,我们将每个输入模式转换为数字。首先,我们将对模式的每个单词进行表化,并创建与总单词数长度相同的零列表。我们将值 1 设置为仅那些包含模式中单词的索引。同样,我们将通过将 1 设置为模式所属的类输入来创建输出。

Python

xxxxxxxxxx
1
27
1
• 创建培训数据
2
培训[ ]
3
• 为输出创建空数组
4
output_empty = =0=len(类)
• 训练套装,每个句子的单词袋

6
文档中的文档 :
7
• 初始化单词袋
8
袋[ ]
9
• 模式的标记化单词列表
10
word_patterns文档=0|
11
• 使每个单词都完记 - 创建基词,试图表示相关单词
12
word_patterns == =

下())字在word_patterns|

13
• 如果在当前模式中找到单词,则创建具有 1 的单词包数组
14
字里行:
15
袋。追加(1如果单词在word_patterns其他袋。追加(0)
16
17
• 输出是每个标记的"0",当前标记的输出为"1"(对于每个模式)
18
output_row列表(output_empty)
output_row]类.索引(文档=1+)= = 1

20
培训。追加(*袋output_row*)
21
• 随机播放要素,使 numpy 数组
22
随机的.洗牌(培训)
23
培训np.数组(训练)
24
• 创建培训和测试列表。X - 模式,Y - 意图
25
train_x列表(培训[:,0])
train_y =列表(培训#:,1*)

27
打印("创建训练数据")

步骤 4.训练模型

我们的模型的体系结构将是一个由 3 个密集层组成的神经网络。第一层有128个神经元,第二层有64个神经元,最后一层的神经元与类数相同。引入掉板图层以减少模型的过度拟合。我们使用 SGD 优化器并拟合数据来开始模型的训练。完成 200 个纪元的训练后,我们使用 Keras 模型保存训练的模型 chatbot_model。

Python

xxxxxxxxx
1
17
1
• 深度神经网字模型
2
型号顺序()
3
模型。添加(密集(128input_shape+(len(train_x=0激活='relu')
4
模型。添加(掉部 (0.5)
5
模型。添加(密集(64激活="relu"))
6
模型。添加(丢弃(0

9896px;”>

7
模型。添加(密集(len(train_y=0激活="软最大值")
8

9
• 编译模型。SGD 与 Nesterov 加速梯度为此模型提供了良好的结果
10
sgdSGD(lr=0.01衰减=1e-6动量=0.9嵌套罗夫=True)
11
模型。编译(损耗="categorical_crossentropy"优化器=sgd指标="准确性"*)
12

13
14
他模型。拟合(np.数组(train_xnp.数组(train_y纪元=200batch_size=5详细=1)
15
模型。保存('chatbot_model.h5'hist)
16

17
打印("模型已创建" )

步骤 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
1
109
进口 nltk

2
从nltk.干导入字网表垫机
3
垫机字网表垫 ()
4
进口泡菜
5
将numpy导入为np
6

7
从喀拉拉邦。模型导入load_model
8
模型load_model("chatbot_model

9896px;”>

9
导入json
10
导入随机
11
意图json.负载(打开("意图.json")读取()
12
单词泡菜。负载(打开("单词.pkl",'rb')
13
类泡菜。负载(打开("类.pkl",'rb')
14

15
clean_up_sentence(句子):
标记模式 – 将单词拆分为数组

17
sentence_words·nltk.word_tokenize(句子)
18
• 词干每个单词 - 减少到基本形式
19
sentence_words = = =或用器。莱姆马蒂兹(字)。sentence_words中字的较低 |
20
返回sentence_words
21
• 返回单词数组袋:0 或 1 表示句子中存在的单词
22

23
24
• 标记模式
25
sentence_wordsclean_up_sentence(句子)
26
• 单词袋 - 词汇表
27
袋= =0== len(单词)
28
为sentence_words中:
29
对于i,枚举中的单词(单词):
30
31
• 如果当前单词位于词汇位置,则分配 1
32
袋=i1
33
如果show_details:
34
打印("在袋中找到: %s"%字)
35
返回(np. .阵列(袋)
36

37
predict_class(句子):
= 低于阈值的预测

39
pbag_of_words(句子单词,show_details=假)
40
res模型。预测(np. . .数组(*p+)) =0|
41
ERROR_THRESHOLD0.25
42
结果==i ,rfori,r在枚举(res如果r>ERROR_THRESHOLD]
43
• 排序强度概率
结果.排序(键=lambda x: x=1°,反向=真)

45
return_list = |
46
对于结果中的r :
47
return_list.追加(="意图"类=r=0"概率"str(r=1+)))
48
返回return_list
49

50
defget 响应(intintents_json):
标记= ints=0=“意图”|

52
list_of_intentsintents_json[意图]
53
在list_of_intents:
54
如果(i='标记'标记):
55
结果随机。选择(i="响应"*)
56
打破
57
返回结果
59
#Creating tkinter GUI
60
进口tkinter
61
从tkinter导入|
62

63
def发送():
64
msg条目盒.获取("1.0","结束 1c")。条 ()
65
条目框.删除("0.0",结束)
66

msg! = ”:

68
聊天框.配置(状态-正常)
69
聊天框.插入(结束"你:"'''''''''''''''''''''''''''''''''''''''''''''''''''''
70
聊天框.配置(前景-"#446665"做-("Verdana"12 )
71

72
intspredict_class(msg)
73
74
75
聊天框.插入(结束"机器人:""res"        
76

77
聊天框.配置(状态-已禁用)
78
聊天框.yview(完)
79

80
根Tk()
81
标题(“聊天机器人”)

82
根。几何体("400x500")
83
根。可调整大小(宽度=FALSE高度=FALSE)
84

85
#Create聊天窗口
86
ChatBox文本(根bd=0bg="白色"高度="8"宽度="50"字体="Arial",)
87

88
配置(状态=禁用)

89

90
#Bind滚动条到聊天窗口
91
滚动条滚动条滚动条(根命令=聊天框.yview光标="心")
92
聊天框="滚动命令"滚动条。设置
93

94
#Create按钮发送消息
95
发送按钮(根字体= ("Verdana",12,"粗体"文本="发送"宽度="12"高度=5,
b=0, bg=“#f9a602″,活动背景=“#3c9d9b”,fg=“#000000”

97
命令发送)
98

99
#Create框输入消息
100
条目框文本(根bd=0bg="白色",宽度="29"高度="5"字体="Arial")
101
#EntryBox.bind("<返回>",发送)
102

#Place屏幕上的所有组件

104
滚动条.地点(x=376,y=6高度=386)
105
聊天框.地点(x=6,y=6高度=386宽度=370)
106
条目框.地点(x=128y=401高度=90宽度=265)
107
发送按钮.地点(x=6y=401高度=90)
108

根。主循环()

使用源代码探索更多Python 项目。

运行聊天机器人

现在我们有两个独立的文件,一个是train_chatbot.py,我们将首先用它来训练模型。

python train_chatbot.py

进一步阅读

4 自然语言处理的业务应用程序

使用专家系统构建聊天机器人

相关文章