40 گام به سوی آینده‌ای هوشمند - مجموعه وبینارهای رایگان در حوزه هوش مصنوعی
Filter by دسته‌ها
chatGTP
آموزش هوش مصنوعی و انواع آن
آموزش‌های پایه‌ای هوش مصنوعی
اصول هوش مصنوعی
پایتون و ابزارهای یادگیری عمیق
کتابخانه‌ های یادگیری عمیق
یادگیری با نظارت
یادگیری بدون نظارت
یادگیری تقویتی
یادگیری عمیق
یادگیری نیمه نظارتی
آموزش‌های پیشرفته هوش مصنوعی
بینایی ماشین
پردازش زبان طبیعی
پردازش گفتار
چالش‌های عملیاتی
داده کاوی و بیگ دیتا
رایانش ابری و HPC
سیستم‌‌های امبدد
علوم شناختی
دیتاست
اخبار
تیتر یک
رسانه‌ها
آموزش پردازش زبان طبیعی
آموزش علوم داده
اینفوگرافیک
پادکست
ویدیو
رویدادها
کاربردهای هوش مصنوعی
کسب‌و‌کار
تحلیل بازارهای هوش مصنوعی
کارآفرینی
هوش مصنوعی در ایران
هوش مصنوعی در جهان
 آموزش ساخت چت‌بات؛ راهنمایی برای خودکارسازی مکالمات

آموزش ساخت چت‌بات؛ راهنمایی برای خودکارسازی مکالمات

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

چت‌بات چیست؟

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

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

ساخت چت بات

انواع چت‌بات‌ها

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

انواع چت‌بات‌ها

چت‌بات‌ها را از جنبه‌های مختلف می‌توان دسته‌بندی نمود که با توجه به هدفی که ما در این مقاله در پیش گرفتیم به دسته‌بندی بر اساس روش‌های تولید پاسخ استناد می‌کنیم:

چت‌بات‌های مبتنی بر قانون

این چت‌ربات‌ها از منطق اگر- آنگاه (if/then) برای تولید پاسخ‌ها بر اساس شرایط و پاسخ‌های از پیش تعریف شده، استفاده می‌کنند. این چت‌بات‌ها قابلیت‌های سفارشی‌سازی محدودی دارند، اما قابل اعتماد هستند و احتمال خطای پایین‌تری دارند.

چت‌بات‌های مبتنی بر هوش مصنوعی

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

چت‌بات‌های ترکیبی

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

اجزای اصلی چت‌بات‌ها

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

۱. پردازش زبان طبیعی: پردازش زبان طبیعی، چت‌بات‌ها را قادر می‌سازد، متن و گفتار کاربران را به داده‌های ساختاریافته تبدیل کنند تا توسط ماشین قابل درک باشد. NLP شامل مراحل زیر است:
توکن‌سازی: توکن‌سازی که به آن تحلیل واژگانی نیز می‌گویند، فرآیندی است که در آن رشته کلماتی که یک جمله را تشکیل می دهند، بر اساس معنی و رابطه آن با کل جمله، به قطعات کوچکتر «توکن» تقسیم می‌شوند.
نرمال‌سازی: نرمال‌سازی که به آن تحلیل نحوی نیز گفته می شود، فرآیند بررسی کلمات از نظر تایپی و تبدیل آنها به شکل استاندارد است. به عنوان مثال، کلمه “tmrw” به “tomorrow” نرمال‌سازی می‌شود.
شناسایی موجودیت‌ها: شناسایی موجودیت‌ها فرآیندی است که در آن، جستجوی کلمات کلیدی جهت شناسایی موضوع گفتگو انجام می‌گردد.

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

  1. فهم زبان طبیعی (NLU): فهم زبان طبیعی زیرشاخه ای از NLP است که بر درک معنای گفتار انسان با شناسایی الگوها در گفتارهای بدون ساختار تمرکز دارد. همچنین به کمک این شاخه، چت‌بات‌ها می‌توانند اهداف کاربران را طبقه‌بندی کرده و پاسخی را بر اساس داده‌های آموزشی ایجاد کنند. راه حل های NLU دارای ۳ جزء اصلی هستند:
  • دیکشنری یا فرهنگ لغت برای تعیین معنای یک کلمه
  • تجزیه‌کننده (parser) برای تعیین اینکه آیا جمله‌شناسی (نحو) متن با قوانین زبان مطابقت دارد یا خیر
  • قواعد دستور زبان به منظور تجزیه ورودی بر اساس ساختار جمله و یا علائم نگارشی

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

