کمپانی گارتنر تخمین می زند که تا انتهای سال ٢٠٢٠ چت بات ها ٨۵ درصد از تعاملات مشتریان و خدمات را بر عهده خواهند داشت.
در این مقاله در ادامه آموزش پایتون نحوه ساخت چت بات با پایتون را به صورت ساده آموزش می دهیم.
چت بات چیست؟

چت بات یک نرم افزار دارای هوش مصنوعی در یک دستگاه مانند (Siri ، Alexa ، Google Assistant و غیره) ، اپلیکیشن و یا وبسایتی است که سعی می کند نیازهای مصرف کنندگان را ارزیابی کرده و سپس به آن ها در انجام یک کار خاص مانند یک معامله تجاری کمک کند. مثل رزرو هتل، ارسال فرم و غیره. امروزه چت بات ها در بسیاری از شرکت ها مورد استفاده قرار می گیرند تا بتواند با کاربران تعامل داشته باشند. از جمله کاربردهای چت بات در شرکت ها می توان به موارد زیر اشاره کرد:
ارائه اطلاعات پرواز
ارتباط با مشتریان و امور مالی آنها
پشتیبانی مشتری

چت بات چگونه کار می کند؟

به طور کلی دو نوع چت بات وجود دارد.
چت بات قانون محور (Rule-Based) و چت بات خودآموز(Self-Learning)

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



ساخت چت بات با پایتون

پیش نیازها:
داشتن دانش کلی از کتابخانه scikit و NLTK. اما اگر در NLP تازه وارد هستید باز هم می توانید مقاله را بخوانید و سپس به منابع مراجعه کنید.

پردازش زبان طبیعی ( NLP )

رشته تحصیلی که بر تعامل بین زبان بشر و رایانه ها تمرکز دارد به اختصار “پردازش زبان طبیعی” یا NLP نامیده می شود. این رشته با علوم کامپیوتر ، هوش مصنوعی و زبان شناسی محاسباتی سروکار دارد. NLP روشی است که به وسیله آن کامپیوترها می توانند زبان انسان را هوشمندانه تر آنالیز ، درک و استخراج کنند. با استفاده از NLP توسعه دهندگان می توانند دانش خود را برای انجام کارهایی مانند خلاصه سازی خودکار، ترجمه، استخراج رابطه، تجزیه و تحلیل احساسات، تشخیص گفتار و تقسیم موضوع سازماندهی کرده و ساختار بخشند.
NLTK: معرفی کوتاه

NLTK (ابزار زبان طبیعی) یک بستر پیشرو برای ساختن برنامه های پایتون برای کار با داده های زبان انسانی است. NLTK “ابزاری فوق العاده برای آموزش و کار در زبانشناسی محاسباتی با استفاده از پایتون” و “یک کتابخانه شگفت انگیز برای بازی با زبان طبیعی” معرفی شده است. پردازش زبان طبیعی با پایتون مقدمه ای عملی برای برنامه نویسی برای پردازش زبان است.
دانلود و نصب NLTK:

NLTK را نصب کرده و pip install nltk را اجرا کنید.
آزمایش نصب: پایتون را اجرا کرده و import nltk را تایپ کنید.
نصب بسته های NLTK:
NLTK را وارد کنید و nltk.download () را اجرا کنید. با این کار NLTK downloader را باز کرده و می توانید مدل ها را برای بارگیری انتخاب کنید. همچنین می توانید همه بسته ها را به طور همزمان دانلود کنید.

پیش پردازش متن با NLTK

مسئله اصلی در مورد داده های متن این است که همه در قالب متن هستند. اما الگوریتم های یادگیری ماشین به نوعی از بردار ویژگی عددی احتیاج دارند. بنابراین قبل از شروع هر پروژه NLP باید آن را از قبل پردازش کنیم تا مناسب سازی شود. پیش پردازش متن اصلی شامل موارد زیر است:
تبدیل کل متن به حروف بزرگ یا حروف کوچک به گونه ای که الگوریتم با کلمات مشابه در موارد مختلف به صورت متفاوت رفتار نمی کند.
Tokenization: Tokenization (نشانه گذار) فقط اصطلاحی است که برای توصیف فرآیند تبدیل رشته های متن معمولی به لیستی از نشانه ها بکار رفته است. نشانه گذار جمله می تواند برای یافتن لیست جملات مورد استفاده قرار گیرد و از نشانه گذار کلمات برای یافتن لیست کلمات در رشته ها استفاده می شود.

