使用Python,我们可以实现很多目标,比如构建一个专属于你的聊天机器人程序。聊天机器人不仅满足个人需求,它们对商业组织和客户也很有帮助。大多数人更喜欢直接通过聊天室交谈,而不是致电服务中心。Facebook发布的数据证明了机器人的价值。每月在人与企业之间发送超过20亿条消息。根据HubSpot研究,71%的人希望消息应用程序提供客户支持。这是解决问题的快速方法,因此聊天机器人在组织中有着光明的未来。今天要做的是在Chatbot上构建一个令人兴奋的项目。从头开始创建一个聊天机器人,它能够理解用户在说什么并做出适当的回应。先决条件要实现聊天机器人,我们将使用深度学习库Keras、自然语言处理工具包NLTK和一些有用的库。运行以下命令以确保安装了所有库:pipinstalltensorflowkeraspicklenltk聊天机器人如何工作?聊天机器人只是智能软件,可以像人一样与人互动和交流。很有趣,不是吗?现在让我们看看它们是如何工作的。所有聊天机器人都基于自然语言处理(NLP)概念。NLP由两部分组成:NLU(自然语言理解):机器理解人类语言(例如英语)的能力。NLG(自然语言生成):机器生成类似于人类书写句子的文本的能力。想象一下,用户问聊天机器人一个问题:“嘿,今天有什么新闻?”聊天机器人将用户语句分解为两部分:意图和实体。这句话的目的大概是获取消息,因为它指的是用户想要执行的动作。该实体说明了有关意图的细节,因此“今天”将是该实体。因此,这里使用机器学习模型来识别聊天的意图和实体。项目文件结构所有这些文件都是在项目完成后留下的。快速浏览每一个。它将让开发人员了解如何实施该项目。Train_chatbot.py-在此文件中,构建和训练深度学习模型,该模型可以对用户向机器人发出的请求进行分类和识别。Gui_Chatbot.py-此文件是构建GUI以与训练有素的聊天机器人聊天的地方。Intents.json-Intents文件包含将用于训练模型的所有数据。它包含一组标签及其相应的模式和响应。Chatbot_model.h5-这是一个分层数据格式文件,其中存储了训练模型的权重和架构。Classes.pkl-pickle文件可用于存储预测消息时要分类的所有标记名。Words.pkl-Words.pklpickle文件包含模型词汇表中的所有唯一单词。下载源代码和数据集:mailto:https://drive.google.com/drive/folders/1r6MrrdE8V0bWBxndGfJxJ4Om62dJ2OMP?usp=sharing如何构建自己的聊天机器人?作者将这个聊天机器人的构建简化为5个步骤:第一步:导入库和加载数据创建一个新的python文件并将其命名为train_chatbot,然后导入所有需要的模块。之后,从Python程序中读取JSON数据文件。importnumpyasnpfromkeras.modelsimportSequentialfromkeras.layersimportDense,Activation,Dropoutfromkeras.optimizersimportSGDimportrandomimportnltkfromnltk.stemimportWordNetLemmatizerlemmatizer=WordNetLemmatizer()importjsonimportpickleintents_file=open('intents.json').read()intents=json.loads(intents_file)第二步:数据预处理模型无法获取原始数据。为了让机器更容易理解,它必须经过大量的预处理。对于文本数据,有许多可用的预处理技术。第一种技术是标记化,它将句子分解成单词。通过查看intents文件,您可以看到每个标签都包含一个模式和响应列表。标记每个模式并将单词添加到列表中。此外,创建一个类和文档列表以添加与架构相关的所有意图。words=[]classes=[]documents=[]ignore_letters=['!','?',',','.']forintentinintents['intents']:forpatterninintent['patterns']:#tokenizeeachwordword=nltk。word_tokenize(模式)words.extend(word)#adddocumentsinthecorpusdocuments.append((word,intent['tag']))#addtoourclasseslistifintent['tag']notinclasses:classes.append(intent['tag'])print(文档)另一种技术是词形还原。我们可以将单词转换为引理形式,从而减少所有规范单词。例如,play、playing、playing、played等词都会被play代替。这样,可以减少词汇表中的单词总数。所以引理每个单词并删除重复的单词。#lemmaztizeandlowereachwordandremovedduplicateswords=[lemmatizer.lemmatize(w.lower())forwinwordsifwnotinignore_letters]words=sorted(list(set(words)))#sortclassesclasses=sorted(list(set(classes)))#documents=combinationbetweenpatternsandintentsprint(len(文档)“文档”)#classes=intentsprint(len(classes),“classes”,classes)#words=allwords,vocabularyprint(len(words),“uniquelemmatizedwords”,words)pickle.dump(words,open('words。pkl','wb'))pickle.dump(classes,open('classes.pkl','wb'))最后,单词包含项目的词汇表,类包含所有要分类的实体。为了将python对象保存在文件中,请使用pickle.dump()方法。这些文件将在训练完成后用于预测聊天。第3步:创建训练和测试集要训练模型,请将每个输入模式转换为数字。首先,为模式中的每个单词做一个引理,并创建一个长度与单词总数相同的零列表。仅将值1设置为那些在模式中包含单词的索引。同样,将1设置为模式所属的类输入,以创建输出。#createthetrainingdatatraining=[]#createemptyarrayfortheoutputoutput_empty=[0]*len(classes)#trainingset,bagofwordsforeverysentencefordocuments:#initializingbagofwordsbag=[]#listoftokenizedwordsforthepatternword_patterns=doc[0]#lemmatizeeachword-createbaseword,inattempttorepresentrelatedwordsword_patterns=[lemmatizerword.lower()(词形化器word.lower())forwordinword_patterns]#createthebagofwordsarraywith1,ifwordisfoundincurrentpatternforwordinwords:bag.append(1)ifwordinword_patternselsebag.append(0)#outputisa'0'foreachtagand'1'forcurrenttag(foreachpattern)output_row=list(output_empty)outputind_row[类]]=1training.append([包,output_row])#shufflethefeaturesandmakenumpyarrayrandom.shuffle(训练)training=np.array(训练)#createtrainingandtestinglists.X-patterns,Y-intentstrain_x=list(training[:,0])train_y=list(训练[:,1])print("Trainingdataiscreated")第4步:训练模型该模型将是一个由3个密集层组成的神经网络。第一层有128个神经元,第二层有64个,最后一层的神经元数与类数相同。为了减少模型的过拟合,引入了dropout层。使用SGD优化器并拟合数据以开始模型的训练。200个训练周期完成后,使用Kerasmodel.save("chatbot_model.h5")函数保存训练模型。#deepneuralnetwordsmodelmodel=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'))#Compilingmodel.SGDwithNesterovacceleratedgradientgivesgoodresultsforthismodelsgd=SGD(lr=0.01,decay)=1e-6,momentum=0.9,nesterov=True)model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])#Trainingandsavingthemodelhist=model.fit(np.array(train_x),np.array(train_y),epochs=200,batch_size=5,verbose=1)model.save('chatbot_model.h5',hist)print("modeliscreated")第5步:与聊天机器人交互模型已准备好聊天,现在在新文件中为聊天机器人创建一个漂亮的GUI。您可以将文件命名为gui_chatbot.py在GUI文件中,使用Tkinter模块构建桌面应用程序的结构,然后捕获用户消息,并在将消息输入训练模型之前再次执行一些预处理。然后该模型将预测用户消息的标签,从意图文件中的响应列表中随机选择一个响应。这是GUI文件的完整源代码。importnltkfromnltk.stemimportWordNetLemmatizerlemmatizer=WordNetLemmatizer()importpickleimportnumpyasnpfromkeras.modelsimportload_modelmodel=load_model('chatbot_model.h5')importjsonimportrandomintents=json.loads(open('intents.json').read())words=pickle.load(open('words.pkl)','rb'))classes=pickle.load(open('classes.pkl','rb'))defclean_up_sentence(sentence):#tokenizethepattern-splittingwordsintoarraysentence_words=nltk.word_tokenize(sentence)#stemmingeveryword-reducingtobaseformsentence_words=[lemmatizer。lemmatize(word.lower())forwordinsentence_words]returnssentence_words#returnbagofwordsarray:0or1forwordsthatexistinsentencedefbag_of_words(sentence,words,show_details=True):#tokenizingpatternssentence_words=clean_up_sentence(sentence)#bagofwords-vocabularymatrixbag=[0]*enerate(words)forsine_words(词)(单词):ifword==s:#assign1ifcurrentwordisinthevocabularypositionbag[i]=1ifshow_details:print("foundinbag:%s"%word)return(np.array(bag))defpredict_class(sentence):#filterbelowthresholdpredictionsp=bag_of_words(sentence,words,show_details=False)res=model.predict(np.array([p]))[0]ERROR_THRESHOLD=0.25results=[[i,r]fori,rinenumerate(res)ifr>ERROR_THRESHOLD]#sortingstrengthprobabilityresults.sort(key=lambdax:x[1],reverse=True)return_list=[]forrinresults:return_list.append({"intent":classes[r[0]],"概率":str(r[1])})returnreturn_listdefgetResponse(ints,intents_json):tag=ints[0]['intent']list_of_intents=intents_json['intents']foriinlist_of_intents:if(i['tag']==tag):result=random.choice(i['responses'])breakreturnresult#CreatingtkinterGUIimporttkinterfromtkinterimport*defsend():msg=EntryBox.get("1.0",'end-1c').strip()EntryBox。delete("0.0",END)ifmsg!='':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)#CreateChatwindowChatBox=Text(root,bd=0,bg="white",height="8",width="50",font="宋体",)ChatBox.config(state=DISABLED)#BindscrollbartoChatwindowscrollbar=滚动条(root,command=ChatBox.yview,cursor="heart")ChatBox['yscrollcommand']=scrollbar.set#CreateButtontosendmessageSendButton=Button(root,font=("Verdana",12,'bold'),text="Send",width="12",height=5,bd=0,bg="#f9a602",activebackground="#3c9d9b",fg='#000000',command=send)#CreatetheboxtoentermessageEntryBox=Text(root,bd=0,bg="white",width="29",height="5",font="Arial")#EntryBox.bind("
