هوش مصنوعی ۲۹۳۱ بازدید

«تحلیل احساسات» (Sentiment Analysis)، به استفاده از روش‌های «پردازش زبان طبیعی» (Natural Language Processing)، «تحلیل متن» (Text Analysis)، «زبان‌شناسی محاسباتی» (Computational Linguistics) و «بیومتریک» (Biometric)، با هدف «شناسایی» (Identify)، «استخراج» (Extract)، «تعیین کمیت» (Quantify) و مطالعه «حالات حسی» (Affective States) و اطلاعات «ذهنی» (Subjective) موجود در داده‌های متنی غیر ساخت یافته اطلاق می‌شود. امروزه، روش های تحلیل احساسات برای مشخص کردن نظر مردم در رابطه با محصولات، سرویس‌ها و موضوعات روز دنیا استفاده می‌شوند. این دسته از روش‌ها، در حوزه‌های مختلفی نظیر «بازاریابی» (Marketing)، «خدمات مشتریان» (Customer Service) و «پزشکی بالینی» (Clinical Medicine) برای تحلیل احساسات و عواطف مردم مورد استفاده قرار می‌گیرند. به تحلیل احساسات، «کاوش نظرات» (Opinion Mining) نیز گفته می‌شود. تحلیل احساسات، یکی از حوزه‌های پرکاربرد در حوزه «یادگیری ماشین» (Machine Learning) و «هوش مصنوعی» (Artificial Intelligence) محسوب می‌شود.

فهرست مطالب این نوشته

شناسایی احساسات، یکی از شایع‌ترین وظایف «دانشمندان داده» (Data Scientists) شاغل در سازمان‌ها و شرکت‌های تجاری محسوب می‌شود. در شرکت‌های تجاری، شناسایی و تحلیل احساسات مشتریان و کاربران در رابطه با یک سرویس یا محصول خاص، بخش بزرگی از فعالیت‌های قابل انجام در تیم‌های «تحقیق و توسعه» (Research and Development) این شرکت‌ها است. بهبود ویژگی‌های یک محصول یا سرویس و یا ارائه یک سرویس یا محصول جدید، بدون شناسایی و تحلیل احساسات کاربران و مشتریان، قطعا نتایج مناسبی در بر نخواهد داشت.

روش های تحلیل احساسات

این مطلب، از دو بخش تشکیل شده است؛ در بخش اول، یک سیستم تحلیل احساساتِ (موجود در نظرات) مردم در رابطه با فیلم‌های سینمایی (Movie Review Classifier) و پیاده‌سازی آن در زبان برنامه‌نویسی پایتون شرح داده می‌شود. در مرحله بعد، پیاده‌سازی یک سیستم تحلیل احساسات ساده، برای دسته‌بندی احساسات موجود در پیام‌های کاربران شبکه اجتماعی توییتر، توضیح داده خواهد شد.

اهمیت تحلیل احساسات در حوزه‌های کاربردی مختلف

امروزه، روش های تحلیل احساسات در حوزه‌های کاربردی مختلفی نظیر «تجارت» (Business)، «سیاست» (Politics) و «اقدامات عمومی» (Public Action) کاربرد دارند.

روش های تحلیل احساسات در تجارت

در حوزه بازاریابی، با استفاده از روش های تحلیل احساسات، شرکت‌ها قار خواهند بود، استراتژی‌های کلان خود را توسعه دهند، احساسات مردم در قبال سرویس‌ها و محصولات خود را بفهمند، واکنش مردم در قبال تبلیغات و عرضه یک محصول خاص را بسنجند و دلایل عدم موفقیت یک محصول (از دیدگاه مشتری) را شناسایی کنند.

روش های تحلیل احساسات در سیاست

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

روش های تحلیل احساسات در مطالعه مسائل اجتماعی

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

روش های تحلیل احساسات

دسته‌بندی انواع روش های تحلیل احساسات

