روش های تحلیل احساسات در پایتون — راهنمای کاربردی
«تحلیل احساسات» (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) به هر کدام از نمونههای نقد فیلم)، تمامی نقدهایی که امتیاز آنها () هستند، با برچسب کلاسی منفی برچسبگذاری میشوند. همچنین، تمامی نقدهایی که فیلم را با امتیاز () رتبهبندی کردهاند، با برچسب کلاسی مثبت برچسبگذاری خواهند شد.
مرحله اول: بارگیری و ادغام دادههای نقد فیلم جمعآوری شده
پس از بارگیری فایل موجود در لینک [+]، از کد اسکریپت زیر استفاده میشود تا دادههای موجود در فایل، «پردازش مقدماتی» (Preliminary Processing) شوند. در مرحله پردازش مقدماتی دادههای نقد فیلم، ابتدا دادههایی که در کلاسهای مثبت و منفی قرار دارند، جداسازی میشوند. سپس، دادههایی که در کلاس یکسان قرار دارند، با یکدیگر ادغام میشوند. در مرحله بعد، دادهها به دو کلاس آموزشی و تست تقسیمبندی میشوند.
1# unzip and unpack the tar file
2gunzip -c aclImdb_v1.tar.gz | tar xopf -
3
4cd aclImdb
5
6mkdir movie_data
7
8# puts four files in the combined_files directory:
9# full_train.txt, full_test.txt, original_train_ratings.txt, and original_test_ratings.txt
10for split in train test;
11do
12
13 for sentiment in pos neg;
14 do
15
16 for file in $split/$sentiment/*;
17 do
18 cat $file >> movie_data/full_${split}.txt;
19 echo >> movie_data/full_${split}.txt;
20
21 # This line adds files containing the original reviews if desired
22 # echo $file | cut -d '_' -f 2 | cut -d "." -f 1 >> combined_files/original_${split}_ratings.txt;
23 done;
24 done;
25done;
مرحله دوم: خواندن دادههای پردازش شده در زبان برنامهنویسی پایتون
برای اینکه بتوانیم از دادههای پردازش شده، برای آموزش یک مدل یادگیری تحلیل احساسات استفاده کنیم، تنها کافی است دادهها را در ساختار دادهای List تعریف کنیم. برای چنین کاری، از قطعه کد زیر استفاده میکنیم. شایان توجه است که آرگومان تابع open در کد زیر، حتما باید برابر با آدرس فیزیکی محل ذخیرهسازی دادههای پردازششده باشد.
1reviews_train = []
2for line in open('../data/movie_data/full_train.txt', 'r'):
3 reviews_train.append(line.strip())
4
5reviews_test = []
6for line in open('../data/movie_data/full_test.txt', 'r'):
مرحله سوم: آمادهسازی و پیشپردازش دادهها
دادههای خام جمعآوری شده، ساخت یافته نیستند و پردازشهای اولیه انجام شده روی آنها، برای استخراج ویژگیهای موجود در دادههای متنی مناسب نیستند. دادههای خام متنی نقد فیلم، معمولا بسیار نامنظم هستند و پیش از انجام هر گونه تحلیل روی آنها، باید «پیشپردازش» (Preprocessing) شوند تا ویژگیهای لازم برای دستهبندی احساسات موجود در آنها استخراج شوند. به عنوان نمونه، دادهای که در ادامه نمایش داده شده است، یک نمونه نقد جمعآوری شده از وبسایت IMDb است.
1reviews_train = []
2for line in open('../data/movie_data/full_train.txt', 'r'):
3
4 reviews_train.append(line.strip())
5
6reviews_test = []
7for line in open('../data/movie_data/full_test.txt', 'r'):
8
9 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) استفاده میشود. روشهای عبارات منظم، از جمله روشهای استاندارد برای آمادهسازی، پیشپردازش و استخراج الگوهای زبانی از دادههای متنی محسوب میشوند. برای آمادهسازی و پیشپردازش دادههای متنی با استفاده از عبارات منظم، از قطعه کد زیر استفاده میشود.
1import re
2
3REPLACE_NO_SPACE = re.compile("[.;:!\'?,\"()\[\]]")
4REPLACE_WITH_SPACE = re.compile("(<br\s*/><br\s*/>)|(\-)|(\/)")
5
6def preprocess_reviews(reviews):
7 reviews = [REPLACE_NO_SPACE.sub("", line.lower()) for line in reviews]
8 reviews = [REPLACE_WITH_SPACE.sub(" ", line) for line in reviews]
9
10 return reviews
11
12reviews_train_clean = preprocess_reviews(reviews_train)
13reviews_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) گفته میشود.
1from sklearn.feature_extraction.text import CountVectorizer
2
3cv = CountVectorizer(binary=True)
4cv.fit(reviews_train_clean)
5X = cv.transform(reviews_train_clean)
6X_test = cv.transform(reviews_test_clean)
طراحی مدل یادگیری تحلیل احساسات
پس از اینکه دادههای موجود در مجموعه داده نقد فیلم، به قالب مناسب برای آموزش یک مدل یادگیری ماشین تبدیل شدند، در مرحله بعد، مدل لازم برای دستهبندی احساسات موجود در دادهها طراحی میشود.
در این مطلب، از یک مدل «رگرسیون لجستیکی» (Logistic Regression) برای دستهبندی احساسات استفاده شده است. برای انتخاب این مدل، سه دلیل وجود دارد:
- فرایند اجرای مدل و تفسیر خروجیهای آن بسیار راحت است.
- از جمله «مدلهای خطی» (Linear Models) محسوب میشود که بر روی دادههای اسپارس (نظیر دادههای نقد فیلم) بسیار خوب عمل میکند.
- نسبت به دیگر الگوریتمهای یادگیری ماشین، زمان آموزش بسیار کمتری میطلبد.
همچنین، برای سادهسازی بیشتر، تنها لازم است مقدار بهینه پارامتر که پارامتر «منظمسازی» (Regularization) مدل یادگیری به شمار میآید، محاسبه میشود. نکته مهم در هنگام آموزش و تست یک مدل یادگیری، یکسان بودن برچسبهای کلاسی استفاده شده برای برچسبگذاری دادههای آموزشی و تست است. همچنین در این مسأله، توزیع دادههای کلاس منفی و مثبت، در دادههای آموزشی و تست برابر است. از قطعه کد زیر، برای مشخص کردن مقدار بهینه پارامتر منظمسازی استفاده میشود. مقدار بهینه این پارامتر، مقدار 0٫۰۵ است.
1from sklearn.linear_model import LogisticRegression
2from sklearn.metrics import accuracy_score
3from sklearn.model_selection import train_test_split
4
5target = [1 if i < 12500 else 0 for i in range(25000)]
6
7X_train, X_val, y_train, y_val = train_test_split(
8 X, target, train_size = 0.75
9)
10
11for c in [0.01, 0.05, 0.25, 0.5, 1]:
12
13 lr = LogisticRegression(C=c)
14 lr.fit(X_train, y_train)
15 print ("Accuracy for C=%s: %s"
16 % (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 هزار نمونه باقیمانده، برای تست مدل در نظر گرفته شدهاند. از قطعه کد زیر، برای آموزش و تست مدل یادگیری تحلیل احساسات استفاده میشود.
1final_model = LogisticRegression(C=0.05)
2final_model.fit(X, target)
3print ("Final Accuracy: %s"
4 % accuracy_score(target, final_model.predict(X_test)))
خروجی قطعه کد بالا:
# Final Accuracy: 0.88128
همان طور که مشاهده میشود، سیستم یادگیری پیادهسازی شده با دقت حدود 88 درصد، قادر است تا احساسات موجود در نقدهای فیلم را به دو گروه مثبت و منفی، دستهبندی کند. در پایان این بخش و برای صحتسنجی مدل یادگیری، مجموعه پنج «کلمه متمایزگر» (Discriminating Words)، برای دادههای کلاس مثبت و منفی نمایش داده میشوند. برای اینکار، از ضرایب (وزنها) ویژگیها استفاده میشود و پنج ویژگی با بالاترین ضریب، در هر کلاس مشخص میشوند.
1feature_to_coef = {
2 word: coef for word, coef in zip(
3 cv.get_feature_names(), final_model.coef_[0]
4 )
5}
6for best_positive in sorted(
7 feature_to_coef.items(),
8 key=lambda x: x[1],
9 reverse=True)[:5]:
10 print (best_positive)
11
12# ('excellent', 0.9288812418118644)
13# ('perfect', 0.7934641227980576)
14# ('great', 0.675040909917553)
15# ('amazing', 0.6160398142631545)
16# ('superb', 0.6063967799425831)
17
18for best_negative in sorted(
19 feature_to_coef.items(),
20 key=lambda x: x[1])[:5]:
21 print (best_negative)
22
23# ('worst', -1.367978497228895)
24# ('waste', -1.1684451288279047)
25# ('awful', -1.0277001734353677)
26# ('poorly', -0.8748317895742782)
27# ('boring', -0.8587249740682945)
بخش دوم: تحلیل احساسات در توییتر
در این بخش، یک سیستم ساده تحلیل احساسات، برای دستهبندی احساسات موجود در پیامهای کاربران شبکه اجتماعی توییتر پیادهسازی میشود. ابتدا کدهای پیادهسازی این سیستم نمایش داده میشوند.
سپس، نحوه عملکرد قسمتهای مختلف سیستم تحلیل احساسات پیادهسازی شده مورد بررسی قرار میگیرند. برای پیادهسازی این سیستم، سه بسته نرمافزاری مهم در زبان پایتون نیاز است. این بستهها عبارتند از:
- بسته Tweetpy: بسته رسمی ارائه شده توسط توییتر، برای جمعآوری دادههای شبکه اجتماعی توییتر است. برای نصب این بسته، از کد زیر استفاده میشود.
1pip install tweepy
- بسته TextBlob: یک کتابخانه نرمافزاری در زبان پایتون برای پردازش دادههای متنی است. برای نصب این کتابخانه، از کد زیر استفاده میشود.
1pip install textblob
- مجموعه دادههای ساخت یافته NLTK: برای نصب این مجموعه دادهها، از کد زیر استفاده میشود.
1python -m textblob.download_corpora
کدهای پیادهسازی سیستم تحلیل احساسات در توییتر
از کدهای زیر، برای پیادهسازی سیستم تحلیل احساسات در توییتر استفاده میشود:
1import re
2import tweepy
3from tweepy import OAuthHandler
4from textblob import TextBlob
5
6class TwitterClient(object):
7 '''
8 Generic Twitter Class for sentiment analysis.
9 '''
10 def __init__(self):
11 '''
12 Class constructor or initialization method.
13 '''
14 # keys and tokens from the Twitter Dev Console
15 consumer_key = 'XXXXXXXXXXXXXXXXXXXXXXXX'
16 consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
17 access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
18 access_token_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXX'
19
20 # attempt authentication
21 try:
22 # create OAuthHandler object
23 self.auth = OAuthHandler(consumer_key, consumer_secret)
24 # set access token and secret
25 self.auth.set_access_token(access_token, access_token_secret)
26 # create tweepy API object to fetch tweets
27 self.api = tweepy.API(self.auth)
28 except:
29 print("Error: Authentication Failed")
30
31 def clean_tweet(self, tweet):
32 '''
33 Utility function to clean tweet text by removing links, special characters
34 using simple regex statements.
35 '''
36 return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])
37 |(\w+:\/\/\S+)", " ", tweet).split())
38
39 def get_tweet_sentiment(self, tweet):
40 '''
41 Utility function to classify sentiment of passed tweet
42 using textblob's sentiment method
43 '''
44 # create TextBlob object of passed tweet text
45 analysis = TextBlob(self.clean_tweet(tweet))
46 # set sentiment
47 if analysis.sentiment.polarity > 0:
48 return 'positive'
49 elif analysis.sentiment.polarity == 0:
50 return 'neutral'
51 else:
52 return 'negative'
53
54 def get_tweets(self, query, count = 10):
55 '''
56 Main function to fetch tweets and parse them.
57 '''
58 # empty list to store parsed tweets
59 tweets = []
60
61 try:
62 # call twitter api to fetch tweets
63 fetched_tweets = self.api.search(q = query, count = count)
64
65 # parsing tweets one by one
66 for tweet in fetched_tweets:
67 # empty dictionary to store required params of a tweet
68 parsed_tweet = {}
69
70 # saving text of tweet
71 parsed_tweet['text'] = tweet.text
72 # saving sentiment of tweet
73 parsed_tweet['sentiment'] = self.get_tweet_sentiment(tweet.text)
74
75 # appending parsed tweet to tweets list
76 if tweet.retweet_count > 0:
77 # if tweet has retweets, ensure that it is appended only once
78 if parsed_tweet not in tweets:
79 tweets.append(parsed_tweet)
80 else:
81 tweets.append(parsed_tweet)
82
83 # return parsed tweets
84 return tweets
85
86 except tweepy.TweepError as e:
87 # print error (if any)
88 print("Error : " + str(e))
89
90def main():
91 # creating object of TwitterClient Class
92 api = TwitterClient()
93 # calling function to get tweets
94 tweets = api.get_tweets(query = 'Donald Trump', count = 200)
95
96 # picking positive tweets from tweets
97 ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive']
98 # percentage of positive tweets
99 print("Positive tweets percentage: {} %".format(100*len(ptweets)/len(tweets)))
100 # picking negative tweets from tweets
101 ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative']
102 # percentage of negative tweets
103 print("Negative tweets percentage: {} %".format(100*len(ntweets)/len(tweets)))
104 # percentage of neutral tweets
105 print("Neutral tweets percentage: {} % \
106 ".format(100*len(tweets - ntweets - ptweets)/len(tweets)))
107
108 # printing first 5 positive tweets
109 print("\n\nPositive tweets:")
110 for tweet in ptweets[:10]:
111 print(tweet['text'])
112
113 # printing first 5 negative tweets
114 print("\n\nNegative tweets:")
115 for tweet in ntweets[:10]:
116 print(tweet['text'])
117
118if __name__ == "__main__":
119 # calling main function
120 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
برای پیادهسازی سیستم تحلیل احساسات و دستهبندی پیامهای کاربران در توییتر، باید سه گام مهم را دنبال کرد.
- «احراز هویت» در سایت توییتر و دریافت کدهای هویتسنجی جهت «واکشی» (Fetch) دادههای توییتر: برای دریافت دادههای توییتر در یک برنامه کاربردی، کاربران باید برنامه کاربردی خود را با استفاده از یک حساب کاربری توییتر، در سایت این شبکه اجتماعی ثبت کنند. پس از ثبت برنامه کاربردی در سایت توییتر، چهار دسته اطلاعات به نامهای (Consumer Key)، (Access token)، (Consumer Secret) و (Access Token Secret) برای کاربران تولید خواهند شد. استفاده از این اطلاعات، به برنامه کاربردی اجازه میدهد تا دادههای توییتر را واکشی کند.
- ایجاد تقاضای GET به «واسط برنامهنویسی کاربردی» (API) توییتر و دریافت پیامهای مرتبط با یک پرسوجوی خاص.
- پردازش پیامهای واکشی شده و دستهبندی هر کدام از آنها به سه دسته مثبت، منفی و خنثی.
نحوه عملکرد قسمتهای مختلف سیستم تحلیل احساسات پیادهسازی شده
در این بخش، قسمتهای مختلف سیستم تحلیل احساسات پیادهسازی شده شرح داده میشود.
- ابتدا، یک کلاس TwitterClient ایجاد میشود. این کلاس، تمامی توابعی را که با واسط برنامهنویسی کاربردی توییتر و بخش پردازش پیامهای توییتر در تعامل هستند، تعریف میکند. از تابع __init__ برای صحتسنجی کدهای هویتسنجی برنامه استفاده میشود.
- در تابع get_tweets، از کد زیر برای واکشی پیامهای توییتر استفاده میشود.
1fetched_tweets = self.api.search(q = query, count = count)
- در تابع get_tweet_sentiment، از بسته TextBlob برای پردازش و دستهبندی پیامها در سه گروه مثبت، منفی و خنثی استفاده میشود.
1analysis = TextBlob(self.clean_tweet(tweet))
بسته TextBlob، یک کتابخانه نرمافزاری سطح بالا برای پردازش دادههای متنی است. در این قسمت، ابتدا تابع clean_tweet، فراخوانی میشود تا کاراکترهای خاص، لینکها و سایر موارد موجود در پیامها، با استفاده از روش عبارات منظم حذف شوند. سپس، یک «شیء» (Object) از کلاس TextBlob ساخته و پیام پردازش شده به عنوان ورودی شیء، به آن ارسال میشود. همچنین، فرآیندهای پیشپردازشی زیر روی یک پیام اجرا میشوند تا ویژگیهای مهم موجود در پیامها استخراج شوند:
- «جداسازی واژگان» (Tokenizing).
- حذف کلمات نامرتبط در متن، که به آنها «کلمات بیاثر» (Stopwords) نیز گفته میشود.
- برچسبگذاری «اجزای کلام» (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'
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش اصول و روشهای داده کاوی (Data Mining)
- مجموعه آموزشهای هوش مصنوعی
- روشهای متنکاوی — راهنمای کاربردی
- متنکاوی (Text Mining) — به زبان ساده
- عقیدهکاوی و تحلیل احساسات — از مفهوم تا کاربرد
^^