کمپانی گارتنر تخمین می زند که تا انتهای سال ٢٠٢٠ چت بات ها ٨۵ درصد از تعاملات مشتریان و خدمات را بر عهده خواهند داشت.
در این مقاله نحوه ساخت چت بات با پایتون را به صورت ساده آموزش می دهیم.
آنچه در این نوشته خواهیم داشت
چت بات یک نرم افزار دارای هوش مصنوعی در یک دستگاه مانند (Siri ، Alexa ، Google Assistant و غیره) ، اپلیکیشن و یا وبسایتی است که سعی می کند نیازهای مصرف کنندگان را ارزیابی کرده و سپس به آن ها در انجام یک کار خاص مانند یک معامله تجاری کمک کند. مثل رزرو هتل، ارسال فرم و غیره. امروزه چت بات ها در بسیاری از شرکت ها مورد استفاده قرار می گیرند تا بتواند با کاربران تعامل داشته باشند. از جمله کاربردهای چت بات در شرکت ها می توان به موارد زیر اشاره کرد:
ارائه اطلاعات پرواز
ارتباط با مشتریان و امور مالی آنها
پشتیبانی مشتری
به طور کلی دو نوع چت بات وجود دارد.
١. در مدل قانون محور ، یک ربات به سوالات بر اساس آموزش هایی که قبلا فراگرفته پاسخ می دهد. قوانین تعریف شده می توانند بسیار ساده و یا بسیار پیچیده باشند. ربات ها می توانند پرسش و پاسخ ساده ای را انجام دهند اما در مدیریت موارد پیچیده موفق نیستند.
٢. چت بات های خودآموز از برخی رویکردهای مبتنی بر ماشین لرنینگ استفاده می کنند و قطعا از چت بات های قانون محور کارآمدتر هستند. این چت بات ها به دو نوع تقسیم می شوند: مبتنی بر یازیابی و تولیدی
١-٢. در مدل مبتنی بر بازیابی، چت بات از یک سری الگوریتم های فراابتکاری به منظور انتخاب پاسخ از یک کتابخانه دارای پاسخ های از پیش تعیین شده استفاده می کند.
٢-٢ چت بات تولیدی می تواند پاسخ ها را تولید کند و همچنین همیشه به یک سوال یک پاسخ تکراری نمی دهد. هرچه تعدا پرسش و پاسخ ها بیشتر شود، چت بات هوشمندتر می شود.
پیش نیازها:
داشتن دانش کلی از کتابخانه scikit و NLTK. اما اگر در NLP تازه وارد هستید باز هم می توانید مقاله را بخوانید و سپس به منابع مراجعه کنید.
رشته تحصیلی که بر تعامل بین زبان بشر و رایانه ها تمرکز دارد به اختصار “پردازش زبان طبیعی” یا NLP نامیده می شود. این رشته با علوم کامپیوتر ، هوش مصنوعی و زبان شناسی محاسباتی سروکار دارد. NLP روشی است که به وسیله آن کامپیوترها می توانند زبان انسان را هوشمندانه تر آنالیز ، درک و استخراج کنند. با استفاده از NLP توسعه دهندگان می توانند دانش خود را برای انجام کارهایی مانند خلاصه سازی خودکار، ترجمه، استخراج رابطه، تجزیه و تحلیل احساسات، تشخیص گفتار و تقسیم موضوع سازماندهی کرده و ساختار بخشند.
NLTK (ابزار زبان طبیعی) یک بستر پیشرو برای ساختن برنامه های پایتون برای کار با داده های زبان انسانی است. NLTK “ابزاری فوق العاده برای آموزش و کار در زبانشناسی محاسباتی با استفاده از پایتون” و “یک کتابخانه شگفت انگیز برای بازی با زبان طبیعی” معرفی شده است. پردازش زبان طبیعی با پایتون مقدمه ای عملی برای برنامه نویسی برای پردازش زبان است.
NLTK را نصب کرده و pip install nltk را اجرا کنید.
آزمایش نصب: پایتون را اجرا کرده و import nltk را تایپ کنید.
نصب بسته های NLTK:
NLTK را وارد کنید و nltk.download () را اجرا کنید. با این کار NLTK downloader را باز کرده و می توانید مدل ها را برای بارگیری انتخاب کنید. همچنین می توانید همه بسته ها را به طور همزمان دانلود کنید.
مسئله اصلی در مورد داده های متن این است که همه در قالب متن هستند. اما الگوریتم های یادگیری ماشین به نوعی از بردار ویژگی عددی احتیاج دارند. بنابراین قبل از شروع هر پروژه NLP باید آن را از قبل پردازش کنیم تا مناسب سازی شود. پیش پردازش متن اصلی شامل موارد زیر است:
تبدیل کل متن به حروف بزرگ یا حروف کوچک به گونه ای که الگوریتم با کلمات مشابه در موارد مختلف به صورت متفاوت رفتار نمی کند.
Tokenization: Tokenization (نشانه گذار) فقط اصطلاحی است که برای توصیف فرآیند تبدیل رشته های متن معمولی به لیستی از نشانه ها بکار رفته است. نشانه گذار جمله می تواند برای یافتن لیست جملات مورد استفاده قرار گیرد و از نشانه گذار کلمات برای یافتن لیست کلمات در رشته ها استفاده می شود.
پس از مرحله پردازش اولیه، باید متن را به یک بردار معنی دار (یا آرایه) از اعداد تبدیل کنیم. کوله کلمات شامل واژگان کلمات شناخته شده و معیار حضور کلمات شناخته شده است. شهود پشت کوله کلمات این است که اسناد با محتوای یکسان، مشابه هستند. همچنین ما می توانیم راجع به معنی سند از طریق مطالب آن دریابیم.
مشکل کوله کلمات در این است که کلمات پر تکرار شروع به غالب شدن در سند می کنند؛ اما ممکن است شامل محتوای اطلاعاتی (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
به عنوان مثال، ما از صفحه ویکی پدیا به عنوان مجموعه نوشته برای چت بات خود استفاده خواهیم کرد. محتویات را از صفحه کپی کرده و آن را در یک پرونده متنی بنام “chatbot.txt” قرار دهید. با این حال، شما می توانید از هر مجموعه نوشته دلخواه دیگر استفاده کنید. ما در فایل corpus.txt کل مجموعه را به لیست جملات و کلمات برای پیش پردازش بیشتر تبدیل می کنیم.
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 را ببینید:
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 تعریف کنیم.
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().translate(remove_punct_dict)))
در مرحله بعد، ما باید عملکردی برای سلام توسط ربات تعریف کنیم، یعنی اگر کاربر سلام کرد، ربات پاسخ سلام را برگرداند. ELIZA از یک واژه ساده برای سلام استفاده می کند. ما در اینجا از همان مفهوم استفاده خواهیم کرد.
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
این مورد برای یافتن شباهت بین کلمات وارد شده توسط کاربر و کلمات موجود در مجموعه نوشته استفاده می شود.
ما یک پاسخ عملکردی را تعریف می کنیم که پرسش کاربر را برای یک یا چند کلمه کلیدی شناخته شده جستجو می کند و یکی از چندین پاسخ ممکن را ارائه می دهد. اگر ورودی مطابق با هر یک از کلمات کلیدی را پیدا نکرد، به عنوان مثال پاسخ می دهد: “متاسفم! من متوجه منظور شما نمی شوم”
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
سرانجام ، متنی را که می خواهیم ربات ما هنگام شروع و پایان مکالمه استفاده کند وارد می کنیم.
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..")
تقریبا تمام شد. ما اولین چت بات خود را در NLTK کدنویسی کرده ایم. اکنون بگذارید ببینیم که چگونه با انسان تعامل دارد:
?