۴. منبع ذخیره‌سازی داده: توسعه‌دهندگان چت‌بات‌ها ممکن است تمایل داشته باشند که مکالمات را برای استفاده از بحث‌های ارزیابی خدمات مشتری و یا اهداف آموزش و یا آزمایش ربات ذخیره کنند. مکالمات چت‌بات را می‌توان به صورت SQL در محل و یا در فضای ابری ذخیره کرد.

۵. مدیریت گفتگو: مدیریت گفتگو بخشی است که مسئولیت کنترل جریان گفتگو بین کاربر و چت‌بات را برعهده دارد. برای تصمیم‌گیری در مورد نحوه پاسخگویی، سوابقی از تعاملات در یک مکالمه توسط مدیریت گفتگو نگه داشته باشد. به عنوان مثال، اگر کاربر بگوید «می‌خواهم بستنی توت‌فرنگی سفارش بدهم» و سپس در ادامه مکالمه بگوید «سفارش من را به بستنی شکلاتی تغییر دهید»، مدیر گفتگو ربات را قادر می‌سازد تا تغییر از «توت فرنگی» به «شکلاتی» را تشخیص دهد و ترتیب را مطابق با آن تغییر دهید.

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

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

۷. رابط کاربری: رابط‌های کاربری مکالمه، قسمت‌های نمایشی و به اصطلاح front-end یک چت بات هستند که نمایش فیزیکی مکالمه را امکان پذیر می‌کنند. آنها به دستیارهای متنی یا مبتنی بر صدا طبقه‌بندی می‌شوند که می‌توان آنها را در پلتفرم‌های مختلفی مانند فیس بوک، واتس‌آپ، تیم‌های گوگل و غیره ادغام کرد.

اجزای اصلی چت بات ها

یک چت‌بات خوب چه مشخصاتی باید داشته باشد؟

توسعه دهندگان چت‌بات‌ها باید در هنگام توسعه آنها روی برخی از معیارهای کیفی تمرکز کنند تا بتوانند محصول خوب و قابل قبولی را عرضه نمایند. برخی از این معیارهای کیفی عبارتند از:

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

چه مهارت‌هایی برای ساخت چت‌بات‌ها مورد نیاز است؟

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

  1. توسعه‌دهندگان چت‌بات باید دانش خوبی از هوش مصنوعی، یادگیری ماشین و پردازش زبان طبیعی داشته باشند.
  2. آشنایی با زبان‌های برنامه نویسی مانند جاوا، پایتون، PHP، Ruby از واجبات توسعه چت‌بات‌ها است
  3. توسعه‌دهندگان باید با پلتفرم‌هایی که به آنها اجازه می‌دهد کیفیت چت‌بات را افزایش دهند، آشنا باشند که در بخش‌های آتی در مورد آنها صحبت خواهد شد.
مهارت های لازم برای ساخت چت بات

پلتفرم‌های ساخت چت‌بات

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

آموزش ساخت چت‌بات

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

  1. تعیین اهداف واقع بینانه در مورد اجرای چت‌بات و پاسخگویی به سوالاتی از قبیل چه نوع خدماتی؟ چه مشکلی باید حل شود؟ هدف از وجود چت بات چیست؟
  2. شناسایی مخاطبان هدف و درک نیازهای آنها
  3. تعیین نوع چت‌بات؛ چت‌بات‎های مبتنی بر قانون و یا چت‌بات‌های مبتنی بر هوش مصنوعی؟
  4. انتخاب پلتفرم مناسب با توجه به زمان، دانش و بودجه شما
  5. انتخاب چارچوب مناسب که بسته به دانش و تجربه شما ممکن است متفاوت باشد. همچنین در این مرحله مشخص می‌کنید که از چه نوع تکنیک یا فناوری استفاده می‌کنید و یا قصد دارید چقدر چت‌بات خود را پیچیده کنید؟
آموزش ساخت چت‌بات

ساخت چت‌بات در پایتون

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

  1. پیش‌نیازها

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

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

  1. فایل داده را وارد و بارگذاری کنید.
  2. پیش‌پردازش داده‌ها
  3. ایجاد داده‌های آموزشی و آزمایشی
  4. ساخت مدل
  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")

مرحله چهارم) ساخت مدل حال که داده های آموزشی خود را آماده کردیم، یک شبکه عصبی عمیق می‌سازیم که دارای ۳ لایه است. ما از 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 و 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

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

اجرای مدل
مرحله ششم ساخت چت‌بات

میانگین امتیاز / ۵. تعداد ارا :

مطالب پیشنهادی مرتبط

اشتراک در
اطلاع از
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
[wpforms id="48325"]