快来!建立你的第一个Python聊天机器人项目
该模型将是一个由3个密集层组成的神经网络。第一层有128个神经元,第二层有64个,最后一层的神经元数量与类数相同。为了减少模型的过度拟合,引入了dropout层。使用SGD优化器并对数据进行拟合,开始模型的训练。在200个阶段的训练完成后,使用Kerasmodel.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 Nesterovaccelerated 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") 第五步:与聊天机器人互动 模型已经准备好聊天了,现在在一个新文件中为聊天机器人创建一个很好的图形用户界面。可以将文件命名为gui_chatbot.py 在GUI文件中,使用Tkinter模块构建桌面应用程序的结构,然后捕获用户消息,并在将消息输入到训练模型之前,再次执行一些预处理。 然后,模型将预测用户消息的标签,从intents文件的响应列表中随机选择响应。 这是GUI文件的完整源代码。 importnltk fromnltk.stem importWordNetLemmatizer lemmatizer = WordNetLemmatizer() importpickle importnumpy as np fromkeras.models importload_model model= load_model('chatbot_model.h5') importjson importrandom intents= json.loads(open('intents.json').read()) words= pickle.load(open('words.pkl','rb')) classes= pickle.load(open('classes.pkl','rb')) defclean_up_sentence(sentence): # tokenize the pattern - splittingwords into array sentence_words = nltk.word_tokenize(sentence) # stemming every word - reducing tobase form sentence_words = [lemmatizer.lemmatize(word.lower()) for word in sentence_words] returnsentence_words # return bag of words array: 0 or 1for words that exist in sentence defbag_of_words(sentence, words,show_details=True): # tokenizing patterns sentence_words = clean_up_sentence(sentence) # bag of words - vocabulary matrix bag= [0]*len(words) fors in sentence_words: fori,word inenumerate(words): ifword == s: # assign 1 if current word is in thevocabulary position bag[i] = 1 ifshow_details: print("found in bag:%s" % word) return(np.array(bag)) defpredict_class(sentence): # filter below thresholdpredictions p= bag_of_words(sentence,words,show_details=False) res= model.predict(np.array([p]))[0] ERROR_THRESHOLD = 0.25 results= [[i,r] fori,r inenumerate(res) ifr>ERROR_THRESHOLD] # sorting strength probability results.sort(key=lambdax: x[1],reverse=True) return_list = [] forr in results: return_list.append({"intent": classes[r[0]],"probability": str(r[1])}) returnreturn_list defgetResponse(ints, intents_json): tag= ints[0]['intent'] list_of_intents = intents_json['intents'] fori in list_of_intents: if(i['tag']== tag): result= random.choice(i['responses']) break returnresult #Creating tkinter GUI importtkinter fromtkinter import * defsend(): msg= EntryBox.get("1.0",'end-1c').strip() EntryBox.delete("0.0",END) ifmsg != '': ChatBox.config(state=NORMAL) (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |