Sajjad Shumaly
Sajjad Shumaly
خواندن ۴ دقیقه·۴ سال پیش

تحلیل احساسات کامنت‌های دیجیکالا بدون استفاده از پیش‌پردازش متن


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

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

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

بعد همشونو دادیم به فست‌تکس و از روش اسکیپ‌گرام استفاده کردیم تا همونطوری که قرار بود بیاد جایگاه کلمات رو پیدا کنه. بردار کلماتی که ایجاد کردو دادیم به مدلهای دیپ CNN و BiLSTM و به موازاتش جهت مقایسه از tf-idf هم استفاده کردیم و خروجیش رو دادیم به مدلهای یادگیری ماشین نایوبیز و لجستیک رگرشن و در نهایت دقتارو مقایسه کردیم که جدول زیر توضیحش میده.

از نظر شاخص‌هامون بهترین مسیری که طی شده بود استفاده از فست‌تکس و CNN بود، پس اومدیم یکبار پیش‌پردازش هم انجام دادیم که ببینیم چقدر این روشو بهتر میکنه که تغییر معناداری نداد :). یه حدسی هم داشتیم که اگه تعداد داده‌های دارای لیبلمون بیشتر بود شاید جواب بهتری میگرفتیم که به همین خاطر از سودولیبلینگ استفاده کردیم و دیدیم که این روش تاثیر زیادی روی خروجیمون داشت. علتش هم این بود که مدل CNNمون تشنه دیتای لیبل دار کامنت‌های منفی بود. این در حالیه که قبل سودولیبلینگ 300هزارتا کامنت منفی و 1.750 میلیون کامنت مثبت داشتیم و بعد از سودولیبلینگ این تعداد شد 400 هزار به 1.8 میلیون. به عبارت دیگه با اضافه شدن 100هزارتا کامنت منفی، f-measureمون 3درصدی بهتر شد.

نتیجه اینکه با استفاده از اسکیپ‌گرام میشه نیاز به پیش‌پردازشو کاهش که هیچی اصا حذف کرد ولی هزینش تعداد داده زیاد برای آموزش مدله. به طور کلی میارزه چون دقتی که بدست آوردیم در مقایسه با کارای دیگه‌ای که پیش پردازشم کرده بودند خیلی بهتر بود. مثلا Saraee & Bagheri, 2013 که روی توسعه الگوریتم پیش‌پردازش متن کار کرده بودن با نایوبیز F-measure شون 0.878 شد. Asgarian, Kahani & Sharifi, 2018 که الگوریتم‌های مختلف پیش‌پردازش متن و یادگیری ماشین رو امتحان کرد و بهترین F-measure اش با SVM بود که 0.915 شد. Roshanfekr, Khadivi & Rahmati, 2017 هم مثل ما تلاششون این بوده که با استفاده از روش‌های عمیق نیاز به پیش‌پردازش رو کاهش یدن که زمان نوشتن مقالمون باهاشون آشنا شدیم و بهترین F-measure اینا هم با BiLSTM 0.532 شد و با CNN هم 0.534 شد. همه مثال‌هایی که زدم مثل خودمون روی متن کامنت‌های محصولات دیجیتال بودن و مسئلشون تحلیل احساسات دو کلاسه به زبان فارسی بود.


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

https://peerj.com/articles/cs-422/


کدهای مقاله، بردار ویژگی شگفت‌انگیزمون و کل مسیری که طی کردیم هم داخل گیت‌هاب استاد عزیزم (دکتر یزدی‌نژاد) هستش که میتونید ازش استفاده کنید:

https://github.com/mosiomohsen/persian-sentiment-analysis-using-fastText-word-embedding-and-pseudo-labeling
تحلیل احساساتدیجیکالاcnn
شاید از این پست‌ها خوشتان بیاید