آموزش ساخت چتبات؛ راهنمایی برای خودکارسازی مکالمات
بدون شک همه ما قبول داریم که چتباتها، این رباتهای مجازی مختص گفتگو، که نمودی از پیشرفت هوش مصنوعی در زندگی بشر هستند، بسیاری از فرایندهای روزمره ما را به میزان قابل توجهی آسان و سریع کردند. وقتی صحبت از هوش مصنوعی در کسب و کارهای مختلف میشود به طور معمول اولین موردی که جهت بهبود و تسریع فرایندها به ذهن میرسد، چتباتها هستند. خبر خوب این است که ساخت چتبات آنچنان که تصور میرود کار دشواری نیست. در این مقاله، ما در مورد نحوه ساخت چتبات و پیشنیازها و مهارتهایی که برای این منظور لازم است، صحبت میکنیم.
چتبات چیست؟
چتبات نرمافزاری است که از روشهای مختلف نظیر متن و صدا با انسان در تعامل است. در واقع چتبات با بهرهگیری از قابلیتهای هوش مصنوعی و فناوری پردازش زبان طبیعی امکان گفتگوی هوشمند و مکالمه طبیعیتر بین انسان و ماشین را فراهم میکند.
چتبات ها به طور گسترده برای خدمات مشتری مانند پاسخها و راهنماییهای خودکار استفاده میشوند. هر چند امروزه کاربرد چتباتها فراتر رفته و در بخشهای مختلفی مانند حوزه آموزشی، خدمات گردشگری، زمینههای پزشکی، خدمات شخصی و غیره مورد استفاده قرار میگیرند.
انواع چتباتها
به زبان ساده، چتباتها با هدف درک پرسش کاربران و ارائه پاسخ مناسب برای رفع نیازهای آنها ارائه گردیدند. چتباتهای ساده پرسشهای کاربران را با توجه به کلمات کلیدی بررسی میکنند، لیست از پیش تعریف شده پاسخها را مرور میکنند و پاسخی مرتبط با درخواست کاربر را ارائه میدهند. در حالت پیشرفتهتر، چتباتها با بهرهگیری از هوش مصنوعی به ویژه فناوری پردازش زبان طبیعی (NLP) هدف کاربر را با توجه به متن ورودی متوجه شده و با یک درصد قابل قبولی سعی در ارائه پاسخ صحیح و مرتبط میکنند.
چتباتها را از جنبههای مختلف میتوان دستهبندی نمود که با توجه به هدفی که ما در این مقاله در پیش گرفتیم به دستهبندی بر اساس روشهای تولید پاسخ استناد میکنیم:
چتباتهای مبتنی بر قانون
این چترباتها از منطق اگر- آنگاه (if/then) برای تولید پاسخها بر اساس شرایط و پاسخهای از پیش تعریف شده، استفاده میکنند. این چتباتها قابلیتهای سفارشیسازی محدودی دارند، اما قابل اعتماد هستند و احتمال خطای پایینتری دارند.
چتباتهای مبتنی بر هوش مصنوعی
این نوع از چتباتها برای اسکن پرسشهای کاربران و تشخیص کلمات کلیدی جهت تعیین پاسخ مناسب، به فناوری پردازش زبان طبیعی متکی هستند. از دیگر مزیتهای چتباتهای مبتنی بر هوش مصنوعی، استفاده از دادههای کاربران به عنوان دادههای آموزشی جدید و بهبود مدارم خود است.
چتباتهای ترکیبی
چتباتهای ترکیبی برای درک پرسش کاربران و ایجاد پاسخ از دو روش مبتنی بر قوانین و یا NLP استفاده میکنند. بهینهسازی پایگاه داده این چت باتها آسانتر است، اما در مقایسه با چتبات های مبتنی بر هوش مصنوعی، قابلیتهای مکالمه محدودتری دارند.
اجزای اصلی چتباتها
جت آشنایی با نحوه ساخت یک چتبات لازم است پیش از آن با ساختار چتبات آشنا شوید. به طور کلی، چتباتها از هفت قسمت اصلی به شرح زیر تشکیل شدهاند:
1. پردازش زبان طبیعی: پردازش زبان طبیعی، چتباتها را قادر میسازد، متن و گفتار کاربران را به دادههای ساختاریافته تبدیل کنند تا توسط ماشین قابل درک باشد. NLP شامل مراحل زیر است:
توکنسازی: توکنسازی که به آن تحلیل واژگانی نیز میگویند، فرآیندی است که در آن رشته کلماتی که یک جمله را تشکیل می دهند، بر اساس معنی و رابطه آن با کل جمله، به قطعات کوچکتر «توکن» تقسیم میشوند.
نرمالسازی: نرمالسازی که به آن تحلیل نحوی نیز گفته می شود، فرآیند بررسی کلمات از نظر تایپی و تبدیل آنها به شکل استاندارد است. به عنوان مثال، کلمه “tmrw” به “tomorrow” نرمالسازی میشود.
شناسایی موجودیتها: شناسایی موجودیتها فرآیندی است که در آن، جستجوی کلمات کلیدی جهت شناسایی موضوع گفتگو انجام میگردد.
تحلیل معنایی: تحلیل معنایی فرآیند استنباط معنای یک جمله است که از طریق درک معنای هر کلمه و ارتباط آن با ساختار کلی حاصل میگردد.
- فهم زبان طبیعی (NLU): فهم زبان طبیعی زیرشاخه ای از NLP است که بر درک معنای گفتار انسان با شناسایی الگوها در گفتارهای بدون ساختار تمرکز دارد. همچنین به کمک این شاخه، چتباتها میتوانند اهداف کاربران را طبقهبندی کرده و پاسخی را بر اساس دادههای آموزشی ایجاد کنند. راه حل های NLU دارای 3 جزء اصلی هستند:
- دیکشنری یا فرهنگ لغت برای تعیین معنای یک کلمه
- تجزیهکننده (parser) برای تعیین اینکه آیا جملهشناسی (نحو) متن با قوانین زبان مطابقت دارد یا خیر
- قواعد دستور زبان به منظور تجزیه ورودی بر اساس ساختار جمله و یا علائم نگارشی
3. پایگاه دانش: پایگاه دانش، کتابخانهای از اطلاعات است که چتبات برای استخراج دادههای مورد نیاز برای پاسخ به کاربران به آن تکیه میکند. پایگاههای دانش بر اساس نیازهای تجاری متفاوت هستند. به عنوان نمونه، پایگاه دانش یک چتبات در وبسایتهای تجارت الکترونیک حاوی اطلاعاتی در مورد محصولات، ویژگیها و قیمتها است، در حالی که پایگاه دانش یک چتبات مراقبتهای بهداشتی اطلاعاتی درباره تقویم پزشکان، ساعات کاری بیمارستان و وظایف داروخانه دارد. علاوه بر این، برخی از چتباتها با اسکراپرهای وب یکپارچه شدهاند تا دادهها را از منابع آنلاین بیرون بکشند و به کاربران نمایش دهند.
4. منبع ذخیرهسازی داده: توسعهدهندگان چتباتها ممکن است تمایل داشته باشند که مکالمات را برای استفاده از بحثهای ارزیابی خدمات مشتری و یا اهداف آموزش و یا آزمایش ربات ذخیره کنند. مکالمات چتبات را میتوان به صورت SQL در محل و یا در فضای ابری ذخیره کرد.
5. مدیریت گفتگو: مدیریت گفتگو بخشی است که مسئولیت کنترل جریان گفتگو بین کاربر و چتبات را برعهده دارد. برای تصمیمگیری در مورد نحوه پاسخگویی، سوابقی از تعاملات در یک مکالمه توسط مدیریت گفتگو نگه داشته باشد. به عنوان مثال، اگر کاربر بگوید «میخواهم بستنی توتفرنگی سفارش بدهم» و سپس در ادامه مکالمه بگوید «سفارش من را به بستنی شکلاتی تغییر دهید»، مدیر گفتگو ربات را قادر میسازد تا تغییر از «توت فرنگی» به «شکلاتی» را تشخیص دهد و ترتیب را مطابق با آن تغییر دهید.
6. تولید زبان طبیعی (NLG): تولید زبان طبیعی فرآیند تبدیل دادههای ساختار یافته تولید شده توسط ماشین به متن قابل خواندن توسط انسان است. پس از درک هدف کاربران،NLG پنج مرحله برای ایجاد پاسخ دارد:
- تعیین محتوا: فیلتر کردن دادههای موجود در پایگاه دانش برای انتخاب مواردی که باید در پاسخ گنجانده شود.
- تفسیر دادهها: درک الگوها و پاسخ های موجود در پایگاه دانش.
- برنامهریزی و تجمیع جملات: ساختاربندی پاسخ به شیوهای روایی و جمع آوری عبارات و کلمات در کنار هم.
- دستور زبان: به کارگیری قواعد گرامری مانند علائم نگارشی و املا.
- پیاده سازی زبان: وارد کردن دادهها در قالبهای زبانی برای اطمینان از طبیعی بودن پاسخ
7. رابط کاربری: رابطهای کاربری مکالمه، قسمتهای نمایشی و به اصطلاح front-end یک چت بات هستند که نمایش فیزیکی مکالمه را امکان پذیر میکنند. آنها به دستیارهای متنی یا مبتنی بر صدا طبقهبندی میشوند که میتوان آنها را در پلتفرمهای مختلفی مانند فیس بوک، واتسآپ، تیمهای گوگل و غیره ادغام کرد.
یک چتبات خوب چه مشخصاتی باید داشته باشد؟
توسعه دهندگان چتباتها باید در هنگام توسعه آنها روی برخی از معیارهای کیفی تمرکز کنند تا بتوانند محصول خوب و قابل قبولی را عرضه نمایند. برخی از این معیارهای کیفی عبارتند از:
- قابلیت بالا در انجام مکالمه: یکی از اولین و اصلیترین مشخصات یک چتبات خوب دقت بالای آن در فهم منظور کاربر و ارائه پاسخ مناسب است که این امر ارتباط مستقیمی با دقت و کارکرد الگوریتمهای NLP استفاده شده دارد.
- شناسایی تن صدا: از قابلیتهای برجسته چتباتهای شناخته شده توانایی شناسایی احساسات و ویژگیهای شخصیتی و رفتاری کاربران است که باعث تأثیر بسزایی در بهبود تعامل و همچنین شناخت مشتریان میشود. البته لازم به ذکر است این یکی از ویژگیهای برجسته دستیاران صوتی است که در تلاش هستند آنرا برای چتباتها نیز پیادهسازی نمایند.
- قابلیت یکپارچهسازی با بخش CRM: چتباتهایی که در لحظه با سیستم ارتباط با مشتری و جریانهای کاری مربوط به آن یکپارچه باشند، قابل اعتماد بوده و از ارزش بالایی برخوردار هستند.
- توانایی بهبود: یکی از قابلیتهای ارزشمند چتباتها استفاده از تجربیات خود در انجام مکالمه (به عنوان دادههای آموزشی) و ارزیابی بازخورد کاربران در جهت بهبود و ارتقای عملکرد خود به صورت خودکار میباشد.
- قابلیت ذخیرهسازی بالا: چتباتها باید به راحتی بتوانند دادههای ساختار یافته یا بدون ساختار را پردازش و ذخیره کنند و به جمع آوری اطلاعات لازم مطابق با درخواستها کمک کنند.
چه مهارتهایی برای ساخت چتباتها مورد نیاز است؟
از توسعهدهندگان چتباتها این انتظار میرود که دانش عمیقی از فناوریها و زبانهای برنامه نویسی داشته باشند که از طریق آن بتوانند به راحتی روی توسعه این رباتهای مجازی کار کنند. به طور کلی، مجموعه مهارتهایی که لازم است یک توسعهدهنده چتبات داشته باشد به شرح زیر میباشد:
- توسعهدهندگان چتبات باید دانش خوبی از هوش مصنوعی، یادگیری ماشین و پردازش زبان طبیعی داشته باشند.
- آشنایی با زبانهای برنامه نویسی مانند جاوا، پایتون، PHP، Ruby از واجبات توسعه چتباتها است
- توسعهدهندگان باید با پلتفرمهایی که به آنها اجازه میدهد کیفیت چتبات را افزایش دهند، آشنا باشند که در بخشهای آتی در مورد آنها صحبت خواهد شد.
پلتفرمهای ساخت چتبات
پلتفرمهای چتبات که با هدف ساخت و توسعه چتباتها ارائه شدهاند، بهترین مکان برای شروع کار برای مبتدیان هستند. این پلتفرمها طراحی ساده و آسانی دارند که برای کار با اکثر آنها نیاز به هیچ نوع دانش کدنویسی نیست، بلکه به سادگی میتوان یک تابع را از طریق ماوس کشید و رها کرد (Drag and Drop). تنها کاری که باید انجام دهید این است که جریان یا الگوریتم نحوه کار این چتبات را شکل دهید. بنابراین همانطور که میبینید ساخت چتبات بدون نیاز به برنامهنویسی نیز شدنی است.
تعداد این پلتفرمها بسیار زیاد است که هر کدام با توجه به مشخصههایشان ممکن است برای هدف و یا مخاطب خاصی مناسب باشند. به طور نمونه در ادامه به چند مورد اشاره میکنیم:
- Engati
- Chatfuel
- PandoraBots
- Verloop
- Botsify
- Manychat
- Bottr
- Flow Xo
- ai
- ai
- Botstar
چارچوبهای برتر برای ساخت یک چتبات
چارچوبهای مختص چتباتها نوعی ابزارهای توسعه (SDK) هستند که به توسعهدهندگان اجازه میدهند تا با استفاده از تکنیکهای پردازش زبان طبیعی، فهم زبان طبیعی و یا تکنیکهای مشابه این رباتهای مختص گفتگو را ایجاد نمایند. چارچوبها، بلوکهای اساسی مانند هدف (intent)، زمینه (context)، موجودیتها (entities) و طراحی مکالمه را ارائه میکنند که بر اساس آن توسعهدهندگان باید رباتها را با کدنویسی بسازند. برخلاف پلتفرمها در چارچوبها، هیچ کدام از توابع به صورت کشیدن و رها کردن ایجاد نمیشوند و جریان و یا قالبهای از پیش تعریف شده وجود ندارد.
- Google’s Dialogflow
- Amazon’s Lex.
- Microsoft’s Bot Framework (MBF)
- IBM Watson
- WordPress
- Chatterbot
- RASA Stack
آموزش ساخت چتبات
بر اساس تجربه شرکتهای موفق در این زمینه، فرایند توسعه چتباتها را میتوان در مراحل اصلی زیر خلاصه کرد:
- تعیین اهداف واقع بینانه در مورد اجرای چتبات و پاسخگویی به سوالاتی از قبیل چه نوع خدماتی؟ چه مشکلی باید حل شود؟ هدف از وجود چت بات چیست؟
- شناسایی مخاطبان هدف و درک نیازهای آنها
- تعیین نوع چتبات؛ چتباتهای مبتنی بر قانون و یا چتباتهای مبتنی بر هوش مصنوعی؟
- انتخاب پلتفرم مناسب با توجه به زمان، دانش و بودجه شما
- انتخاب چارچوب مناسب که بسته به دانش و تجربه شما ممکن است متفاوت باشد. همچنین در این مرحله مشخص میکنید که از چه نوع تکنیک یا فناوری استفاده میکنید و یا قصد دارید چقدر چتبات خود را پیچیده کنید؟
ساخت چتبات در پایتون
جهت آموزش ساخت چتبات در پایتون یک پروژه برای این منظور و با استفاده از تکنیکهای یادگیری عمیق را انجام داده و مرحله به مرحله پیش میبریم. چتبات مورد نظر بر روی مجموعه دادهای آموزش میبیند که شامل دستههای مختلف (intent)، الگوها و پاسخهای گوناگون است. در این پروژه از یک شبکه عصبی تکرارشونده ویژه (LSTM) برای طبقهبندی پیام کاربر به دستههای مختلف استفاده شده که در نهایت یک پاسخ تصادفی از لیست پاسخها ارائه میگردد. بنابراین هدف از این بخش ایجاد یک چتبات مبتنی بر قانون با استفاده از Python، Keras و NLTK است. پیش به سوی ایجاد چتبات با پایتون!
- پیشنیازها
انجام این پروژه مستلزم داشتن دانش خوبی از Python، Keras و پردازش زبان طبیعی در پایتون (NLTK) است. همراه با آنها، ما از چند ماژول کمکی استفاده خواهیم کرد که می توانید با استفاده از دستور python-pip دانلود کنید.
pip install tensorflow, keras, pickle, nltk
اکنون میخواهیم چتبات را با استفاده از پایتون بسازیم، اما ابتدا باید با ساختار فایل و نوع فایلهایی را که میسازیم آشنا شوید:
- Intents.json: فایل دادهای که دارای الگوها و پاسخهای از پیش تعریف شده است. لازم به ذکر است این مجموعه داده، یک فایل JSON است که شامل الگوهایی است که باید پیدا کنیم و پاسخهایی که میخواهیم به کاربر برگردانیم. میتوانید کد و مجموعه داده چتبات پایتون را از این لینک دانلود کنید (برای این منظور از فیلترشکن استفاده کنید)
- train_chatbot.py: در این فایل پایتون، ما یک اسکریپت برای ساخت مدل و آموزش چتبات خود نوشتیم.
- Words.pkl: یک نوع فایل pickle است که در آن کلمات شی پایتون را که حاوی لیستی از واژگان ما است ذخیره میکنیم.
- Classes.pkl: فایل pickle مربوط به کلاسها برای لیست دستهبندیها است.
- Chatbot_model.h5: این مدل آموزش دیدهای است که حاوی اطلاعاتی در مورد مدل است و وزن نورون ها را دارد.
- Chatgui.py: این اسکریپت پایتون است که در آن رابط کاربری گرافیکی را برای چتبات خود پیاده سازی کردهایم. کاربران به راحتی میتوانند با ربات تعامل داشته باشند.
در اینجا لازم است 5 مرحله برای ایجاد یک چت بات در پایتون انجام دهیم:
- فایل داده را وارد و بارگذاری کنید.
- پیشپردازش دادهها
- ایجاد دادههای آموزشی و آزمایشی
- ساخت مدل
- پیشبینی پاسخ مدل و ارزیابی خروجی آن
مرحله اول) فایل داده را وارد و بارگذاری کنید
ابتدا یک فایل به عنوان 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 به این شکل خواهد بود.
مرحله دوم) پیشپردازش دادهها
هنگام کار با دادههای متنی، قبل از ساختن یک مدل یادگیری ماشینی و یا یادگیری عمیق، باید پیش پردازشهای مختلفی روی دادهها انجام شود. بدین منظور لازم است عملیات مختلفی را برای پیشپردازش دادهها انجام دهیم.
توکنسازی ابتداییترین و اولین کاری است که میتوانید روی دادههای متنی انجام دهید. توکنسازی فرآیندی است که کل متن را به قطعات کوچکی مانند کلمات تقسیم میکند.
بنابراین این عملیات را بر روی الگوها تکرار میکنیم و با استفاده از تابع nltk.word_tokenize () جمله را نشانهگذاری و هر کلمه را در لیست کلمات اضافه میکنیم. همچنین لازم است لیستی از کلاسها را برای برچسبهای خود ایجاد کنیم.
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'])
اکنون با یافتن ریشه کلمات (lemmatization)، کلمات تکراری را از لیست حذف میکنیم. Lemmatizing فرآیند تبدیل یک کلمه به شکل ریشه آن و سپس ایجاد یک فایل pickle برای ذخیره اشیاء پایتون است که در حین پیشبینی از آن استفاده خواهیم کرد.
# 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")
مرحله چهارم) ساخت مدل حال که داده های آموزشی خود را آماده کردیم، یک شبکه عصبی عمیق میسازیم که دارای 3 لایه است. ما از API متوالی Keras برای این کار استفاده میکنیم. پس از آموزش مدل برای 200 دوره، ما به دقت 100٪ در مدل خود دست یافتیم. اجازه دهید مدل را به عنوان «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 و classses.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 استفاده کنیم که با هزاران کتابخانه مفید برای رابط کاربری گرافیکی در ارتباط است. ما پیام ورودی را از کاربر میگیریم و سپس از توابع کمکی که ایجاد کردهایم برای دریافت پاسخ از ربات و نمایش آن در رابط کاربری گرافیکی استفاده میکنیم. در اینجا کد منبع کامل برای رابط کاربری گرافیکی آمده است.
#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
برنامه در عرض چند ثانیه یک پنجره رابط کاربری گرافیکی باز میکند. با رابط کاربری گرافیکی میتوانید به راحتی با ربات چت کنید.