ساده‌ترین وظیفه یک سیستم تحلیل احساسات، دسته‌بندی «قطبیت» (Polarity) احساسات منعکس شده در یک داده متنی است. این دسته‌بندی می‌تواند در سطح «سند» (Document)، «جمله» (Sentences) و «ویژگی/ جنبه» (Feature/Aspect) انجام شود. در چنین حالتی، تمامی نظرات بیان شده در اسناد متنی، جملات و یا کلمات، در دسته «مثبت» (Positive)، «منفی» (Negative) و یا «خنثی» (Neutral) دسته‌بندی می‌شوند. سیستم‌های پیشرفته تحلیل احساسات نیز به دنبال پیدا کردن حالات حسی دیگر نظیر غمگین، شاد، ناراحت و سایر موارد، در اسناد حاوی زبان طبیعی هستند.

روش های تحلیل احساسات مبتنی بر ذهنیت/عینیت

روش های تحلیل احساسات مبتنی بر «ذهنیت» (Subjectivity) / «عینیت» (Objectivity)، یک سند متنی حاوی زبان طبیعی (معمولا در سطح جمله اقدام به تحلیل احساسات می‌کنند) را به دو دسته ذهنی و عینی دسته‌بندی می‌کنند. سند متنی عینی، سندی است که اطلاعات و محتوا را معمولا به صورت خبری و بدون استفاده از کلمات منعکس کننده احساسات قوی منتقل می‌کند. در حالی که در اسناد ذهنی، احساسات و نظر شخصی یا حسی نویسنده یا مخاطبین، به وضوح مشهود هستند و از کلمات منعکس کننده احساسات قوی، به وفور در آن‌ها استفاده می‌شود.

پیچیدگی این دسته از روش های تحلیل احساسات، معمولا بسیار بیشتر از دسته‌بندی قطبیت در اسناد متنی است؛ زیرا ذهنیت کلمات موجود در یک متن، به «قالب محتوایی» (Context) و زمینه موضوعی آن متن بستگی دارد. دلیل دیگر پیچیدگی بالای روش های تحلیل احساسات مبتنی بر ذهنیت / عینیت این است که برخی از جملات عینی موجود در اسناد متنی، ممکن است حاوی جملات ذهنی نیزی باشند (نظیر یک مقاله خبری که در آن احساسات مردم نسبت به یک موضوع خاص بیان شده است).

روش های تحلیل احساسات مبتنی بر ویژگی/جنبه

روش های تحلیل احساسات مبتنی بر ویژگی/جنبه (Feature/aspect-based)، «نظرات» (Opinions) یا احساسات بیان شده در مورد ویژگی‌ها، جنبه‌ها و یا موجودیت‌های مختلف را (مانند نظر مردم در رابطه با یک تلفن همراه، دوربین و یا بانک خاص)، مشخص می‌کند. منظور از یک ویژگی یا جنبه، مشخصه یا مؤلف خاص از یک موجودیت است (مانند صفحه نمایش یک تلفن همراه، خدمات یک رستوران و یا کیفیت تصویر یک دوربین). مزیت مهم روش های تحلیل احساسات مبتنی بر ویژگی/ جنبه، امکان شناسایی و تحلیل نکات ظریف مرتبط با یک موجودیت خاص و مورد علاقه است. ویژگی‌های مختلف یک موجودیت خاص می‌توانند «پاسخ‌های احساسی» (Sentiment Responses) متفاوتی تولید کنند؛ به عنوان نمونه، یک هتل می‌تواند مکان بسیار عالی برای اقامت باشد ولی کیفیت غذای مناسبی نداشته باشد (یک نکته ظریف در مورد یک هتل). در روش های تحلیل احساسات مبتنی بر ویژگی/ جنبه، مسأله‌ای که قرار است حل شود، معمولا به تعدادی زیر مسأله با وظایف مشخص تقسیم‌بندی می‌شود. این زیر مسأله‌ها عبارتند از:

  •  شناسایی موجودیت‌های مرتبط در اسناد متنی
  • استخراج ویژگی‌ها یا جنبه‌های موجود در موجودیت‌ها با توجه به قالب محتوایی یا زمینه موضوعی
  • مشخص کردن مثبت، منفی یا خنثی بودن نظر یا احساس بیان شده در ویژگی‌ها یا جنبه‌های استخراج شده از داده‌های متنی

در این دسته از روش های تحلیل احساسات، شناسایی خودکار ویژگی‌ها، از طریق به‌کارگیری روش‌های نحوی مبتنی بر «مدل‌سازی موضوعی» (Topic Modelling) و «یادگیری عمیق» (Deep Learning) امکان‌پذیر است.