کوله کلمات ( Bag of Words )

پس از مرحله پردازش اولیه، باید متن را به یک بردار معنی دار (یا آرایه) از اعداد تبدیل کنیم. کوله کلمات شامل واژگان کلمات شناخته شده و معیار حضور کلمات شناخته شده است. شهود پشت کوله کلمات این است که اسناد با محتوای یکسان، مشابه هستند. همچنین ما می توانیم راجع به معنی سند از طریق مطالب آن دریابیم.
رویکرد TF-IDF

مشکل کوله کلمات در این است که کلمات پر تکرار شروع به غالب شدن در سند می کنند؛ اما ممکن است شامل محتوای اطلاعاتی (informational) نباشند. همچنین کوله کلمات به اسناد طولانی تر وزن بیشتری می دهد. یک روش برای رفع این مشکل این است که به هر کلمه متناسب با تعداد تکرار آن در کل سند امتیاز داده شود. این رویکرد امتیاز دهی Term Frequency-Inverse Document Frequency یا به اختصار TF-IDF گفته می شود. در این روش، Term Frequency به معنی امتیاز دهی تعداد کلمات در سند فعلی و Inverse Document Frequency به معنای امتیازدهی کم تکرار بودن کلمات در سند می باشد.
(تعداد کل کلمات)/(تعداد دفعات مشاهده کلمه)=TF
(تعداد اسنادی که کلمه در آن ها مشاهده شده)/(تعداد اسناد)IDF=1+log

وزن TF-IDF ، وزنی است که اغلب در بازیابی اطلاعات و استخراج متن مورد استفاده قرار می گیرد. این وزن یک معیار آماری است که برای ارزیابی اهمیت کلمه در یک اسندیا مجموعه.
مثال:
سندی را در نظر بگیرید که شامل ١٠٠ کلمه است و در آن کلمه “تلفن” ۵ بار تکرار شده است. TF برای این کلمه 5/100 است. حال ، فرض کنید ما ١٠ میلیون سند داریم و کلمه تلفن در هزار مورد از آنها تکرار شده است. آنگاه IDF برابر خواهد بود با: log (10،000،000 / 1،000) = 4 . بنابراین TF-IDF 0.2 می باشد.
حال ما یک دید کلی از NLP داریم، وقت آن رسیده که شروع به ساخت چت بات کنیم. عنوان چت بات را ROBO فرض می کنیم.

وارد کردن کتابخانه های ضروری:

import nltk
import numpy as np
import random
import string # to process standard python strings

مجموعه نوشته ها ( Corpus )

به عنوان مثال، ما از صفحه ویکی پدیا به عنوان مجموعه نوشته برای چت بات خود استفاده خواهیم کرد. محتویات را از صفحه کپی کرده و آن را در یک پرونده متنی بنام “chatbot.txt” قرار دهید. با این حال، شما می توانید از هر مجموعه نوشته دلخواه دیگر استفاده کنید. ما در فایل corpus.txt کل مجموعه را به لیست جملات و کلمات برای پیش پردازش بیشتر تبدیل می کنیم.
123
f=open('chatbot.txt','r',errors = 'ignore')raw=f.read()raw=raw.lower()# converts to lowercasenltk.download('punkt') # first-time use only
nltk.download('wordnet') # first-time use onlysent_tokens = nltk.sent_tokenize(raw)# converts to list of sentences
word_tokens = nltk.word_tokenize(raw)# converts to list of words
مثالی از sent_tokens و word_tokens را ببینید:
1234
sent_tokens[:2]
['a chatbot (also known as a talkbot, chatterbot, bot, im bot, interactive agent, or artificial conversational entity) is a computer program or an artificial intelligence which conducts a conversation via auditory or textual methods.',
'such programs are often designed to convincingly simulate how a human would behave as a conversational partner, thereby passing the turing test.']word_tokens[:2]
['a', 'chatbot', '(', 'also', 'known']
پیش پردازش متن

