热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何使用Python构建Chatbot项目

聊天机器人对企业组织和客户都非常有帮助。大多数人都喜欢直接从聊天室进行交谈,而不是致电服务中心。Facebook发布的数据证明了机器人的价值。每月在人与公司之间发送的

聊天机器人对企业组织和客户都非常有帮助。 大多数人都喜欢直接从聊天室进行交谈,而不是致电服务中心。 Facebook发布的数据证明了机器人的价值。 每月在人与公司之间发送的消息超过20亿条。 HubSpot研究表明,有71%的人希望通过消息传递应用程序获得客户支持。 这是解决问题的快速方法,因此聊天机器人在组织中拥有光明的前景。

今天,我们将在Chatbot上构建一个令人兴奋的项目。 我们将从头开始实现一个聊天机器人,该聊天机器人将能够理解用户在说什么并给出适当的响应。

先决条件

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

pip install tensorflow keras pickle nltk 

Python备忘单- 免费学习Python的主要指南

聊天机器人如何工作?

聊天机器人不过是一种智能软件,可以像人类一样与人互动和交流。 有趣吗? 现在让我们了解它们的实际工作原理。 所有聊天机器人都属于NLP(自然语言处理)概念。 NLP由两部分组成:

  1. NLU(自然语言理解):机器理解人类语言(如英语)的能力。
  2. NLG(自然语言生成):机器生成类似于人类书面句子的文本的能力。

向用户向聊天机器人提问的图像:“嘿,今天的新闻是什么? 聊天机器人会将用户句子分为两部分:意图和实体。 该句子的意图可能是get_news,因为它表示用户想要执行的操作。 实体会告知有关意图的详细信息,因此“今天”将是实体。 因此,使用这种机器学习模型来识别聊天的意图和实体。

项目文件结构

项目完成后,将剩下所有这些文件。 让我们快速浏览它们中的每一个,它将使您对项目的实施方式有一个了解。

  1. Train_chatbot.py-在此文件中,我们将构建和训练深度学习模型,该模型可以分类和识别用户对机器人的要求。
  2. Gui_Chatbot.py-该文件是我们将在其中建立图形用户界面以与我们训练有素的聊天机器人聊天的地方。
  3. Intents.json-Intents文件包含我们将用于训练模型的所有数据。 它包含标签的集合及其相应的模式和响应。
  4. Chatbot_model.h5-这是一个分层数据格式文件,我们在其中存储了经过训练的模型的权重和体系结构。
  5. Classes.pkl-泡菜文件可用于存储所有标签名称,以便在我们预测消息时进行分类。
  6. Words.pkl- words.pkl泡菜文件包含所有唯一单词,这些单词都是我们模型的词汇。

下载源代码和数据集

如何建立自己的聊天机器人?

我通过5个步骤简化了此聊天机器人的构建:

步骤1.导入库并加载数据 -创建一个新的python文件并将其命名为train_chatbot,然后我们将导入所有必需的模块。 之后,我们将在python程序中读取JSON数据文件。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.optimizers import SGD
import random
import nltk
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
import json
import pickle
intents_file = open( 'intents.json' ).read()
intents = json.loads(intents_file)

这是我们的意图文件的外观。

步骤2.预处理数据

该模型无法获取原始数据。 它必须经过很多预处理才能使机器容易理解。 对于文本数据,有许多可用的预处理技术。 第一种技术是令牌化,其中我们将句子分解为单词。

通过观察意图文件,我们可以看到每个标签都包含一个模式和响应列表。 我们标记每个模式并将单词添加到列表中。 另外,我们创建一个类和文档的列表,以添加与模式关联的所有意图。

words=[]
classes = []
documents = []
ignore_letters = [ '!' , '?' , ',' , '.' ]
for intent in intents[ 'intents' ]:for pattern in intent[ 'patterns' ]:#tokenize each wordword = nltk.word_tokenize(pattern)words.extend(word)#add documents in the corpusdocuments.append((word, intent[ 'tag' ]))# add to our classes listif intent[ 'tag' ] not in classes:classes.append(intent[ 'tag' ])
print(documents)