روش های تحلیل احساسات

بخش اول: تحلیل احساساتِ نظرات مردم در رابطه با فیلم‌های سینمایی

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

داده‌های لازم برای پیاده‌سازی سیستم و آماده‌سازی آن‌ها

برای تحلیل و دسته‌بندی احساساتِ موجود در نظرات مردم در رابطه با فیلم‌های سینمایی، از یک «مجموعه داده» (Dataset) به نام IMDb Reviews استفاده شده است. در این مجموعه داده، تعداد پنجاه هزار «نقد فیلم» (Movie Review) از وب‌سایت IMDb گردآوری شده است. این مجموعه داده، از طریق لینک [+] قابل دسترسی و بارگیری است. برای پیاده‌سازی، آموزش و تست یک مدل یادگیری تحلیل احساسات، لازم است تا داده‌های موجود در مجموعه داده IMDb Reviews، به دو دسته «داده‌های آموزشی» (Training Data) و «داده‌های تست» (Test Data) تقسیم‌بندی شوند. برای چنین کاری، تعداد 25 هزار داده موجود در این مجموعه داده، برای آموزش مدل یادگیری تحلیل احساسات و تعداد 25 هزار نقد فیلم باقی‌مانده، برای تست مدل در نظر گرفته می‌شوند. همچنین، در هر کدام از مجموعه داده‌های آموزشی و تست، تعداد 12 هزار و پانصد داده نقد فیلم، در کلاس مثبت و تعداد 12 هزار و پانصد داده باقی‌مانده، در کلاس منفی «برچسب‌گذاری» (Labelling) شده‌اند. به‌عبارت دیگر، توزیع داده‌های کلاس منفی و مثبت، در داده‌های آموزشی و تست برابر است.

فرایند رتبه‌بندی فیلم‌ها در مجموعه داده IMDb Reviews به این صورت است که وب‌سایت IMDb، به کاربران خود اجازه می‌دهد، فیلم‌ها را با نمراتی در مقیاس 1 تا 10 نمره‌دهی کنند. برای برچسب‌گذاری داده‌ها (اختصاص دادن برچسب کلاسی «مثبت» (Positive) و «منفی» (Negrative) به هر کدام از نمونه‌های نقد فیلم)، تمامی نقدهایی که امتیاز آن‌ها ($$\leq4$$) هستند، با برچسب کلاسی منفی برچسب‌گذاری می‌شوند. همچنین، تمامی نقدهایی که فیلم را با امتیاز ($$\geq7$$) رتبه‌بندی کرده‌اند، با برچسب کلاسی مثبت برچسب‌گذاری خواهند شد.

روش های تحلیل احساسات

مرحله اول: بارگیری و ادغام داده‌های نقد فیلم جمع‌آوری شده

پس از بارگیری فایل موجود در لینک [+]، از کد اسکریپت زیر استفاده می‌شود تا داده‌های موجود در فایل، «پردازش مقدماتی» (Preliminary Processing) شوند. در مرحله پردازش مقدماتی داده‌های نقد فیلم، ابتدا داده‌هایی که در کلاس‌های مثبت و منفی قرار دارند، جداسازی می‌شوند. سپس، داده‌هایی که در کلاس یکسان قرار دارند، با یکدیگر ادغام می‌شوند. در مرحله بعد، داده‌ها به دو کلاس آموزشی و تست تقسیم‌بندی می‌شوند.

# unzip and unpack the tar file
gunzip -c aclImdb_v1.tar.gz | tar xopf -

cd aclImdb

mkdir movie_data

