چتبات خودت رو بساز!

چتبات(chatbot) چیست
چتبات (chatbot) چیست؟

چتبات یک نرم افزار هوشمند است که قادر به برقراری ارتباط و انجام کارهایی مشابه انسان است. از چتبات‌ها در بخش ارتباط با مشتری ، بازاریابی در سایت‌های شبکه‌های اجتماعی و پشتیبانی آنلاین مشتری استفاده می شود. بر اساس نحوه ساخت آنها دو نوع اساسی وجود دارد. مدل‌های مبتنی بر بازیابی و تولید.

چت

چتبات مبتنی بر بازیابی

چت بات مبتنی بر بازیابی از الگوها و پاسخ‌های ورودی از پیش تعریف شده استفاده می‌کند. سپس از نوعی رویکرد ابتکاری برای انتخاب پاسخ مناسب استفاده می کند. این نوع در صنعت به طور گسترده‌ای مورد استفاده قرار می گیرد تا چت بات‌های هدف گرا ایجاد کند که در آن بتوانیم لحن و جریان چت بات را به صورت دلخواه تنظیم کنیم.

چتبات (chatbot) مبتنی بر تولید

مدلهای تولیدی براساس پاسخ‌های از پیش تعریف شده نیستند. بلکه براساس شبکه‌های عصبی ترتیبی ساخته شده‌اند. این همان ایده ترجمه زبانی در ماشین است. در ترجمه ماشینی ، ما منبع را از یک زبان به زبان دیگر ترجمه می کنیم اما در اینجا ، ما می خواهیم ورودی را به یک خروجی تبدیل کنیم. این روش به مقدار زیادی داده نیاز دارد و مبتنی بر شبکه‌های عصبی عمیق است.

در مورد پردازش تصویر و منابع یادگیری آن بیشتر بدانید

پروژه چتبات (chatbot) پایتون

در این پروژه پایتون ، ما قصد داریم یک چتبات با استفاده از تکنیک‌های یادگیری عمیق بسازیم. چتبات بر روی مجموعه داده‌ا‌ی که شامل دسته‌ها (اهداف) ، الگو و پاسخ‌ها است آموزش می یابد. ما برای طبقه بندی پیام کاربر در هر گروه از یک شبکه عصبی عمیق (LSTM) استفاده می کنیم و سپس از لیست پاسخ‌های متناسب با هر هدف یک پاسخ تصادفی را انتخاب می‌کنیم. حال یک چتبات مبتنی بر بازیابی با استفاده از NLTK ، Keras  و Python ایجاد می‌کنیم.

مجموعه داده

مجموعه داده‌ای که ما از آن استفاده خواهیم کرد “intents.json” است. این یک فایل JSON است که شامل الگوهایی است که باید پیدا کنیم و طبق آن پاسخی را به کاربر برگردانیم. لینک این پروژه در اینجا پیوست شده است.

پیش نیازها

این پروژه مستلزم داشتن دانش کافی در زمینه پایتون ، کراس و پردازش زبان طبیعی (NLTK) است. در کنار آنها ، ما از چند ماژول کمکی استفاده خواهیم کرد که می‌توانید با استفاده از دستور python-pip آن‌را بارگیری کنید.

pip install tensorflow, keras, pickle, nltk
چگونه در پایتون چتبات بسازیم؟

اکنون ما قصد داریم Chatbot را با استفاده از Python بسازیم اما ابتدا اجازه دهید ساختار فایل و نوع فایل‌هایی که ایجاد خواهیم کرد را ببینیم:

ساخت چتبات (chatbot) با پایتون

 

·        Intents.json

فایل داده‌ای که دارای الگوها و پاسخ‌های از پیش تعریف شده است.

·        train_chatbot.py

در این فایل پایتون ، ما اسکریپتی برای ساخت مدل و آموزش چتبات خود نوشتیم.

·        Words.pkl

این یک فایل pickle است که در آن کلمات Python object را که شامل لیستی از واژگان ما است ذخیره می کنیم.

