تشخیص حالت احساسی نویسنده متن

تغییرات پروژه از ابتدا تا تاریخ 1394/01/29


# مقدمه

از دیرگاه کلمه ی "روبات" و "کامپیوتر" به سرد و خشک و بی احساس بودن شناخته شده اند ، ولی میتوان روزی را تصور کرد که این شناخت به کلی متحول شود . 
تشخیص احساسات یا sentiment analysis شاخه ای از علوم کامپیوتر و پردازش زبان (nlp) است که سعی دارد ماشین و هوش مصنوعی را با احساس و عواطف انسانی آشنا سازد و تشخیص آنها از هم را میسر سازد . 
اهمیت این مساله جایی مشخص میشود که به اطرف خود بنگریم و دریابیم همین حالا هم بسیاری از روابط و برخورد های ما با هوش های مصنوعی است .  از کار های روزمره مثل استفاده از کامپیوتر و تلفن همراه - شماره تلفن های پاسخگوی خودکار - استفاده از سایت های مختلف گرفته تا حتی کار های صنعتی و علمی .بدیهیست که Sentiment analysis و تشخیص عواطف میتواند این ماشین ها را به بشر نزدیکتر ساخته و آن ها را قادر به کمک رسانی هر چه بیشتر به او میکند .
مثلا روبات های تخصیص مشتری که امروزه در فروشگاه های زنجیره ای بزرگ کاربردی شده اند را تصور کنید که احساست مشتری را تشخیص داده ، مشتری عصبانی و پرخاشگر را سریعا به مدیریت ارجا میدهد و مشتریان دیگر را به نوبت به باجه های تسویه میفرستد . 
تلفن همراهی را تصور کنید که بر اساس مکالمات شما با افراد تشخیص میدهد که امروز روز دشواری داشته اید و به طور خودکار تماس کسانی که سابقه ی بیشترین دعوا ی لفظی را دارند را بلاک میکند تا شما در آرامش باشید .
شبکه ی اجتماعی را تصور کنید که لحن و احساس شما را از آپدیت روزانه ی که پست کردید تشخیص میدهد و شما را با افرادی با حس مشابه در تماس قرار میدهد تا با هم بر سر مشکل مشترکتان (مثلا حقوق کم ) درد و دل کنید ! همچنین اگر شبکه ی اجتماعی دارای جامعه ی بزرگی باشد اطلاعات جمع آوری شده ی آن برای امور آماری - روان شناسی بی نظیر خواهند بود . مثلا روانشناسان میتوانند شروع یک اپیدمی افسردگی در یک منطقه ی خاص را تشخیص دهند . از آنجا که میزان جرم وقتی که مردم یک منطقه مشکلات روحی دارند بیشتر است پلیس نیز میتواند نیرو های خود را بر این اساس در جا های مختلف تقسیم کند . 
تشخیص احساس در زمان حال بیشترین کاربرد را در سایت های عرضه انواع کالا ( مجازی یا حقیقی ) دارد . بسیار مهم است که مدیر سایت و شرکت عرضه کننده ی محصول بدانند کدام نقد و بررسی ها از یک محصول مثبت هستند و کدام منفی و اینکه شدت منفی یا مثبت بودن چقدر است . کاربر از محصول کمی ناراضی است یا شدیدا ؟ شرکت های بزرگی همچون Amazon و Google و Ebay  از SA  برای بررسی نظرات کاربران استفاده میکنند . این شاخه از SA را Opinion mining میگویند . 
پس تشخیص احساس ماشین های فعلی را یک نسل به جلو رانده و باور عمومی بر بی احساس بودن ماشین ها را کمرنگ تر میسازد . در پی آن باعث آسان تر شدن بسیاری از جهات زندگی انسان نیز خواهد شد . 

# شرح مساله
در این پروژه قصد داریم به کمک SA برنامه ای بنویسیم که حالت روحی نویسنده ی یک حساب سایت Twitter را بررسی و تشخیص دهد . برای ساده تر شدن مساله کمیت "حالت روحی" را یک کمیت بولین در نظر میگیریم به این شکل که شخص میتواند خوشحال - ناراحت - خنثی باشد . 

# چالش ها
در پیاده سازی SA برای یک نوشتار همیشه چالش های زیادی را پیش روی داریم :

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

2. کاربر ممکن است از کنایه - طعنه - شوخی استفاده کند . هر کدام از این موارد در ساختار جمله مفهومی کاملا متفاوت با مفهوم واقعی دارند .
*امروز همونقدر خوشحال بودم که یه بره تو سلاخ خونه خوشحاله !*
*این کامپیوتر کاربردش در حد یه پاره آجر هم نیست*