另一种技术是放缩。 我们可以将单词转换为引理形式,以便我们可以减少所有规范的单词。 例如,单词play,play,play,play等都将全部替换为play。 这样,我们可以减少词汇量中的总单词数。 因此,现在我们对每个词进行词素化并删除重复的词。

# lemmaztize and lower each word and remove duplicates
words = [lemmatizer.lemmatize(w.lower()) for w in words if w not in ignore_letters]
words = sorted(list(set(words)))
# sort classes
classes = sorted(list(set(classes)))
# documents = combination between patterns and intents
print (len(documents), "documents" )
# classes = intents
print (len(classes), "classes" , classes)
# words = all words, vocabulary
print (len(words), "unique lemmatized words" , words)
pickle.dump(words,open( 'words.pkl' , 'wb' ))
pickle.dump(classes,open( 'classes.pkl' , 'wb' ))

最后,单词包含我们项目的词汇,而类包含要分类的全部实体。 为了将python对象保存在文件中,我们使用了pickle.dump()方法。 这些文件在培训结束后将很有帮助,我们可以预测聊天记录。

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

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

# create the training data
training = []
# create empty array for the output
output_empty = [ 0 ] * len(classes)
# training set, bag of words for every sentence
for doc in documents:# initializing bag of wordsbag = []# list of tokenized words for the patternword_patterns = doc[ 0 ]# lemmatize each word - create base word, in attempt to represent related wordsword_patterns = [lemmatizer.lemmatize(word.lower()) for word in word_patterns]# create the bag of words array with 1, if word is found in current patternfor word in words:bag.append( 1 ) if word in word_patterns 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 ])] = 1training.append([bag, output_row])
# shuffle the features and make numpy array
random.shuffle(training)
training = np.array(training)
# create training and testing lists. X - patterns, Y - intents
train_x = list(training[:, 0 ])
train_y = list(training[:, 1 ])
print( "Training data is created" )

步骤4.训练模型

我们模型的架构将是由3个密集层组成的神经网络。 第一层具有128个神经元,第二层具有64个神经元,最后一层将具有与类数相同的神经元。 引入了辍学层以减少模型的过拟合。 我们使用了SGD优化器并拟合了数据以开始训练模型。 完成200个纪元的训练后,我们然后使用Keras model.save(“ chatbot_model.h5”)函数保存训练后的模型。

# deep neural networds model
model = Sequential()
model.add(Dense( 128 , input_shape=(len(train_x[ 0 ]),), activation= 'relu' ))
model.add(Dropout( 0.5 ))
model.add(Dense( 64 , activation= 'relu' ))
model.add(Dropout( 0.5 ))
model.add(Dense(len(train_y[ 0 ]), activation= 'softmax' ))
# Compiling model. SGD with Nesterov accelerated gradient gives good results for this model
sgd = SGD(lr= 0.01 , decay= 1e-6 , momentum= 0.9 , nesterov= True )
model.compile(loss= 'categorical_crossentropy' , optimizer=sgd, metrics=[ 'accuracy' ])
#Training and saving the model 
hist = model.fit(np.array(train_x), np.array(train_y), epochs= 200 , batch_size= 5 , verbose= 1 )
model.save( 'chatbot_model.h5' , hist)
print( "model is created" )

步骤5.与聊天机器人进行交互

我们的模型已经准备好聊天,因此现在让我们在新文件中为聊天机器人创建一个漂亮的图形用户界面。 您可以将文件命名为gui_chatbot.py

在我们的GUI文件中,我们将使用Tkinter模块构建桌面应用程序的结构,然后我们将捕获用户消息并再次执行一些预处理,然后再将消息输入到经过训练的模型中。

然后,该模型将预测用户消息的标签,我们将从intent文件中的响应列表中随机选择响应。

这是GUI文件的完整源代码。