·        Classes.pkl

فایل pickle کلاس‌ها شامل لیستی از دسته‌ها می باشد.

·        Chatbot_model.h5

این یک مدل آموزش دیده است که شامل اطلاعاتی در مورد مدل است و دارای وزن نورون‌ها است.

·        Chatgui.py

این اسکریپت پایتون است که ما در آن GUI را برای چتبات خود پیاده سازی کردیم. کاربران می توانند به راحتی با ربات ارتباط برقرار کنند.

۲۰ واسط کاربری در یادگیری ماشین و یادگیری عمیق

در اینجا ۵ مرحله برای ایجاد یک چتبات در پایتون از ابتدا آورده شده است:

۱-    فایل داده را بارگیری کنید

۲-    داده های پیش پردازش

۳-    داده های آموزش و آزمایش ایجاد کنید

۴-    مدل را بسازید

۵-    پاسخ را پیش بینی کنید

۶-   چتبات را اجرا کنید

 

 ۱-فایل داده را بارگیری کنید

ابتدا یک فایل به عنوان train_chatbot.py ایجاد کنید. در اینجا پکیج‌های لازم برای چتبات خود را وارد می کنیم. فایل داده در فرمت json است بنابراین ما از پکیج json برای تجزیه فایل json در پایتون استفاده کردیم.

import nltk
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

words=[]
classes = []
documents = []
ignore_words = ['?', '!']
data_file = open('intents.json').read()
intents = json.loads(data_file)

فایل intents.json به این شکل است:

فایل intents.json

۲-  داده های پیش پردازش

هنگام کار با داده‌های متنی ، قبل از ایجاد یادگیری ماشین یا مدل یادگیری عمیق ، باید پیش پردازش‌های مختلفی را روی داده‌ها انجام دهیم. توکن سازی اساسی‌ترین و اولین کاری است که می توانید روی داده‌های متنی انجام دهید. توکن سازی فرآیند شکستن کل متن به قطعات کوچک مانند کلمات است.

for intent in intents['intents']:
    for pattern in intent['patterns']:

        #tokenize each word
        w = nltk.word_tokenize(pattern)
        words.extend(w)
        #add documents in the corpus
        documents.append((w, intent['tag']))

        # add to our classes list
        if intent['tag'] not in classes:
            classes.append(intent['tag'])

اکنون هر کلمه را لماتیک کرده و کلمات تکراری را از لیست حذف خواهیم کرد. Lemmatizing فرآیندی است که یک کلمه را به شکل lemma تبدیل می کند و سپس یک فایل پیکل برای ذخیره اشیا پایتون ایجاد می کند که هنگام پیش‌بینی از آنها استفاده خواهیم کرد.

# lemmatize, lower each word and remove duplicates
words = [lemmatizer.lemmatize(w.lower()) for w in words if w not in ignore_words]
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'))
۳-   ساخت داده‌های آموزش و آزمایش

اکنون ، ما داده های آموزشی را ایجاد خواهیم کرد که در آن ورودی و خروجی را ارائه خواهیم داد. ورودی ما الگوی و خروجی کلاسی است که الگوی ورودی ما به آن تعلق دارد. اما رایانه متن را نمی فهمد بنابراین متن را به اعداد تبدیل می کنیم.

# create our training data
training = []
# create an empty array for our output
output_empty = [0] * len(classes)
# training set, bag of words for each sentence
for doc in documents:
    # initialize our bag of words
    bag = []
    # list of tokenized words for the pattern
    pattern_words = doc[0]
    # lemmatize each word - create base word, in attempt to represent related words
    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 (for each pattern)
    output_row = list(output_empty)
    output_row[classes.index(doc[1])] = 1

    training.append([bag, output_row])
# 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 created")
۴-  مدل را بسازید