# puts four files in the combined_files directory:
# full_train.txt, full_test.txt, original_train_ratings.txt, and original_test_ratings.txt
for split in train test;
do

  for sentiment in pos neg;
  do 
    
    for file in $split/$sentiment/*; 
    do
              cat $file >> movie_data/full_${split}.txt; 
              echo >> movie_data/full_${split}.txt; 

	     # This line adds files containing the original reviews if desired
             # echo $file | cut -d '_' -f 2 | cut -d "." -f 1 >> combined_files/original_${split}_ratings.txt; 
    done;
  done;
done;

مرحله دوم: خواندن داده‌های پردازش‌ شده در زبان برنامه‌نویسی پایتون

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

reviews_train = []
for line in open('../data/movie_data/full_train.txt', 'r'):
    reviews_train.append(line.strip())
    
reviews_test = []
for line in open('../data/movie_data/full_test.txt', 'r'):

مرحله سوم: آماده‎سازی و پیش‌پردازش داده‌ها

داده‌های خام جمع‌آوری شده، ساخت یافته نیستند و پردازش‌های اولیه انجام شده روی آن‌ها، برای استخراج ویژگی‌های موجود در داده‌های متنی مناسب نیستند. داده‌های خام متنی نقد فیلم، معمولا بسیار نامنظم هستند و پیش از انجام هر گونه تحلیل روی آن‌ها، باید «پیش‌پردازش» (Preprocessing) شوند تا ویژگی‌های لازم برای دسته‌بندی احساسات موجود در آن‌ها استخراج شوند. به عنوان نمونه، داده‌ای که در ادامه نمایش داده شده است، یک نمونه نقد جمع‌آوری شده از وب‌سایت IMDb است.

reviews_train = []
for line in open('../data/movie_data/full_train.txt', 'r'):
    
    reviews_train.append(line.strip())
    
reviews_test = []
for line in open('../data/movie_data/full_test.txt', 'r'):
    
    reviews_test.append(line.strip())

خروجی:

"This isn't the comedic Robin Williams, nor is it the quirky/insane Robin Williams of recent thriller fame. This is a hybrid of the classic drama without over-dramatization, mixed with Robin's new love of the thriller. But this isn't a thriller, per se. This is more a mystery/suspense vehicle through which Williams attempts to locate a sick boy and his keeper.<br /><br />Also starring Sandra Oh and Rory Culkin, this Suspense Drama plays pretty much like a news report, until William's character gets close to achieving his goal.<br /><br />I must say that I was highly entertained, though this movie fails to teach, guide, inspect, or amuse. It felt more like I was watching a guy (Williams), as he was actually performing the actions, from a third person perspective. In other words, it felt real, and I was able to subscribe to the premise of the story.<br /><br />All in all, it's worth a watch, though it's definitely not Friday/Saturday night fare.<br /><br />It rates a 7.7/10 from...<br /><br />the Fiend :."

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

import re

REPLACE_NO_SPACE = re.compile("[.;:!\'?,\"()\[\]]")
REPLACE_WITH_SPACE = re.compile("(<br\s*/><br\s*/>)|(\-)|(\/)")

def preprocess_reviews(reviews):
    reviews = [REPLACE_NO_SPACE.sub("", line.lower()) for line in reviews]
    reviews = [REPLACE_WITH_SPACE.sub(" ", line) for line in reviews]
    
    return reviews

reviews_train_clean = preprocess_reviews(reviews_train)
reviews_test_clean = preprocess_reviews(reviews_test)

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

"this isnt the comedic robin williams nor is it the quirky insane robin williams of recent thriller fame this is a hybrid of the classic drama without over dramatization mixed with robins new love of the thriller but this isnt a thriller per se this is more a mystery suspense vehicle through which williams attempts to locate a sick boy and his keeper also starring sandra oh and rory culkin this suspense drama plays pretty much like a news report until williams character gets close to achieving his goal i must say that i was highly entertained though this movie fails to teach guide inspect or amuse it felt more like i was watching a guy williams as he was actually performing the actions from a third person perspective in other words it felt real and i was able to subscribe to the premise of the story all in all its worth a watch though its definitely not friday saturday night fare it rates a from the fiend"

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

برداری‌سازی داده‌ها

برای اینکه مدل یادگیری تحلیل احساسات بتواند ویژگی‌های موجود در داده‌های متنی را تحلیل و احساسات موجود در آن‌ها را دسته‌بندی کند، داده‌های آموزشی باید در یک قالب قابل فهم برای مدل یادگیری باشند. به عبارت دیگر، باید برای هر کدام از داده‌های نقد فیلم، «نمایشی عددی» (Numerical Representation) تولید کرد که متناظر با ویژگی‌های موجود در داده‌های متنی باشد. به فرآیند تولید نمایش عددی، «برداری‌سازی» (Vectorization) گفته می‌شود.