import nltk
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
import pickle
import numpy as np
from keras.models import load_model
model = load_model( 'chatbot_model.h5' )
import json
import random
intents = json.loads(open( 'intents.json' ).read())
words = pickle.load(open( 'words.pkl' , 'rb' ))
classes = pickle.load(open( 'classes.pkl' , 'rb' ))
def clean_up_sentence (sentence) :# tokenize the pattern - splitting words into arraysentence_words = nltk.word_tokenize(sentence)# stemming every word - reducing to base formsentence_words = [lemmatizer.lemmatize(word.lower()) for word in sentence_words]return sentence_words
# return bag of words array: 0 or 1 for words that exist in sentence
def bag_of_words (sentence, words, show_details=True) :# tokenizing patternssentence_words = clean_up_sentence(sentence)# bag of words - vocabulary matrixbag = [ 0 ]*len(words)  for s in sentence_words:for i,word in enumerate(words):if word == s: # assign 1 if current word is in the vocabulary positionbag[i] = 1if show_details:print ( "found in bag: %s" % word)return (np.array(bag))
def predict_class (sentence) :# filter below  threshold predictionsp = bag_of_words(sentence, words,show_details= False )res = model.predict(np.array([p]))[ 0 ]ERROR_THRESHOLD = 0.25results = [[i,r] for i,r in enumerate(res) if r>ERROR_THRESHOLD]# sorting strength probabilityresults.sort(key= lambda x: x[ 1 ], reverse= True )return_list = []for r in results:return_list.append({ "intent" : classes[r[ 0 ]], "probability" : str(r[ 1 ])})return return_list
def getResponse (ints, intents_json) :tag = ints[ 0 ][ 'intent' ]list_of_intents = intents_json[ 'intents' ]for i in list_of_intents:if (i[ 'tag' ]== tag):result = random.choice(i[ 'responses' ])breakreturn result
#Creating tkinter GUI
import tkinter
from tkinter import *
def send () :msg = EntryBox.get( "1.0" , 'end-1c' ).strip()EntryBox.delete( "0.0" ,END)if msg != '' :ChatBox.config(state=NORMAL)ChatBox.insert(END, "You: " + msg + '\n\n' )ChatBox.config(foreground= "#446665" , font=( "Verdana" , 12 ))ints = predict_class(msg)res = getResponse(ints, intents)ChatBox.insert(END, "Bot: " + res + '\n\n' )ChatBox.config(state=DISABLED)ChatBox.yview(END)
root = Tk()
root.title( "Chatbot" )
root.geometry( "400x500" )
root.resizable(width=FALSE, height=FALSE)
#Create Chat window
ChatBox = Text(root, bd= 0 , bg= "white" , height= "8" , width= "50" , font= "Arial" ,)
ChatBox.config(state=DISABLED)
#Bind scrollbar to Chat window
scrollbar = Scrollbar(root, command=ChatBox.yview, cursor= "heart" )
ChatBox[ 'yscrollcommand' ] = scrollbar.set
#Create Button to send message
SendButton = Button(root, font=( "Verdana" , 12 , 'bold' ), text= "Send" , width= "12" , height= 5 ,bd= 0 , bg= "#f9a602" , activebackground= "#3c9d9b" ,fg= '#000000' ,command= send )
#Create the box to enter message
EntryBox = Text(root, bd= 0 , bg= "white" ,width= "29" , height= "5" , font= "Arial" )
#EntryBox.bind("", send)
#Place all components on the screen
scrollbar.place(x= 376 ,y= 6 , height= 386 )
ChatBox.place(x= 6 ,y= 6 , height= 386 , width= 370 )
EntryBox.place(x= 128 , y= 401 , height= 90 , width= 265 )
SendButton.place(x= 6 , y= 401 , height= 90 )
root.mainloop()

运行聊天机器人

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

python train_chatbot. py

通过源代码探索更多@Python项目

From: https://hackernoon.com/python-chatbot-project-build-your-first-python-project-5mt30mi



推荐阅读
  • 本文介绍了如何使用 Google Colab 的免费 GPU 资源进行深度学习应用开发。Google Colab 是一个无需配置即可使用的云端 Jupyter 笔记本环境,支持多种深度学习框架,并且提供免费的 GPU 计算资源。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 机器学习中的标准化缩放、最小-最大缩放及鲁棒缩放技术解析 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
author-avatar
Sunshine丶米粉_499
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有