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

 一、前言

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

二、正文

项目源代码: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 中实现了聊天机器人的深度学习版本,这是准确的。您可以根据业务需求自定义数据,并非常准确地训练聊天机器人。聊天机器人无处不在,所有企业都期待在他们的工作流程中实施机器人。

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于循环神经网络(RNN)的智能聊天机器人系统可以使用Python编程语言实现。RNN是一种适合处理序列数据的机器学习模型,对于自然语言处理任务特别有用。下面将简要介绍实现智能聊天机器人系统的主要步骤: 1. 数据处理:首先,需要准备用于训练聊天机器人的数据集。可以使用开源的对话语料库或者自己收集一些对话数据。然后,进行数据清洗和预处理,比如去除特殊字符、标记化文本等。 2. 构建词汇表:创建一个词汇表将训练数据中的单词映射到唯一的整数索引。可以使用Python中的库,如NLTK或者spaCy来帮助处理文本和构建词汇表。 3. 序列填充与分批:由于RNN模型需要固定长度输入,在训练之前需要对句子进行填充或截断,使其长度保持一致。然后,将数据集划分为小批次来进行训练。 4. RNN模型构建使用Python中的深度学习库,如TensorFlow、Keras或PyTorch构建RNN模型。常用的RNN类型有LSTM(长短期记忆)和GRU(门控循环单元)。模型的输入是一个独热编码的词向量,通过层叠RNN单元以及全连接层进行训练和预测。 5. 模型训练:将准备好的数据输入到RNN模型中进行训练。使用适当的损失函数(如交叉熵)和优化算法(如Adam),通过反向传播算法不断调整模型的参数。可以定义合适的停止准则或者使用验证集来评估模型的性能,并保存训练好的模型。 6. 智能回答生成:训练好的RNN模型可以用于生成智能回答。通过传入用户的输入,将其转换为词向量后输入到模型中得到预测结果。根据模型输出的概率分布,选择最高概率的单词作为回答的一部分,再将生成的单词添加到输入序列中,重复该过程直到生成完整的回答。 7. 用户交互界面:为了提供友好的用户体验,可以使用Python的GUI库,如Tkinter或PyQt,构建一个简单的聊天界面。用户可以通过界面与机器人进行对话,输入问题并查看机器人的回答。 综上所述,使用Python实现基于循环神经网络的智能聊天机器人系统需要进行数据处理、构建词汇表、RNN模型构建、模型训练、智能回答生成以及用户交互界面搭建等步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值