ساده‌ترین شکل برداری‌سازی داده‌های متنی، ایجاد نمایش ماتریسی از داده‌ها است. در این ماتریس، هر ستون متناظر با یکی از «کلمات یکتای» (Unique Words) موجود در مجموعه داده است. هر سطر این ماتریس، مترادف با یکی از داده‌ها (نقد فیلم) است. در مرحله بعد، هر سطر از ماتریس را با مقادیر 0 و 1 مناسب پر می‌کنیم؛ مقدار 1 در هر ستون (یک کلمه یکتا) از یک سطر (یک نمونه داده)، نشان‌دهنده ظاهر شدن کلمه یکتای متناظر با آن ستون، در نمونه داده‌ متناظر با آن سطر است. البته باید توجه داشته باشید که پس از پر کردن ماتریس با مقادیر 0 و 1، سطرهای آن بسیار «اسپارس» (Sparse) خواهند شد؛ یعنی بیشتر مقادیر ظاهر شده در یک سطر، مقادیر 0 خواهند بود. اصطلاحا به این فرایند، «کدبندی وان‌هات» (One Hot Encoding) گفته می‌شود.

from sklearn.feature_extraction.text import CountVectorizer

cv = CountVectorizer(binary=True)
cv.fit(reviews_train_clean)
X = cv.transform(reviews_train_clean)
X_test = cv.transform(reviews_test_clean)

طراحی مدل یادگیری تحلیل احساسات

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

  1. فرایند اجرای مدل و تفسیر خروجی‌های آن بسیار راحت است.
  2. از جمله «مدل‌های خطی» (Linear Models) محسوب می‌شود که بر روی داده‌های اسپارس (نظیر داده‌های نقد فیلم) بسیار خوب عمل می‌کند.
  3. نسبت به دیگر الگوریتم‌های یادگیری ماشین، زمان آموزش بسیار کمتری می‌طلبد.

همچنین، برای ساده‌سازی بیشتر، تنها لازم است مقدار بهینه پارامتر $$C$$ که پارامتر «منظم‌سازی» (Regularization) مدل یادگیری به شمار می‌آید، محاسبه می‌شود. نکته مهم در هنگام آموزش و تست یک مدل یادگیری، یکسان بودن برچسب‌های کلاسی استفاده شده برای برچسب‌گذاری داده‌های آموزشی و تست است. همچنین در این مسأله، توزیع داده‌های کلاس منفی و مثبت، در داده‌های آموزشی و تست برابر است. از قطعه کد زیر، برای مشخص کردن مقدار بهینه پارامتر منظم‌سازی استفاده می‌شود. مقدار بهینه این پارامتر، مقدار 0٫۰۵ است.

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

target = [1 if i < 12500 else 0 for i in range(25000)]

X_train, X_val, y_train, y_val = train_test_split(
    X, target, train_size = 0.75
)

for c in [0.01, 0.05, 0.25, 0.5, 1]:
    
    lr = LogisticRegression(C=c)
    lr.fit(X_train, y_train)
    print ("Accuracy for C=%s: %s" 
           % (c, accuracy_score(y_val, lr.predict(X_val))))

خروجی قطعه کد بالا:

# Accuracy for C=0.01: 0.87472
# Accuracy for C=0.05: 0.88368
# Accuracy for C=0.25: 0.88016
# Accuracy for C=0.5: 0.87808
# Accuracy for C=1: 0.87648

آموزش مدل نهایی تحلیل احساسات

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

final_model = LogisticRegression(C=0.05)
final_model.fit(X, target)
print ("Final Accuracy: %s" 
       % accuracy_score(target, final_model.predict(X_test)))

خروجی قطعه کد بالا:

# Final Accuracy: 0.88128

همان طور که مشاهده می‌شود، سیستم یادگیری پیاده‌سازی شده با دقت حدود 88 درصد، قادر است تا احساسات موجود در نقدهای فیلم را به دو گروه مثبت و منفی، دسته‌بندی کند. در پایان این بخش و برای صحت‌سنجی مدل یادگیری، مجموعه پنج «کلمه متمایزگر» (Discriminating Words)، برای داده‌های کلاس مثبت و منفی نمایش داده می‌شوند. برای اینکار، از ضرایب (وزن‌ها) ویژگی‌ها استفاده می‌شود و پنج ویژگی با بالاترین ضریب، در هر کلاس مشخص می‌شوند.

