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

chatbot使用_如何使用Python构建Chatbot项目

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

chatbot使用

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

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

先决条件

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

pipinstall 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(正在播放),playing(正在播放),plays(已播放),played(已播放)等都将被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项目

翻译自: https://hackernoon.com/python-chatbot-project-build-your-first-python-project-5mt30mi

chatbot使用



推荐阅读
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 如何在Linux系统中部署TensorFlow的详细指南
    本文详细介绍了在Linux系统中部署TensorFlow的过程。作者基于北京大学曹建教授的MOOC课程进行学习,但由于课程内容较旧,环境配置方面遇到了不少挑战。经过多次尝试,最终成功解决了这些问题,并总结了一套详细的安装指南,帮助初学者快速上手TensorFlow。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 在Windows命令行中,通过Conda工具可以高效地管理和操作虚拟环境。具体步骤包括:1. 列出现有虚拟环境:`conda env list`;2. 创建新虚拟环境:`conda create --name 环境名`;3. 删除虚拟环境:`conda env remove --name 环境名`。这些命令不仅简化了环境管理流程,还提高了开发效率。此外,Conda还支持环境文件导出和导入,方便在不同机器间迁移配置。 ... [详细]
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
  • 本文详细介绍了在Windows操作系统上使用Python 3.8.5编译支持CUDA 11和cuDNN 8.0.2的TensorFlow 2.3的步骤。文章不仅提供了详细的编译指南,还分享了编译后的文件下载链接,方便用户快速获取所需资源。此外,文中还涵盖了常见的编译问题及其解决方案,确保用户能够顺利进行编译和安装。 ... [详细]
  • 基于TensorFlow的鸢尾花数据集神经网络模型深度解析
    基于TensorFlow的鸢尾花数据集神经网络模型深度解析 ... [详细]
  • TensorFlow基础知识深化讲解
    批标准化批标准化(batchnormalization,BN)是为了克服神经网络层数加深导致难以训练而诞生的。深度神经网络随着深度加深,收 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
author-avatar
YI恐龙_554
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有