热门标签 | 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使用



推荐阅读
  • CentOS7通过RealVNC实现多人使用服务器桌面
    背景:公司研发团队通过VNC登录到CentOS服务器的桌面实现软件开发工作为防止数据外泄,需要在RealVNC设置禁止传输文件、访问粘贴板等策略过程&# ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • 如何在微信公众平台集成新浪云服务应用摘要:新浪云服务平台SinaAppEngine(简称SAE)自2009年启动内部研发,并于同年对外开放。本文详细介绍了如何利用SAE的强大功能,在微信公众平台上构建高效、稳定的云服务应用程序,涵盖从环境配置到应用部署的全流程,为开发者提供详尽的技术指导与实践案例。 ... [详细]
  • 本文通过复旦大学自然语言处理课程中的一个具体案例,详细解析了中文词汇分割技术的实现方法。该案例利用Java编程语言,结合词典和算法模型,展示了如何高效地进行中文文本的词汇分割,为相关研究和应用提供了宝贵的参考。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • SDWebImage第三方库学习
    1、基本使用方法异步下载并缓存-(void)sd_setImageWithURL:(nullableNSURL*)urlNS_REFINED_FOR_SWIFT;使用占位图片& ... [详细]
  • TensorFlow Lite在移动设备上的部署实践与优化笔记
    近期在探索如何将服务器端的模型迁移到移动设备上,并记录了一些关键问题和解决方案。本文假设读者具备以下基础知识:了解TensorFlow的计算图(Graph)、图定义(GraphDef)和元图定义(MetaGraphDef)。此外,文中还详细介绍了模型转换、性能优化和资源管理等方面的实践经验,为开发者提供有价值的参考。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 点互信息在自然语言处理中的应用与优化
    点互信息(Pointwise Mutual Information, PMI)是一种用于评估两个事件之间关联强度的统计量,在自然语言处理领域具有广泛应用。本文探讨了 PMI 在词共现分析、语义关系提取和情感分析等任务中的具体应用,并提出了几种优化方法,以提高其在大规模数据集上的计算效率和准确性。通过实验验证,这些优化策略显著提升了模型的性能。 ... [详细]
  • 利用 Python 实现 Facebook 账号登录功能 ... [详细]
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
  • 本文详细介绍了在Windows操作系统上使用Python 3.8.5编译支持CUDA 11和cuDNN 8.0.2的TensorFlow 2.3的步骤。文章不仅提供了详细的编译指南,还分享了编译后的文件下载链接,方便用户快速获取所需资源。此外,文中还涵盖了常见的编译问题及其解决方案,确保用户能够顺利进行编译和安装。 ... [详细]
  • 如何在Linux系统中部署TensorFlow的详细指南
    本文详细介绍了在Linux系统中部署TensorFlow的过程。作者基于北京大学曹建教授的MOOC课程进行学习,但由于课程内容较旧,环境配置方面遇到了不少挑战。经过多次尝试,最终成功解决了这些问题,并总结了一套详细的安装指南,帮助初学者快速上手TensorFlow。 ... [详细]
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社区 版权所有