feature_to_coef = {
    word: coef for word, coef in zip(
        cv.get_feature_names(), final_model.coef_[0]
    )
}
for best_positive in sorted(
    feature_to_coef.items(), 
    key=lambda x: x[1], 
    reverse=True)[:5]:
    print (best_positive)
    
#     ('excellent', 0.9288812418118644)
#     ('perfect', 0.7934641227980576)
#     ('great', 0.675040909917553)
#     ('amazing', 0.6160398142631545)
#     ('superb', 0.6063967799425831)
    
for best_negative in sorted(
    feature_to_coef.items(), 
    key=lambda x: x[1])[:5]:
    print (best_negative)
    
#     ('worst', -1.367978497228895)
#     ('waste', -1.1684451288279047)
#     ('awful', -1.0277001734353677)
#     ('poorly', -0.8748317895742782)
#     ('boring', -0.8587249740682945)

بخش دوم: تحلیل احساسات در توییتر

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

  • بسته Tweetpy: بسته رسمی ارائه شده توسط توییتر، برای جمع‌آوری داده‌های شبکه اجتماعی توییتر است. برای نصب این بسته، از کد زیر استفاده می‌شود.
pip install tweepy
  • بسته TextBlob: یک کتابخانه نرم‌افزاری در زبان پایتون برای پردازش داده‌های متنی است. برای نصب این کتابخانه، از کد زیر استفاده می‌شود.
pip install textblob
  • مجموعه داده‌های ساخت یافته NLTK: برای نصب این مجموعه داده‌ها، از کد زیر استفاده می‌شود.
python -m textblob.download_corpora

کدهای پیاده‌سازی سیستم تحلیل احساسات در توییتر

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

import re 
import tweepy 
from tweepy import OAuthHandler 
from textblob import TextBlob 

class TwitterClient(object): 
	''' 
	Generic Twitter Class for sentiment analysis. 
	'''
	def __init__(self): 
		''' 
		Class constructor or initialization method. 
		'''
		# keys and tokens from the Twitter Dev Console 
		consumer_key = 'XXXXXXXXXXXXXXXXXXXXXXXX'
		consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
		access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
		access_token_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXX'

		# attempt authentication 
		try: 
			# create OAuthHandler object 
			self.auth = OAuthHandler(consumer_key, consumer_secret) 
			# set access token and secret 
			self.auth.set_access_token(access_token, access_token_secret) 
			# create tweepy API object to fetch tweets 
			self.api = tweepy.API(self.auth) 
		except: 
			print("Error: Authentication Failed") 

	def clean_tweet(self, tweet): 
		''' 
		Utility function to clean tweet text by removing links, special characters 
		using simple regex statements. 
		'''
		return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t]) 
									|(\w+:\/\/\S+)", " ", tweet).split()) 

	def get_tweet_sentiment(self, tweet): 
		''' 
		Utility function to classify sentiment of passed tweet 
		using textblob's sentiment method 
		'''
		# create TextBlob object of passed tweet text 
		analysis = TextBlob(self.clean_tweet(tweet)) 
		# set sentiment 
		if analysis.sentiment.polarity > 0: 
			return 'positive'
		elif analysis.sentiment.polarity == 0: 
			return 'neutral'
		else: 
			return 'negative'

	def get_tweets(self, query, count = 10): 
		''' 
		Main function to fetch tweets and parse them. 
		'''
		# empty list to store parsed tweets 
		tweets = [] 

		try: 
			# call twitter api to fetch tweets 
			fetched_tweets = self.api.search(q = query, count = count) 

			# parsing tweets one by one 
			for tweet in fetched_tweets: 
				# empty dictionary to store required params of a tweet 
				parsed_tweet = {} 

				# saving text of tweet 
				parsed_tweet['text'] = tweet.text 
				# saving sentiment of tweet 
				parsed_tweet['sentiment'] = self.get_tweet_sentiment(tweet.text) 

				# appending parsed tweet to tweets list 
				if tweet.retweet_count > 0: 
					# if tweet has retweets, ensure that it is appended only once 
					if parsed_tweet not in tweets: 
						tweets.append(parsed_tweet) 
				else: 
					tweets.append(parsed_tweet) 

			# return parsed tweets 
			return tweets 

		except tweepy.TweepError as e: 
			# print error (if any) 
			print("Error : " + str(e)) 

