آموزش توسعه چت ربات های ساده با استفاده از پایتون و یادگیری عمیق
چتبات یک برنامه (نرم افزار) است که برای مدیریت یک مکالمه چت آنلاین از طریق قالب متن یا متن به گفتار استفاده می شود. بیشتر چت ربات ها به صورت آنلاین از طریق وب سایت ها یا کمک های مختلف (مجازی) با یک پنجره بازشو قابل دسترسی هستند.
در این نوشته به نحوه ساخت یک چتبات میپردازیم.ترتیب موارد ارائه شده به قرار زیر است:
- داده ها و کتابخانه ها
- آموزش چت بات را راه اندازی کنید.
- مدل یادگیری عمیق را بسازید.
- رابط کاربری گرافیکی چت بات را بسازید
- چتبات را اجرا کنید.
دادهها و کتابخانهها
برای اجرای چت بات خود به اجزای زیر نیاز داریم.
1. train_chatbot.py: کدنویسی برای خواندن متن/داده های زبان طبیعی در مجموعه آموزشی. همچنین، ما از یک شبکه عصبی متوالی برای ایجاد یک مدل با استفاده از کراس استفاده می کنیم.
2. chat_gui.py: کدی برای ایجاد یک رابط کاربری گرافیکی برای یک چت بات.
3. classes.pkl: در اینجا لیستی از انواع مختلف کلاس های پاسخ آمده است.
4. word.pkl: در اینجا لیستی از کلمات مختلف است که برای تشخیص الگو استفاده می شود.
5. intent.json: لیستی از اشیاء جاوا اسکریپت که دارای برچسب های مختلف با توجه به الگوهای کلمه هستند.
6. chatbot_model.h5: هر مدلی که در train_chatbot.py و chat_gui.py ایجاد کردهایم با h5 ذخیره میشود.
حالا بیایید با فراخوانی تمام کتابخانههای لازم شروع کنیم. ابتدا مطمئن شوید که پایتون را به درستی روی دستگاه خود نصب کرده اید.
import nltk nltk.download('punkt') nltk.download('wordnet') from nltk.stem import WordNetLemmatizer lemmatizer = WordNetLemmatizer() import json import pickle import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation, Dropout from keras.optimizers import SGD import random
در اینجا ما کتابخانه هایی مانند nltk (Natural Language ToolKit) وارد کرده ایم که شامل مجموعه ای کامل از ابزارها برای پاکسازی داده های متنی و آماده سازی آن برای الگوریتم های یادگیری عمیق است.
json که میتواند فایلهای JSON را مستقیماً در پایتون بارگذاری کند.
pickle، که فایل های pickle را بارگذاری می کند،numpy که عملیات جبر خطی را انجام می دهد و keras که چارچوب یا کتابخانه یادگیری عمیق است.
آموزش چت بات را راه اندازی کنید.
اکنون در اینجا میخواهیم تمام لیستهایی را که میتوانیم دادهها/متن زبان طبیعی خود را ذخیره کنیم، مقداردهی اولیه کنیم.
words=[] classes = [] documents = [] ignore_words = ['?', '!'] data = open('intents.json').read() intents = json.loads(data)
ما از ماژول JSON برای بارگیری فایل و ذخیره آن در متغیر “intents” استفاده خواهیم کرد.
for intent in intents['intents']: for pattern in intent['patterns']: # take each word and tokenize it w = nltk.word_tokenize(pattern) words.extend(w) # adding documents documents.append((w, intent['tag'])) # adding classes to our class list if intent['tag'] not in classes: classes.append(intent['tag'])
در قسمت بعدی، لیست کلمات را می گیریم و آن را به صورت کلمه ای می نویسیم و همه کلمات را نیز کوچک می کنیم. به عنوان مثال، کلمات “running”، “runs”همگی لم یکسانی دارند که فقط “راه رفتن” است و آن چیزی جز یک کلمه ریشه ای نیست.
ساخت مدل یادگیری عمیق .
# initializing our training data training = [] output_empty = [0] * len(classes) for doc in documents: # initialize bag of words bag = [] # list of tokenized words for the pattern pattern_words = doc[0] # lemmatize each word pattern_words = [lemmatizer.lemmatize(word.lower()) for word in pattern_words] # create our bag of words array with 1, if word match found in current pattern for w in words: bag.append(1) if w in pattern_words else bag.append(0) # output is a '0' for each tag and '1' for current tag output_row = list(output_empty) output_row[classes.index(doc[1])] = 1 training.append([bag, output_row]) # here shuffle our features and turn into np.array random.shuffle(training) training = np.array(training) # create train and test lists. X_patterns, Y_intents train_x = list(training[:,0]) train_y = list(training[:,1]) print("Training data has created")
ما در اینجا داده های آموزشی را با آموزش متغیر مقداردهی می کنیم. ما همچنین یک ویژگی به نام output_row داریم که کلید لیست است. سپس مجموعه آموزشی خود را بر می زنیم و یک train_test_split با الگوها یعنی x_variable و intent ها یعنی y_variable انجام می دهیم.
# Creating model of 3 layers. First layer contains 128 neurons, second layer contains 64 neurons and 3rd output layer contains number of neurons # equal to number of intents to predict output intent with softmax function 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')) # Compile model. And Stochastic gradient descent 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']) #fitting 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 created")
بنابراین ما با داده های آموزشی و آزمایشی خود آماده هستیم، از یک مدل یادگیری عمیق از کراس به نام مدل Sequential استفاده خواهیم کرد.
هنگامی که مدل آموزش داده شد، کل داده ها به یک آرایه numpy تبدیل می شوند و به عنوان chatbot_model.h5 ذخیره می شوند.
ساخت رابط کاربری گرافیکی چتبات.
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): sentence_words = nltk.word_tokenize(sentence) sentence_words = [lemmatizer.lemmatize(word.lower()) for word in sentence_words] return sentence_words # return bag of words array: 0 or 1 for each word in the bag that exists in the sentence def bow(sentence, words, show_details=True): # tokenize the pattern sentence_words = clean_up_sentence(sentence) # bag of words - matrix of N words, vocabulary matrix bag = [0]*len(words) for s in sentence_words: for i,w in enumerate(words): if w == s: # assign 1 if current word is in the vocabulary position bag[i] = 1 if show_details: print ("found in bag: %s" % w) return(np.array(bag)) def predict_class(sentence, model): # filter out predictions below a threshold p = bow(sentence, words,show_details=False) res = model.predict(np.array([p]))[0] ERROR_THRESHOLD = 0.25 results = [[i,r] for i,r in enumerate(res) if r>ERROR_THRESHOLD] # sort by strength of probability results.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']) break return result def chatbot_response(msg): ints = predict_class(msg, model) res = getResponse(ints, intents) return res
در اینجا ما به برخی از توابع نیاز داریم که برای اجرای رابط کاربری گرافیکی و اتصال آنها به واحدها ضروری هستند. ما تابع clean_up_sentence را داریم که هر جمله ای را پاک می کند (وارد شده). تابع bow برای ایجاد بسته کلمات استفاده می شود.
تابع getResponse لیست خروجی را می گیرد و فایل JSON را بررسی می کند و پاسخ را با احتمال (بالاترین) خروجی می دهد.
در نهایت، chatbot_response ما یک پیام (ورودی از طریق رابط کاربری گرافیکی) می گیرد و کلاس را با تابع ()predict_class پیش بینی می کند. اکنون می توانیم چیزی را به صورت متن به ربات بگوییم و ربات پس از آن پاسخ خواهد داد.
#Creating GUI with tkinter import tkinter from tkinter import * def send(): msg = EntryBox.get("1.0",'end-1c').strip() EntryBox.delete("0.0",END) if msg != '': ChatLog.config(state=NORMAL) ChatLog.insert(END, "You: " + msg + 'nn') ChatLog.config(foreground="#442265", font=("Verdana", 12 )) res = chatbot_response(msg) ChatLog.insert(END, "Bot: " + res + 'nn') ChatLog.config(state=DISABLED) ChatLog.yview(END) base = Tk() base.title("Hello")#by default base.geometry("400x500") base.resizable(width=FALSE, height=FALSE) #Create Chat window ChatLog = Text(base, bd=0, bg="white", height="8", width="50", font="Arial",) ChatLog.config(state=DISABLED) #Binding scrollbar to Chat window scrollbar = Scrollbar(base, command=ChatLog.yview, cursor="heart") ChatLog['yscrollcommand'] = scrollbar.set #Create Button to send message SendButton = Button(base, font=("Verdana",12,'bold'), text="Send", width="12", height=5, bd=0, bg="#32de97", activebackground="#3c9d9b",fg='#ffffff', command= send ) #Create the box to enter message EntryBox = Text(base, bd=0, bg="white",width="29", height="5", font="Arial") #EntryBox.bind("<Return>", send) #Place all components on the screen;you can change its heightand width scrollbar.place(x=376,y=6, height=386) ChatLog.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) base.mainloop()
همچنین میتوانیم رابط کاربری گرافیکی خود را با tkinter (کتابخانه) ایجاد کنیم، و کتابخانه پایتون به ما اجازه ایجاد آن را میدهد.
چتبات را اجرا کنید.
در نهایت، ما می توانیم چت بات خود را اجرا کنیم.
1 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.