ما داده‌های آموزش خود را آماده کرده‌ایم ، اکنون یک شبکه عصبی عمیق ایجاد خواهیم کرد که دارای ۳ لایه است. برای این منظور از API ترتیبی Keras استفاده می کنیم. پس از آموزش مدل برای ۲۰۰ ایپاک ، به ۱۰۰٪ دقت در مدل خود رسیدیم. حال مدل را به عنوان “chatbot_model.h5” ذخیره می‌کنیم.

# Create model - 3 layers. First layer 128 neurons, second layer 64 neurons and 3rd output layer contains number of neurons
# equal to number of intents to predict output intent with softmax
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. 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")
۵-   پیش بینی پاسخ (رابط کاربری گرافیکی)

اکنون برای پیش بینی جملات و دریافت پاسخ از کاربر یک فایل جدید به نام”chatapp.py” ایجاد می‌کنیم. ما مدل آموزش دیده را بارگیری می کنیم و سپس از یک رابط کاربر گرافیکی استفاده می کنیم که پاسخ ربات را پیش بینی می کند. مدل فقط کلاس مربوط به خود را می گوید ، پس توابعی که کلاس را شناسایی کنند و سپس یک پاسخ تصادفی از لیست پاسخ‌ها بازیابی کنند را ، پیاده سازی می‌کنیم.

مجدداً پکیج‌های لازم را وارد کرده و فایل‌های پیکل ‘words.pkl’ و ‘class.pkl’ را که هنگام آموزش مدل خود ایجاد کرده ایم بارگیری می کنیم:

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 - split words into array
    sentence_words = nltk.word_tokenize(sentence)
    # stem each word - create short form for word
    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(text):
    ints = predict_class(text, model)
    res = getResponse(ints, intents)
    return res

اکنون یک رابط کاربری گرافیکی را پیاده‌سازی خواهیم کرد. برای این منظور ، از کتابخانه Tkinter استفاده می کنیم که قبلاً در پایتون آمده است. حال پیام ورودی را از کاربر می گیریم و سپس از توابع کمکی‌ای که ایجاد کرده‌ایم برای دریافت پاسخ از ربات و نمایش آن در GUI استفاده می کنیم. در اینجا کد منبع کامل برای رابط کاربری گرافیکی آورده شده است.

#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 + '\n\n')
        ChatLog.config(foreground="#442265", font=("Verdana", 12 ))

        res = chatbot_response(msg)
        ChatLog.insert(END, "Bot: " + res + '\n\n')

        ChatLog.config(state=DISABLED)
        ChatLog.yview(END)

base = Tk()
base.title("Hello")
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)

#Bind 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
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()
۶- چتبات را اجرا کنید.

برای اجرای چتبات ، دو فایل اصلی داریم. train_chatbot.py و chatapp.py.

ابتدا مدل را با استفاده از دستور زیر در ترمینال آموزش می دهیم:

python train_chatbot.py

اگر در هنگام آموزش خطایی مشاهده نکنیم ، مدل را با موفقیت ایجاد کرده‌ایم. سپس برای اجرای برنامه ، فایل دوم را اجرا می کنیم.

python chatgui.py

این برنامه ظرف چند ثانیه یک پنجره GUI باز می‌کند. با استفاده از رابط کاربری گرافیکی می توانید به راحتی با ربات گپ بزنید.

چتبات(chatbot)

چتبات (chatbot)

نتیجه

در این پروژه علوم داده پایتون ، یک نسخه یادگیری عمیق از چتبات(chatbot) را در پایتون پیاده کردیم که دقت بالایی را دارد. شما می‌توانید داده‌ها را با توجه به نیازهای کسب و کار سفارشی کنید و چتبات را با دقت زیادی آموزش دهید.

منبع 

۰ ۰ vote
امتیاز مطلب
Share on facebook
Share on whatsapp
Share on twitter
Share on pinterest
Share on linkedin
Share on telegram
Share on email
guest
0 دیدگاه
Inline Feedbacks
دیدن همه نظرات

مطالب مرتبط

تمامی حقوق مادی و معنوی این سایت متعلق به پیشرانا می‌باشد.