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

کیانو ریوز
کیانو ریوز


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

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

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

دریافت اطلاعات:

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

q=tweepy.Cursor(api.search,q="keanu reeves",count=100,lang="en",since="2019-06-28",type='recent').items()

در اینجا با دادن زمان توییت که امروز هست و کلمه کلیدی برای سرچ توییت‌های امروز درباره کیانو ریوز را دریافت کردم. ( مقدار ۱۰۰ تعداد بچ‌های سرچ هست که صدتا صدتا توییت‌ها را دریافت می‌کند).

سپس این توییت‌ها را در یک فایل csv ذخیره کردم و به فاز دوم رفتم.

پاکسازی داده‌ها:

در این مرحله که وقت‌گیرترین مرحله تحلیل متن است باید متن را به شکل خام تبدیل کنیم که این کار شامل مراحل پاک‌سازی منشن‌ها و ریتوییت‌ها، پاک‌سازی علائم نگارشی مانند .!؟ ، پاک سازی لینک و پاک سازی اموجی است. برای این کار باید از regex استفاده کنیم که برای من یکی از سخت‌ترین کارهاست :) خلاصه کار به این صورت است :

def clean_tweet(tweet):
        tweet = emoji.demojize(tweet) # translate emojis
        tweet = re.sub('http\S+\s*', '', tweet)  # remove URLs
        tweet = re.sub('RT|cc', '', tweet)  # remove RT and cc
        tweet = re.sub('#\S+', '', tweet)  # remove hashtags
        tweet = re.sub('@\S+', '', tweet)  # remove mentions
        tweet = re.sub('[%s]' % re.escape("""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""), '', tweet)  # remove punctuations
        tweet = re.sub('\s+', ' ', tweet)  # remove extra whitespace
        return tweet
    data.text = data.text.apply(lambda x : clean_tweet(x))


بعد از پاک‌سازی باید هر متن را tokenize کنیم.این به معنی این است که یک متن را به قسمت‌های کوچک تقسیم کنیم به عنوان مثال جمله زیر به این طریق tokenize می‌شود.

"it's sentence that shows how tokenization works"
['it', "'s", 'sentence', 'that', 'shows', 'how', 'tokenization', 'works']

بعد از پاک‌سازی و تبدیل متن به بخش‌های کوچک باید هر بخش را stemming و lemmatization کنیم که stemming یعنی به حالت ساده برگرداندن متن و lemmatization یعنی تبدیل کردن کلمه به ریشه:

تفاوت این دو به صورت خلاصه
تفاوت این دو به صورت خلاصه

تمام اینکارها برای یک‌دست کردن متن و استخراج حداکثر معنی از آن است. هرچند در آخر به این نتیجه می‌رسیم که عدم انجام مرحله آخر یعنی stemming و lemmatization کمک بیشتری به تحلیل احساسات می‌کند چون vader به مدل تایپ هم حساس است اگر شخصی کلمه loved را LOVED بنویسد مقدار نمره آن را بیشتر در نظر می‌گیرد.

تحلیل احساسات:

همان طور که قبلا گفتم برای تحلیل احساسات از الگوریتم vader که مخفف Valence Aware Dictionary and sEntiment Reasoner است استفاده می‌کنم. این الگوریتم یک دیکشنری از پیش ساخته دارد که به عنوان مثال کلمه nice در آن نمره 1.9 را دارد و کلمه tragdy نمره منفی 3.4 را دارد این روش در جمله به دنبال این کلمات می‌گردد و یک برآورد کلی از مقدار مثبت بودن یا منفی بودن متن به ما می‌دهد برای اطلاعات بیشتر می‌توانید این لینک را مطالعه کنید.

با استفاده از این سه خط کد می‌توان این الگوریتم را اجرا کرد.

from nltk.sentiment.vader import SentimentIntensityAnalyzer
sid = SentimentIntensityAnalyzer()
data['score'] = data.text.apply(lambda x : sid.polarity_scores(x)['compound'])

نتیجه هم در این هیستگرام قابل مشاهده است.

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

نتیجه‌گیری و حرف آخر:

  • همانطور که دیدید vader نیازی به داده train ندارد که این از ویژگی‌های مثبت آن است و ما توانستیم از این روش برای استفاده از داده‌هایی که تا قبل از این ندیدیم استفاده کنیم. از طرفی نمی‌توانیم ببینیم مدل ما چقدر اشکال دارد چون داده test نداریم.
  • تحلیل متن بسیار سخت است زیرا کامپیوتر نمی‌تواند sarcasm یا همان طعنه را متوجه شود یعنی وقتی شما بگوید " با دیدن این فیلم می‌توانید به بهترین شکل ممکن وقت خود را درون سطل آشغال بریزید" شاید کامپیوتر این نظر را مثبت ارزیابی کند.
  • تحلیل متن فارسی یکی از بکرترین ضمینه‌های یادگیری ماشین است. دوستانی که دستی در کار دارید بشتابید :)
  • برای تحلیل متن فارسی می‌توانید از هضم استفاده کنید.

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

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