پردازش زبان طبیعی جذاب است! قسمت دوم

این مطلب قسمتی از مجموعه پردازش زبان طبیعی است : قسمت اول ، قسمت دوم ، قسمت سوم ، قسمت چهارم

کلاسه بندی متن، سلاح سرّی جدید شماست!

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

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

نتایجی که شما می توانید با کلاسه بندی متن در مقایسه با تلاش برای توسعه آن به دست می آورید، به طور غیر قابل انکاری بهتر است. پس بیایید شروع کنیم!

از پایین به بالا

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

تعداد زیادی از محتوا هایی که توسط کاربر ایجاد شده اند، بهم خورده، بدون ساختار و به گفته بعضی ها حتی مزخرف می باشند:

پردازش زبان طبیعی متن بی معنی

بیشتر و بیشتر به نظر می رسد که هر جوان حرفه ای باید در همه زمان ها، یک کیسه برای نگه داشتن کاغذ داشته باشد.

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

استفاده از مدل های کلاسه بندی برای استخراج معنا

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

پردازش زبان طبیعی نظر کاربر

همان طور که در تصویر بالا می بینید، من به پارکینگ یک نظر ۵ ستاره دادم. ولی اگر من این نظر را بدون یک درجه بندی ستاره ای پست می کردم، باز هم شما به صورت خودکار متوجه می شدید که با توجه به  توضیحی که دادم، من این پارکینگ را دوست داشتم.

چگونه ما می توانیم برنامه ای بنویسیم که بتواند این متن را بخواند و متوجه شود که من پارکینگ را دوست داشتم، آن هم بدون اینکه من مستقیما در متن بگویم که “من این پارکینگ را دوست دارم” ؟ ترفند این است که این وظیفه ی درک زبان پیچیده را به عنوان یک مساله کلاسه بندی ساده، تغییر دهید.

بیایید یک کلاسه بندی کننده خطی ساده که در لغات به کار می رود، تنظیم کنیم.این ورودی به کلاسه بندی کننده، متن مروری می باشد.خروجی یکی از این برچسب های ثابت می باشد –  “1 ستاره”، “۲ ستاره”،”۳ ستاره”، “۴ ستاره”، “۵ ستاره”.

پردازش زبان طبیعی کلاسه بندی نظر کاربر

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

برای آموزش مدل کلاسه بندی متن، ما تعداد زیادی از نظرات های کاربردی در مکان های مشابه ( پارکینگ ها، تجارت ها، آثار باستانی، هتل ها، و هر چیزی که ما می توانیم پیدا کنیم ) که کاربر یک نظر متنی نوشته است و یک درجه بندی ستاره ای درج کرده است، جمع آوری خواهیم کرد. و با تعداد زیادی از آن ها ( منظورمان میلیون ها نظر است! ) یک مدل برای پیش بینی درجه بندی ستاره ای بر اساس متن مشابه، آموزش خواهیم داد.

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

پردازش زبان طبیعی نظر کاربر منفی

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

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

چرا این روش کار می کند؟ بسیار ساده به نظر می رسد!

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

دلایل متعددی وجود دارد که چرا کار با متن، به عنوان یک مسئله کلاسه بندی به جای یک مسئله درک متن، بسیار خوب عمل می کند؛ حتی زمانی که از مدل های خطی کلاسه بندی نسبتا ساده استفاده می کنیم.

اولا، مردم دائما زبان را به وجود آورده و تکامل می دهند. مخصوصا زمانی که یک لغت آنلاین که پر از الگو های رفتاری فضای مجازی و ایموجی ها می باشد، نوشتن کد برای تجزیه توییت ها و نظرات کاربران را بسیار سخت می کند.

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

دوم، کاربران اینترنت همیشه به زبان مخصوص که شما انتظار دارید، نمی نویسند. یک پایپ لاین NLP که برای مدیریت زبان انگلیسی آمریکایی آموزش دیده است، اگر به آن متن آلمانی دهند، از کار می افتد. همچنین اگر کاربر شما تصمیم بگیرد که نظراتش را به صورت Cockney Rhyming Slang که در اصل نوعی از زبان انگلیسی است، بنویسد، عملکرد ضعیف خواهد بود.

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

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

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