3. کاربران معمولا از ساختار های جمله ای پیچیده ای استفاده میکنند که به دلیل رسمی نبودن الزاما در چهارچوب کلی ساختار زبان قرار نمیگیرند .
4. بنا به دلایل فوق بررسی تنها لغت به لغت (Lexical) میتواند باعث ایجاد نتایج غلط شود . 

# *کار های مرتبط*

در ضمینه ی sentiment analysis که ازین به بعد آن را به اختصار SA می نامیم  تا به کنون روش های مختلفی پیشنهاد شده . درادامه به بررسی تعدادی از آن ها میپردازیم . 
ٍ**شکلک ها !**
ساده ترین روش تشخیص حالت یک نویسنده  مشاهده ی شکلک ها یا Emoticons ای هست که او در متن به کار برده . با این شکلک های بسیار ساده میتوان مفاهیم احساسی پیچیده ای را انتقال داد . 
مثلا :
*حالم خوب است :))*
مفهوم بسیار ساده ای دارد . در حالی که :
 *حالم خوب است :(*
مفهوم پیچیده تری را منتقل میکند . همانطور که میبینید شکلک ها میتوانند در SA بسیار موثر باشند . با این وجود بسیاری از پروژه های فعلی شکلک ها را به دلایل متعدد نادید میگیرند :
* استفاده نادرست کاربر : همه از شکلک ها برای بیان احساسات خود استفاده نمیکنند . بعضی ممکن است حتی به عادت هم که شده در پایان متن شکلک مثبت به کار ببرند .
*  کاربرد بسیار کم شکلک ها : در متن های جدی شکلک ها کاربر بسیار کمی دارند . به خصوص کاربرانی که دارای هیجان زیادی هستند یا بسیار عصبانی اند ممکن است اصلا از شکلک ها استفاده نکنند . در واقع یک پژوهش نشان داده که میزان استفاده از شکلک ها در محیط های رسمی کمتر از 10% است . [1]
با این حال استفاده از شکلک ها در کنار متد های دیگر SA میتوانند در نتیجه گیری بسیار کمک کننده باشد . 
![نمونه ای از شکلک ها - دسته بندی بر اساس خوب - بد - خنثی بودن آنها](http://www.axgig.com/images/02554980042099388457.png)

**روش لغوی ساده یا Basic lexicon analysis**
 در این روش با استفاده از یک دیکشنری که که تمام لغات مربوط به دامنه ی کاری ما در آن طبق مثبت منفی بودن امتیاز داده شده اند متن را آنالیز میکنیم .  این روش بسیار ساده بوده و در متن لغاتی مثل "خوب" "عالی" "بد" "زشت" و غیره را که همه بار منفی دارند را در نظر گرفته و امتیاز آنها را جمع میکند . نتیجه ی نهایی امتیاز جمله بدست آمده است که اگر مثبت باشد جمله مثبت و اگر منفی باشد جمله را منفی در نظر میگیرد .  این روش با وجود سادگی به دلیل پیچیدگی ساختار زبانی به ندرت مورد استفاده قرار میگیرد . زیرا یک جمله میتواند دارای شماری زیادی از کلمات منفی باشد ولی معنی مثبتی داشته باشد . ( چالش منفی سازی جملات )  \*این کتاب به طرز مسخره و احمقانه ای زیباست\* مشاهده میشود که تکرار کلمات "مسخره" و "احمقانه" دو برابر کلمه ی "زیبا" میباشند ولی با این حال جمله معنایی بسیار مثبت دارد .  مشکل دیگر عدم توانایی شناختن استعارات و کنایات است . این مشکل را تا حدودی میتوان با داشتن یک دیکشنری جدا گانه برای استعارات متداول و روش های تشخیص تشابه مثل NGram تا حدی حل کرد . ولی در این حالت هم بررسی لغتی به تنهایی کافی نیست و باید از روش های دیگری مثل grammar tree  استفاده برد . همچنین بسیاری از جملات که بار مثبت یا منفی دارند ممکن است به هیچ وجه از کلمات احساسی استفاده نکنند : 
 *صفر تا صد این ماشین 2 ثانیه است !*

**متد های پیشرفته تر** به سه نوع تقسیم میشوند : 

1. متد های مبنی بر Machine Learining و استفاده از classifier ها مانند naive bayes  - SVM  و maximum entropy 
2. متد های lexical/nlp که در آن ها به کلمات در یک مقیاس از -11 تا +11 ارزشی معادل با مثبت/منفی بودن کلمه داده شده و متن با استفاده از nlp آنالیز میشود .
3. متد های ترکیبی.
در زیر تعدادی از روش های مورد استفاده را میبینید . برخی از آنها را در ادامه شرح خواهیم داد .
![نموداری از روش های مورد استفاده در SA](http://ars.els-cdn.com/content/image/1-s2.0-S2090447914000550-gr2.jpg)
![تفاوت بین دو روش](http://www.axgig.com/images/59505297294910936812.jpg)
**روش   [7]NLP** 
برای توضیح بیشتر بد نیست با چند دیکشنری آشنا شویم :
ـ Wordnet یک دیکشنری lexical است که برای پژوهش های مربوط به پردازش زبان ساخته شده . این دیکشنری با تاکید بر روی کلمات هم معنا تمام کلمات انگلیسی را در خوشه بندی کرده(به این خوشه ها synset گفته میشود ) و هر کدام از این خوشه ها با خوشه های دیگر میتوانند رابطه ای مثل تضاد یا تناسب داشته باشند . شکل زیر یک تصویر سازی از ساختار Wordnet است :
![وردنت](https://www.languagetrainers.co.uk/blog/wp-content/uploads/visuwords2.jpg)
ـSentiWordnet یک نسخه ی ویرایش شده از ورد نت است که به تمام لغات دو مقدار مثبت بودن و منفی بودن (Positive - Negative)  را نیز نسبت داده که این متغیر ها دو عدد بین 0 و 1 هستند .
بدیهی است که در صورت عدم استفاده از یادگیری ماشین میتوان از دیکشنری  فوق برای بررسی لغات از لحاظ احساسی استفاده نمود . 
همچنین کاربرد دیگر این دیکشنری ها WSD یا Word Sense Disambiguation میباشد به این مفهوم که معنای هر کلمه را در متن (Context) دریابیم ( با توجه به اینکه کلمات بستگی به متن میتوانند چند معنای متفاوت داشته باشند .)
الگوریتم های  WSD خارج از موضوع این پژوهش بوده و بیشتر ازین به آنها اشاره ای نمیشود . با این وجود میتوان از WSD در مرحله ی Preprocessing از الگوریتم های SA برای نتیجه ی دقیق تر استفاده نمود . مشکل عمده ی WSD اینست که در Context های مختصر مثل Twitter دقت کافی را دارا نمیباشد . 

روش NLP را میتوان تکامل یافته ی روش لغوی ساده ( basic lexicon analysis یا Keyword analysis ) دانست . این روش چهار مرحله کلی دارد :

1. شناسایی بخش مهم متن برای SA
2. تشخیص ساختار جمله و تشکیل grammar tree 
3. امتیاز دهی به کلمات مهم تشخیص داده شده در متن (features)
4. امتیاز دهی نهایی به متن 
شکل زیر سیر روش NLP را به طور مختصر نشان میدهد :
![روش NLP](http://www.axgig.com/images/91649736691962041273.png)

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

1. جمع امتیاز های مثبت و منفی feature ها 
![روش اول](http://www.axgig.com/images/29187899690020914871.png)
2. میانگین امتیاز های مثبت و منفی feature ها
![روش دوم](http://www.axgig.com/images/91786573356250529817.png)

مهم ترین ضعف این روش وابستگی به دیکشنری های لکسیکال مانند Wordnet می باشد . این دیکشنری ها برای زبان انگلیسی تهیه شده اند برای سایر زبان ها من جمله فارسی کاملا بلا استفاده اند . برای رفع این مشکل باید به طور دستی یک دیکشنری مختصر مربوط به دامنه ی کاری ما ایجاد شود که بسیار وقت گیر خواهد بود . 
با این وجود روش NLP از لحاظ سرعت و قدرت پردازش بسیار سریعتر از سایر روش ها عمل میکند . هرچند میزان خطای بالای آن و همچنین الزام نوشتن قواعد بسیار برای زبان باعث شده این روش به ندرت مورد استفاده قرار بگیرد . امروزه از روش های Machine learning به دلیل سادگی و همچنین عدم نیاز به دسترسی به ساختار جمله بیشتر استفاده میشود .[7]

# روش های مبتنی بر Machine Learning
این روش ها بر خلاف روش  NLP نیاز به در نظر گرفتن ساختار گرامری جمله ندارند . در عوض باید به طور مناسبی با یک Learning set تربیت (Train) شوند .
"مناسب" از این لحاظ که اگر dataset ما دارای موضوعی خاص مثلا بررسی نقد های یک هتل باشد learning set نیز به تبعه باید از همین نوع باشد . 
استفاده از learning set نامناسب  باعث افت شدیدی در دقت کلاس بندی شده و این اهمیت learning set مناسب را نشان میدهد .
![ساختار کلی الگوریتم های ML](http://www.axgig.com/images/08184453464237735679.png)
**روش بیز ساده [6]  Naive bayes classifier**
روش بیز ساده یک روش قدرتمند دسته بنده (classification) مبتنی بر احتمالات میباشد . در این روش فرض میکنیم تعدادی کلاس (دسته بندی) داریم . احتمال وجود داده ی جدید در هر کدام یک ازین دسته بندی ها را بدست می آوریم . هر کلاسی که احتمال بیشتری را نتیجه داد داده ی خود را به آن کلاس اختصاص میدهیم . [5]
![naivebayes](http://upload.wikimedia.org/math/3/5/e/35e94f179a666c4b5892a11de1b3b29e.png)
فرمول بالا فرمول اصلی classifier است . Px به معنای احتمال x  است . همچنین داریم :
![توضیح تصویر](http://upload.wikimedia.org/math/c/e/6/ce60369195ad9b8b75c0fae0c753b4b2.png)
ـ x در اینجا به معنی دیتای جدید و یک متغیر برداریست و C کلاسی است که دیتا میتواند در آن قرار بگیرد یا نگیرد .
 ![توضیح تصویر](http://upload.wikimedia.org/math/5/0/0/50002026b8b362369a641cce6dc1eab7.png)
 
فرمول فوق را میتوان به زبان ساده اینطور شرح داد که احتمال قرار گرفتن  یک feature در یک کلاس برابر تعداد feature های مشابه یا یکسان است که قبلا در آن کلاس قرار داشته اند .  (کلاس = دسته بندی ) . ولی از آنجا که متن ما شامل برداری از چندین feature ها هست برای بدست آوردن احتمال وجود متن در کلاس مذکور داریم (طبق قانون زنجیره ای ) :
![توضیح تصویر](http://upload.wikimedia.org/math/c/7/f/c7f3f5c70532a89fb880bcade2d4f63b.png)
و چون احتمال رخ دادن feature ها در متن مستقل از هم میباشند داریم :
![توضیح تصویر](http://upload.wikimedia.org/math/8/a/b/8ab63ece73d62513000361a1ecba849a.png)
پس میتوان گفت احتمال قرار گرفتن متن  X در کلاس C برابر است با :
![توضیح تصویر](http://upload.wikimedia.org/math/1/c/6/1c6c6e189b7710beefc1beb3ad099ab2.png)
و 
![توضیح تصویر](http://upload.wikimedia.org/math/d/2/9/d29c4c42e0e8fe4bda3efb3d1a437dd6.png)
توجه کنید که چون Px=Z است و Px در تمام مقایسه های ما ثابت است ( ما میخواهیم یک متن واحد X را با چند کلاس مقایسه کنیم ) مقدار آن را میتوان یک عدد ثابت فرض کرد و در نظر نگرفت . به این ترتیب احتمال اینکه X در هر C باشد را بدست می آوریم و در نهایت هر C که احتمال بالاتری داشت X را به همان دسته تخصیص میدهیم . 
قسمت Training این الگوریتم در تخصیص feature های مناسب به هر کلاس پیش از عمل دسته بندی است . که همان Learning set نام دارد . [8][5]


**روش SVM**
کامل شود[3]

# روش های Unsupervised 
کامل شود [2]

# مراجع

1-   J. Park, V. Barash, C. Fink, and M. Cha. Emoticon style: Interpreting differences in emoticons across cultures. In International AAAI Conference on Weblogs and Social Media (ICWSM), 2013.  
2-Peter Turney (2002). "Thumbs Up or Thumbs Down? Semantic Orientation Applied to Unsupervised Classification of Reviews".
3-Bo Pang; Lillian Lee and Shivakumar Vaithyanathan (2002)."Thumbs up? Sentiment Classification using Machine Learning Techniques"
4-wordnet.princeton.edu . WordNet
5-http://en.wikipedia.org/wiki/Naive_Bayes_classifier
6-  Extracting Opinion Propositions and Opinion Holders using Syntactic and Lexical Cues Steven Bethard , Hong Yu , Ashley Thornton, Vasileios Hatzivassiloglou and Dan Jurafsky
7-  Lexicon-Based Methods for Sentiment Analysis Maite Taboada  Simon Fraser University Julian Brooke University of Toronto Milan Tofiloski Simon Fraser University Kimberly Voll University of British Columbia Manfred Stede  University of Potsdam  
8-http://nlp.stanford.edu/IR-book/html/htmledition/naive-bayes-text-classification-1.html