def main(): 
	# creating object of TwitterClient Class 
	api = TwitterClient() 
	# calling function to get tweets 
	tweets = api.get_tweets(query = 'Donald Trump', count = 200) 

	# picking positive tweets from tweets 
	ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive'] 
	# percentage of positive tweets 
	print("Positive tweets percentage: {} %".format(100*len(ptweets)/len(tweets))) 
	# picking negative tweets from tweets 
	ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative'] 
	# percentage of negative tweets 
	print("Negative tweets percentage: {} %".format(100*len(ntweets)/len(tweets))) 
	# percentage of neutral tweets 
	print("Neutral tweets percentage: {} % \ 
		".format(100*len(tweets - ntweets - ptweets)/len(tweets))) 

	# printing first 5 positive tweets 
	print("\n\nPositive tweets:") 
	for tweet in ptweets[:10]: 
		print(tweet['text']) 

	# printing first 5 negative tweets 
	print("\n\nNegative tweets:") 
	for tweet in ntweets[:10]: 
		print(tweet['text']) 

if __name__ == "__main__": 
	# calling main function 
	main() 

یک خروجی ممکن پس از اجرای این سیستم:

Positive tweets percentage: 22 %
Negative tweets percentage: 15 %


Positive tweets:
RT @JohnGGalt: Amazing—after years of attacking Donald Trump the media managed
to turn #InaugurationDay into all about themselves.
#MakeAme…
RT @vooda1: CNN Declines to Air White House Press Conference Live YES! 
THANK YOU @CNN FOR NOT LEGITIMI…
RT @Muheeb_Shawwa: Donald J. Trump's speech sounded eerily familiar...
POTUS plans new deal for UK as Theresa May to be first foreign leader to meet new 
president since inauguration 
.@realdonaldtrump #Syria #Mexico #Russia & now #Afghanistan. 
Another #DearDonaldTrump Letter worth a read @AJEnglish 


Negative tweets:
RT @Slate: Donald Trump’s administration: “Government by the worst men.” 
RT @RVAwonk: Trump, Sean Spicer, et al. lie for a reason. 
Their lies are not just lies. Their lies are authoritarian propaganda.  
RT @KomptonMusic: Me: I hate corn 
Donald Trump: I hate corn too
Me: https://t.co/GPgy8R8HB5
It's ridiculous that people are more annoyed at this than Donald Trump's sexism.
RT @tony_broach: Chris Wallace on Fox news right now talking crap 
about Donald Trump news conference it seems he can't face the truth eithe…
RT @fravel: With False Claims, Donald Trump Attacks Media on Crowd Turnout 
Aziz Ansari Just Hit Donald Trump Hard In An Epic Saturday NIght Live Monologue

برای پیاده‌سازی سیستم تحلیل احساسات و دسته‌بندی پیام‌های کاربران در توییتر، باید سه گام مهم را دنبال کرد.

  1. «احراز هویت» در سایت توییتر و دریافت کدهای هویت‌سنجی جهت «واکشی» (Fetch) داده‌های توییتر: برای دریافت داده‌های توییتر در یک برنامه کاربردی، کاربران باید برنامه کاربردی خود را با استفاده از یک حساب کاربری توییتر، در سایت این شبکه اجتماعی ثبت کنند. پس از ثبت برنامه کاربردی در سایت توییتر، چهار دسته اطلاعات به نام‌های (Consumer Key)، (Access token)، (Consumer Secret) و (Access Token Secret) برای کاربران تولید خواهند شد. استفاده از این اطلاعات، به برنامه کاربردی اجازه می‌دهد تا داده‌های توییتر را واکشی کند.
  2. ایجاد تقاضای GET به «واسط برنامه‌نویسی کاربردی» (API) توییتر و دریافت پیام‌های مرتبط با یک پرس‌وجوی خاص.
  3. پردازش پیام‌های واکشی شده و دسته‌بندی هر کدام از آن‌ها به سه دسته مثبت، منفی و خنثی.

 نحوه عملکرد قسمت‌های مختلف سیستم تحلیل احساسات پیاده‌سازی شده

در این بخش، قسمت‌های مختلف سیستم تحلیل احساسات پیاده‌سازی شده شرح داده می‌شود.

  • ابتدا، یک کلاس TwitterClient ایجاد می‌شود. این کلاس، تمامی توابعی را که با واسط برنامه‌نویسی کاربردی توییتر و بخش پردازش پیام‌های توییتر در تعامل هستند، تعریف می‌کند. از تابع __init__ برای صحت‌سنجی کدهای هویت‌سنجی برنامه استفاده می‌شود.
  • در تابع get_tweets، از کد زیر برای واکشی پیام‌های توییتر استفاده می‌شود.
fetched_tweets = self.api.search(q = query, count = count)
  • در تابع get_tweet_sentiment، از بسته TextBlob برای پردازش و دسته‌بندی پیام‌ها در سه گروه مثبت، منفی و خنثی استفاده می‌شود.
analysis = TextBlob(self.clean_tweet(tweet))

بسته TextBlob، یک کتابخانه نرم‌افزاری سطح بالا برای پردازش داده‌های متنی است. در این قسمت، ابتدا تابع clean_tweet، فراخوانی می‌شود تا کاراکترهای خاص، لینک‌ها و سایر موارد موجود در پیام‌ها، با استفاده از روش عبارات منظم حذف شوند. سپس، یک «شیء» (Object) از کلاس TextBlob ساخته و پیام پردازش شده به عنوان ورودی شیء، به آن ارسال می‌شود. همچنین، فرآیندهای پیش‌پردازشی زیر روی یک پیام اجرا می‌شوند تا ویژگی‌های مهم موجود در پیام‌ها استخراج شوند:

  1. «جداسازی واژگان» (Tokenizing).
  2. حذف کلمات نامرتبط در متن، که به آن‌ها «کلمات بی‌اثر» (Stopwords) نیز گفته می‌شود.
  3. برچسب‌گذاری «اجزای کلام» (Part of Speech) و انتخاب کلمات یا ویژگی‌های مهم نظیر صفت، قید و سایر موارد.
  • در مرحله بعد، یک «دسته‌بند احساسات» (Sentiment Classifier) توسط بسته TextBlob تولید می‌شود. این دسته‌بند، به هرکدام از پیام‌ها مقادیری بین 1- تا 1 اختصاص می‌دهد. مقادیر بین 0 تا 1، نشان‌دهنده محتوای مثبت خواهد بود. مقادیر 0 تا 1-، محتوای منفی و مقدار 0، محتوای خنثی را نشان می‌دهد. با استفاده از این مقادیر، پیام‌ها در سه دسته مثبت، منفی و خنثی دسته‌بندی می‌شوند. برای این کار، بسته TextBlob از مجموعه داده Movies Reviews برای آموزش یک «دسته‌بند بیز ساده» (Naive Bayes Classifier) استفاده می‌کند. در این مجموعه داده، نمونه‌ها با برچسب‌های کلاسی مثبت و منفی برچسب‌گذاری شده‌اند. از مدل یادگیری شده، برای اختصاص یک مقدار بین 1- تا 1 به هر کدام از پیام‌ها استفاده می‌شود.
  • در نهایت، از تابع sentiment.polarity در کلاس TextBlob، برای تعیین قطبیت پیام‌ها به شکل زیر استفاده می‌شود.
if analysis.sentiment.polarity > 0:
       return 'positive'
elif analysis.sentiment.polarity == 0:
       return 'neutral'
else:
       return 'negative'

روش های تحلیل احساسات

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۷ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«مرتضی جادریان»، دانشجوی مقطع دکتری مهندسی کامپیوتر گرایش هوش مصنوعی است. او در زمینه سیستم‌های هوشمند، به ویژه سیستم‌های هوشمند اطلاعاتی، روش‌های یادگیری ماشین، سیستم‌های دانش محور و محاسبات تکاملی فعالیت دارد.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.

مشاهده بیشتر