با کلاسه بندی متن چه کاری می توانید انجام دهید؟

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

کلاسه بندی متن، کاربرد های سودمند زیادی دارد. یکی از آن ها که شما احتمالا هر روز بدون اینکه بدانید، به عنوان یک مصرف کننده از آن استفاده می کنید، ویژگی فیلترینگ ایمیل های ناشناس است که در سرویس ایمیل قرار گرفته است. اگر شما دسته ای از ایمیل های واقعی خود را که تحت عنوان ” اسپم ” و ” غیر اسپم ” هستند، داشته باشید، می توانید از آن ها برای آموزش یک مدل کلاسه بندی که در آینده به صورت خودکار ایمیل های ناشناس را کلاسه بندی خواهد کرد، استفاده کنید:

پردازش زبان طبیعی کلاسه بندی ایمیل

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

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

پردازش زبان طبیعی کلاسه بندی تیکت پشتیبانی

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

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

پردازش زبان طبیعی کلاسه بندی پست رسانه اجتماعی

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

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

پردازش زبان طبیعی کلاسه بندی توضیحات پروژه

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

شما حتی می توانید سیستم هایی بسازید که یک مدل کلاسه بندی در یک مدل کلاسه بندی دیگر قرار می گیرد. یک سیستم پشتیبانی  کاربران را در نظر بگیرید که کلاسه بندی کننده اول زبان کاربر ( انگلیسی یا آلمانی ) را حدس می زند، کلاسه بندی کننده دوم حدس می زند که کدام گروه برای کنترل ( مدیریت ) خواسته های آن ها مناسب است، و کلاسه بندی سوم حدس می زند که کاربر قبلا برای گرفتن کد اولویت تیکت، دچار زحمت شده است یا نه. شما می توانید هر چقدر که می خواهید پیچیده و مرموزشوید!

حالا که شما نسبت به شگفتی های مدل های کلاسه بندی متن های بی قاعده متقاعد شدید، بیایید تا یاد بگیریم دقیقا چگونه می توانیم آن را بسازیم!

ساخت مدل نظرات کاربران با fastText

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

شما می توانید fastText را با دنبال کردن این دستورالعمل ها ، نصب کنید.  

گام ۱ : دانلود داده ی آموزشی

برای ساخت یک مدل نظرات کاربران ، ما به داده های آموزشی نیاز داریم. خوشبختانه، Yelpیک مجموعه داده تحقیقی از ۷/۴ میلیون نظر کاربری تهیه کرده است. شما می توانید آن را از اینجا دانلود کنید (ولی به یاد داشته باشید که شما نمی توانید از این داده برای ساخت برنامه های تبلیغاتی استفاده کنید).

وقتی که شما داده را دانلود می کنید، شما یک فایل json که به اندازه ۴ گیگابایت است و reviews.json نام دارد، خواهید گرفت. هر خط در یک فایل json به همراه داده هایی شبیه به این است:

{
  "review_id": "abc123",
  "user_id": "xyy123",
  "business_id": "1234",
  "stars": 5,
  "date":" 2015-01-01",
  "text": "This restaurant is great!",
  "useful":0,
  "funny":0,
  "cool":0
}

گام ۲ : داده را فرمت و پیش پردازش کنید.

اولین مرحله این است که این فایل را به فرمتی که fastText انتظار دارد، تبدیل کنید.

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

به عبارت دیگر، داده نظرات رستوران ما نیاز دارد تا مثل این قالب بندی مجدد شود:

__label__5 This restaurant is great!
__label__1 This restaurant is terrible :'(

اینجا یک از کد ساده پایتون را می بینید که نظرات را از فایل .json می خواند و یک فایل متنی را در فرمت fastText  می نویسد:

اجرای این کد، یک فایل جدید به نام fastText_dataset.txt به وجود می آورد که ما می توانیم آن را برای آموزش، در fastText قرار دهیم. گرچه ما هنوز اینجا نرسیده ایم. هنوز هم نیاز داریم تا بعضی پیش پردازش های مکمل را انجام دهیم.

