آموزش توسعه چت ربات های ساده با استفاده از پایتون و یادگیری عمیق
چتبات یک برنامه (نرم افزار) است که برای مدیریت یک مکالمه چت آنلاین از طریق قالب متن یا متن به گفتار استفاده می شود. بیشتر چت ربات ها به صورت آنلاین از طریق وب سایت ها یا کمک های مختلف (مجازی) با یک پنجره بازشو قابل دسترسی هستند.
در این نوشته به نحوه ساخت یک چتبات میپردازیم.ترتیب موارد ارائه شده به قرار زیر است:
- داده ها و کتابخانه ها
- آموزش چت بات را راه اندازی کنید.
- مدل یادگیری عمیق را بسازید.
- رابط کاربری گرافیکی چت بات را بسازید
- چتبات را اجرا کنید.
دادهها و کتابخانهها
برای اجرای چت بات خود به اجزای زیر نیاز داریم.
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 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.