اکنون باید تابعی به نام LemTokens تعریف کنیم.
123456
lemmer = nltk.stem.WordNetLemmatizer()
#WordNet is a semantically-oriented dictionary of English included in NLTK.def LemTokens(tokens):
return [lemmer.lemmatize(token) for token in tokens]
remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
def LemNormalize(text):
return LemTokens(nltk.word_tokenize(text.lower().translat e(remove_punct_dict)))
تطبیق کلید واژه

در مرحله بعد، ما باید عملکردی برای سلام توسط ربات تعریف کنیم، یعنی اگر کاربر سلام کرد، ربات پاسخ سلام را برگرداند. ELIZA از یک واژه ساده برای سلام استفاده می کند. ما در اینجا از همان مفهوم استفاده خواهیم کرد.
12345
GREETING_INPUTS = ("hello", "hi", "greetings", "sup", "what's up","hey",)GREETING_RESPONSES = ["hi", "hey", "*nods*", "hi there", "hello", "I am glad! You are talking to me"]def greeting(sentence):

for word in sentence.split():
if word.lower() in GREETING_INPUTS:
return random.choice(GREETING_RESPONSES)
تولید پاسخ در چت بات

برای تولید پاسخ در چت بات برای سوالات ورودی از مفهوم تشابه سند استفاده می شود. بنابراین ما با وارد کردن ماژول های لازم شروع می کنیم.
از کتابخانه scikit Learn ، بردار Tfidf را وارد کنید تا مجموعه ای از اسناد خام را به ماتریسی از ویژگی های TF-IDF تبدیل کنید.
from sklearn.feature_extraction.text import TfidfVectorizer
همچنین ، ماژول cosine similarity را از کتابخانه یادگیری scikit وارد کنید.
from sklearn.metrics.pairwise import cosine_similarity
این مورد برای یافتن شباهت بین کلمات وارد شده توسط کاربر و کلمات موجود در مجموعه نوشته استفاده می شود.
ما یک پاسخ عملکردی را تعریف می کنیم که پرسش کاربر را برای یک یا چند کلمه کلیدی شناخته شده جستجو می کند و یکی از چندین پاسخ ممکن را ارائه می دهد. اگر ورودی مطابق با هر یک از کلمات کلیدی را پیدا نکرد، به عنوان مثال پاسخ می دهد: “متاسفم! من متوجه منظور شما نمی شوم”

1234567891011121314
def response(user_response):
robo_response=''
sent_tokens.append(user_response) TfidfVec = TfidfVectorizer(tokenizer=LemNormalize, stop_words='english')
tfidf = TfidfVec.fit_transform(sent_tokens)
vals = cosine_similarity(tfidf[-1], tfidf)
idx=vals.argsort()[0][-2]
flat = vals.flatten()
flat.sort()
req_tfidf = flat[-2] if(req_tfidf==0):
robo_response=robo_response+"I am sorry! I don't understand you"
return robo_response
else:
robo_response = robo_response+sent_tokens[idx]
return robo_response
سرانجام ، متنی را که می خواهیم ربات ما هنگام شروع و پایان مکالمه استفاده کند وارد می کنیم.
123456789101112131415161718
flag=True
print("ROBO: My name is Robo. I will answer your queries about Chatbots. If you want to exit, type Bye!")while(flag==True):
user_response = input()
user_response=user_response.lower()
if(user_response!='bye'):
if(user_response=='thanks' or user_response=='thank you' ):
flag=False
print("ROBO: You are welcome..")
else:
if(greeting(user_response)!=None):
print("ROBO: "+greeting(user_response))
else:
print("ROBO: ",end="")
print(response(user_response))
sent_tokens.remove(user_response)
else:
flag=False
print("ROBO: Bye! take care..")
تقریبا تمام شد.
آموزش های بیشتر در وبلاگ آمانج