fastText برای هر مکالمه در زبان انگلیسی (یاهر زبان دیگری)، بی توجه است. تا آنجایی که می تواند بفهمد ، Hello و hello و hello! کلمات کاملا متفاوتی هستند زیرا آن ها حروف دقیقا یکسانی ندارند. برای رفع این مشکل، ما می خواهیم یک مرور سریع در متن داشته باشیم تا همه چیز را به حروف کوچک تبدیل کنیم و فضا های خالی قبل از علائم نگارشی بگذاریم. این کار هنجار سازی متن نام دارد و کار را برای fastText بسیار آسان تر می کند تا الگوهای آماری را از اینجا بردارد.

این بدین معناست که جمله” This restaurant is great! ” باید بشود ” this restaurant is great ! “

اینجا یک تابع ساده از پایتون را می بینید که ما می توانیم آن را به کد خود برای انجام این کار، اضافه کنیم:

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

گام ۳ : داده را به مجموعه آموزشی و مجموعه آزمایشی تقسیم کنید

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

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

اینجا یک نسخه نهایی از کد تجزیه داده وجود دارد که مجموعه داده ی Yelp را می خواند، فرمت رشته ای را پاک می کند و فایل های آموزشی و آزمایشی را جداگانه می نویسد. این کد به طور کاملا تصادفی ۹۰ درصد از داده را به عنوان داده آموزشی و ۱۰ درصد را به عنوان داده آزمایشی، جدا می کند:

آن را اجرا کنید، شما دو فایل خواهید داشت  fastText_dataset_training.txtو fastText_dataset_test.txt حالا ما آماده ی آموزش هستیم!

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

گام ۴ : مدل را آموزش دهید

شما می توانید یک کلاسه بند را با استفاده از ابزار خط دستور fastText آموزش دهید. شما فقط باید fastText را فراخوانی کرده، کلیدواژه ی supervised را وارد کنید تا به آن بگویید یک مدل کلاسه بندی نظارت شده آموزش دهد و به آن یک فایل آموزشی و یک نام خروجی برای مدل بدهید:

fasttext supervised -input fasttext_dataset_training.txt -output reviews_model 

فقط ۳ دقیقه طول کشید تا این مدل را با ۸۵۰ میلیون لغت روی لپ تاپم آموزش دهم. بد نبود!

گام ۵ : مدل را آزمایش کنید

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

fasttext test reviews_model.bin fasttext_dataset_test.txt
N 474292
P@1 0.678
R@1 0.678

این به این معنی است که ازمیان ۴۷۴۲۹۲ نمونه، مدل، درجه بندی ستاره ای دقیق کاربر را در ۸/۶۷% از مواقع، درست حدس می زند. برای شروع بد نیست.

شما همچنین می توانید از fastText بخواهید تا بررسی کند که چند وقت یکبار درجه بندی ستاره ای صحیح، در یکی از دو پیش بینی برتر قرار می گیرد ( به عنوان مثال اگر دو تا از برترین حدس های مدل با بیشترین احتمال “۵” و “۴” باشند و کاربر گفته باشد “۴” ) :

fasttext test reviews_model.bin fasttext_dataset_test.txt 2
N 474292
P@2 0.456
R@2 0.912

این یعنی ۲/۹۱% از مواقع، اگر ما دو تا از بهترین حدس های آن را در نظر بگیریم، مدل درجه بندی ستاره ای کاربر را به درستی تشخیص می دهد. این یک نشانه ی خوب است که مدل در بیشتر موارد، خیلی گمراه نیست.

شما همچنین می توانید مدل را به صورت تعاملی با اجرای فرمان fasteText predict امتحان کنید و بعد در نظر های خود بنویسید. وقتی شما enter را بزنید، مدل پیش بینی خود برای هر کدام را خواهد گفت:

fasttext predict reviews_model.bin -
this is a terrible restaurant . i hate it so much .
__label__1
this is a very good restaurant .
__label__4
this is the best restaurant i have ever tried .
__label__5

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

گام ۶ : دوباره روی مدل آموزش را تکرار کنید تا آن را دقیق تر کنید

با تنظیمات پیش فرض آموزشی، fastText هر لغت را بدون وابستگی به دیگری پیدا می کند و در کل به ترتیب لغت ها توجه نمی کند. ولی وقتی شما یک مجموعه داده آموزشی بزرگ دارید، می توانید از آن بخواهید با استفاده از پارامتر wordNgrams به ترتیب لغات توجه کنند. این کار باعث خواهد شد تا به جای لغت های تکی ، گروه هایی از لغات را جستجو کند.

برای یک مجموعه داده از میلیون ها لغت، پیدا کردن دو جفت لغت، ( که bigrams نامیده می شوند ) به جای تک لغت ها ، یک نقطه ی شروع خوب برای پیشرفت مدل می باشد.

بیایید یک مدل جدید با استفاده از پارامتر wordNgrams2  آموزش دهیم و ببینیم چگونه عمل می کند :

fasttext supervised -input fasttext_dataset_training.txt -output reviews_model_ngrams -wordNgrams 2

این کار آموزش را کمی طولانی خواهد کرد و فایل مدل را بزرگ تر می کند ( زیرا حالا یک ورودی برای هر دو جفت لغت در داده وجود دارد )، ولی اگر به ما دقت بالاتری بدهد ارزشش را دارد.

وقتی آموزش کامل شد، شما می توانید فرمان آزمایش را با همان شیوه قبلی دوباره اجرا کنید:

fasttext test reviews_model_ngrams.bin fasttext_dataset_test.txt

برای من، استفاده از wordNgrams2 مرا به میزان دقت ۲/۷۱% در مجموعه آزمایشی رساند، که یک پیشرفت ۴درصدی است. همچنین به نظر می رسد که تعداد خطا های واضح مدل کاهش یافته است زیرا حالا مدل کمی به مفهوم هر لغت توجه می کند.

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

برای مثال، کد پیش پردازش متن آزمایشی من، نام معمول رستوران را از P.F. Chang به p . f . chang تغییر داده است که برای fastText مانند پنج لغت جداگانه در نظر گرفته می شود.

اگر شما مواردی شبیه به این دارید که لغات مهمی که یک مفهوم را نمایش می دهند، در حال جداشدن از هم هستند، می توانید یک کد سفارشی برای درست کردن آن، بنویسید. در این مورد، می توانید کدی برای پیدا کردن اسامی رایج رستوران، اضافه کنید و آن ها را با عباراتی مانند P_F_Chang جایگذاری کنید، در نتیجه fastText هر کدام را مانند یک تک لغت می بیند.

گام ۷ : مدل را در برنامه خود استفاده کنید!

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

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

وقتی که نصب شد، اینجا کد کامل برای بارگذاری آن و استفاده از آن برای امتیازدهی به نظرات کاربری، وجود دارد:

و اینجا می بینید که وقتی اجرا شد چگونه می شود:

☆☆☆☆☆ (۱۰۰% confidence)
This restaurant literally changed my life. This is the best food I've ever eaten!
☆ (۸۸% confidence)
I hate this place so much. They were mean to me.
☆☆☆ (۶۴% confidence)
I don't know. It was ok, I guess. Not really sure what to say.

نتایج پیش بینی بسیار عالی هستند! و بیایید ببینیم نظر من در  Yelpرا چه پیش بینی می دهد:

☆☆☆☆☆ (۵۸% confidence)
This used to be a giant parking lot where government employees that worked in the country building would park. They moved all the parking underground and built an awesome park here instead. It's literally the reverse of the Joni Mitchell song.

عالی است!

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

حالا می توانید بروید و کلاسه بند متن خودتان را بسازید!

اگر شما این متن را دوست داشتید، نظر بگذارید و زمینه های مورد علاقه خود را به ما بگویید.

بیشتر بخوانید :

منبع Medium

همچنین ببینید

فناوری تشخیص چهره و کاربردهای آن، تاریخچه تکنولوژی تشخیص چهره

فناوری تشخیص چهره و کاربردهای آن + تاریخچه

فناوری تشخیص چهره یک فناوری بیومتریک است که با استفاده از تجزیه و تحلیل الگوهایی …

2 نظر

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

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *