تشخیص لحن نظرات

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

فیلم خوبی بود و مناسب برای رده‌های سنی الف تا ه!

۱. مقدمه

نظر چیست؟
یک بیان ذهنی که باور یا تفکر یک انسان را درباره‌ی یک چیز بیان می‌کند.
ذهنی در برابر عینی قرار می‌گیرد. یک بیان عینی به سادگی می‌تواند اثبات شود که صحیح است یا غلط. به عنوان مثال جمله‌ی "این لپ تاپ باتری دارد" یک جمله‌ی عینی (Subjective) و جمله‌ی "این لپ تاپ باتری خوبی دارد" جمله‌ی ذهنی (Objective) است.
آن انسان، نظردارنده (Opinion Holder) و آن چیز، هدف نظر (Opinion Target) نامیده می‌شود.
همچنین باور و تفکر، به مسائلی همچون فرهنگ، سبک زندگی و دیگر مسائل شخصی بستگی دارد. (که به عنوان مثال در مورد نظردادن در مورد یک فیلم می‌تواند بسیار تأثیرگذار باشد.)


بنابراین هر نظر از چند بخش اصلی تشکیل می‌شود:

  • نظردارنده (Opinion Holder): این نظر، نظر کیست؟

  • هدف نظر (Opinion Target): این نظر درباره‌ی چیست؟

  • محتوای نظر (Opinion Content):نظر دقیقاً چیست؟

  • زمینه‌ی نظر (Opinion Context):در چه شرایطی (زمانی، مکانی و ...) این نظر ابراز شده؟

  • احساسات نظر (Opinion Sentiment): این نظر چه اطلاعاتی درباره‌ی احساس نظردارنده به ما می‌دهد؟ (مثبت یا منفی)

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

تفاوت تشخیص لحن نظر با تشخیص محتوای نظر در آن است که در بحث محتوا ما می‌توانیم با پیدا کردن کلید واژه‌ها محتوا را دریابیم اما برای تشخیص لحن این کار خیلی وقت‌ها جواب نمی‌دهد . به عنوان مثال در جمله‌ی "این دوربین در شرایط نوری ضعیف هم بد عمل نمی‌کند." کلمات {ضعیف، بد} کلیدی هستند اما به وضوح لحن جمله منفی نمی‌باشد!


حال چرا ما باید نظرکاوی کنیم و به تشخیص لحن نظرات اهمیت دهیم؟

  • کمک به تصمیم‌گیری:

    .در انتخاب یک محصول یا سرویس
    .در مسائل رای دادن
    .در اتخاذ یک سیاست

  • کمک به درک رفتار و احساسات مردم:

    .برای ارائه خدمات بهتر (مثل بهینه کردن جستجو یا پیشنهاد محصولات)
    .برای تبلیغات هوشمندانه‌تر

  • نظرسنجی داوطلبانه:

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


برای انجام آزمایشات و کلاسه‌بندی احساسات ما فرض را بر این می‌گذاریم که نظردارنده، هدف نظر، محتوای نظر و زمینه‌ی نظر را می‌دانیم و از روی این‌ها احساس نظر را تشخیص می‌دهیم. (مثلاً ما می‌دانیم یک کاربر از کشور انگلستان در سال ۲۰۱۷ یک نظر برای یک فیلم خاص داده است و حال احساس نظر را تشخیص می‌دهیم)

  • ورودی:
    -یک text object

  • خروجی:
    -آنالیز قطبی: مثلاً {مثبت، خنثی، منفی} یا {۱، ۲، ۳ ، ۴، ۵}
    -آنالیز احساسی (پیشرفته‌تر): {خوشحال، ناراحت، ترسان، عصبانی، متعجب، منزجر}

۲. کارهای مرتبط

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

  • نشانه‌گذاری - Tokenizing:
    تشخیص صحیح تمام کلمات درون یک جمله. به عنوان مثال جمله‌ی «.She looked at /// her father's arm-chair» باید به صورت زیر در بیاید:
    ['She', 'looked', 'at', 'her', 'father', 'arm', 'chair']

  • ریشه‌یابی - Stemming:
    یافتن ریشه‌ی کلمه می‌تواند ما را به بخش اصلی یک کلمه برساند و دایره‌ی تصمیم‌گیری ما برای یک کلمه را کوچک‌تر و دقیق‌تر کند. به عنوان مثال کلمه‌ی running به ریشه‌ی اصلی فعل یعنی run تبدیل شود. یا در زبان آلمانی، تمام کلماتِ Wald, Walde, Wälder, Wäldern, Waldes, Walds به کلمه‌ی Wald تبدیل می‌شود. این کار باعث می‌شود تا کلمات خاص کمتری در مراحل بعد مورد پردازش قرار گیرند که سرعت و دقت پردازش را بالا می‌برد.

  • غلط املایی - Spelling Correction:
    برخی مواقع یک فرد هنگام تایپ کردن نظر خود در یک سایت دچار خطا شده و املای صحیح برخی کلمات را رعایت نمی‌کند. این کلمات داده‌های جدیدی نسبت به دایره‌ی لغاتی که ما از قبل داشته و پردازش کرده‌ایم نیستند. پس لازم است تا این تفاوت در کلمات را تشخیص دهیم. حتی بعضی کلمات به صورتی نوشته می‌شوند که از نظر کاربر غلط نمی‌باشد اما نوشتار درست آن کلمه نیست مانند ive که همان کلمه‌ی I've است و به I have تبدیل می‌شود.

  • تشخیص و تبدیل سرواژه‌ها، عبارات خلاصه و شکلک‌ها:
    این گونه نظرات در دنیای اینترنت بسیار فراگیر شده است. مانند زمانی که کاربر می‌خواهد اعلام کند به چیزی خندیده است و از عبارت LOL استفاده می‌کند. عبارا خلاصه مثل C'mon که خلاصه‌ی عبارت Come on است. و شکلک‌هایی (۲) که این روزها افراد آن‌ها را ابزاری ضروری برای بیان احساس خود در نظراتشان تلقی می‌کنند.

  • قطعه‌بندی عبارت - Phrase Chunking:
    در این عمل، یک جمله را به قسمت‌های زبانی کوچک‌تر قطعه‌بندی می‌کنیم. برای نمونه، جمله‌ی Python is a high-level programming language به قطعات ["Python", "high-level language"] شکسته می‌شود. به طور کلی این عمل یعنی جداسازی و بخش بخش کردن جمله به یک‌سری زیرترکیبات (۳) مثل اسم، فعل و غیره.


برای حل این مسأله، عموماً از ۵ بخش مختلف از مباحث پردازش زبان طبیعی (Natural Language Processing) استفاده شده است که عبارتند از:

  1. فضاهای برداری معنایی - Semantic Vector Spaces:
    استفاده از شباهت‌های توزیعی تک کلمه ها (یا به عبارتی دفعات تکرار کلمه‌ها یا فرکانس کلمه‌ها) برای تشخیص لحن کلی یک عبارت. در این زمینه از نظریه‌ی آماری tf-idf یا term frequency–inverse document frequency استفاده می‌شود که به طور خلاصه به این موضوع اشاره می‌کند: میزان تکرار هر کلمه در متن، اهمیت آن کلمه را مشخص می‌کند (هر لغت با توجه به دفعات تکرار، یک وزن می‌گیرد و اهمیت یک کلمه با وزنش رابطه‌ی عکس دارد. یعنی هرچقدر یک کلمه بیشتر تکرار شود احتمالاً از اهمیت کمتری برخوردار است.)

  2. ترکیب‌بندی در فضاهای برداری - Compositionality in Vector Spaces یا استفاده از n-gram:
    استفاده از اصطلاحات و ترکیبات چند کلمه‌ای (معمولاً ۲تایی). به طور کلی n-gram به این صورت عمل می‌کند که n کلمه‌ی پشت سرهم در جمله را یک گروه (به اصطلاح بردار) گرفته و بردارهای تولید شده را برای تحلیل‌های بعدی مورد استفاده قرار می‌دهد. (مثال: برای جمله‌ی This perfume smells good اگر n را برابر ۲ قرار دهیم bigram های تولید شده می‌شوند "This perfume", "perfume smells", "smells good")

  3. فرم منطقی - Logical Form:
    تلاش برای نگاشتن (۴) یک جمله به یک فرم منطقی برای تشخیص محتوای آن. این زمینه تا حدودی ابتکاری بوده و فعالیت‌های زیادی در آن صورت نگرفته است.

  4. یادگیری عمیق - Deep Learning:
    استفاده از انواع مختلف شبکه‌های عصبی مثل Recursive Neural Networks و Matrix-Vector RNNs برای ساخت مدل؛ و تشخیص و کلاسه‌بندی داده‌ها. این بخش از قوی‌ترین و مهم‌ترین قسمت‌های Natural Language Processing و به صورت کلی تمامی زمینه‌های هوش مصنوعی است. در مقاله‌ای از دانشگاه stanford در سال ۲۰۱۲ که در ادامه به صورت مختصر به آن اشاره می‌کنیم، از یک نوع شبکه‌ی عصبی مخصوص به نام Recursive Neural Tensor Network استفاده شده است که باعث شده این تحقیقات یکی از بهترین نتایج حاصل در بحث تشخیص لحن نظر را بدست آورند.

  5. تشخیص لحن - Sentiment Analysis:
    بیشتر رویکردها در تشخیص لحن، بازنمایی مجموعه‌ای از کلمات می‌باشد یعنی تشخیص فاز هر کلمه (مثبت/خنثی/منفی) و تأثیر آن روی باقی کلمات با توجه به محل قرارگیری آن کلمه در جمله.


در ادامه به مقاله‌ای از Pang, Lee and Vaithyanathan در سال ۲۰۰۲ اشاره می‌کنیم که در آن برای حل این مسأله از ۳ روش کلاسه‌بندی مختلف استفاده شده است. روش‌های Naive Bayes، Maximum Entropy و Support Vector Machines.
در این مقاله به صورت خاص مباحث n-gram و Sentiment Analysis که در بالا توضیح داده شدند مورد بررسی قرار گرفته‌اند و برای پیاده‌سازی از این بخش ها استفاده شده است.
نتایجِ حاصل حاکی از آن بود که SVM در اکثر مواقع بالاترین و NB پایین‌ترین درصد تشخیص صحیح لحن نظر را دارد. همچنین داده‌ها در این آزمایش به صورت‌های مختلفی مانند تک‌کلمه‌ای، دوکلمه‌ای و بخشی از سخن (۵) طبقه‌بندی شده و به ۳ روش کلاسه‌بندی داده شدند؛ که تغیر بین تک‌کلمه‌ای و دوکلمه‌ای تفاوت معناداری را در نتایج حاصل نمی‌کند درحالی که POS درصد خطای NB و SVM را تا حدودی کاهش داده اما بر Max Ent تأثیری نمی‌گذارد. [۱]

شکل ۱. نتایج به دست آمده در تحقیقات مقاله‌ی Thumbs Up

در سال ۲۰۱۲ نیز مقاله‌ای از دانشگاه Stanford در این زمینه منتشر شد. آن‌ها برای حل این مسأله از دو ابزار استفاده کردند: Stanford Sentiment Treebank و Recursive Neural Tensor Network. درخت تولید شده برای هر جمله در این‌جا از نوع دودویی است و کلمات در برگ‌های این درخت قرار می‌گیرد. هر گره یکی از مقادیر {++، +، ۰، -، --} را به خود گرفته و تنها بر مقدار گره پدرش تأثیر می‌گذارد. لحن نهایی جمله همان مقداری است که ریشه در انتها می‌گیرد. (شکل ۱)
این مقاله نمونه‌ی بارز استفاده از یادگیری عمیق و شبکه‌های عصبی در بحث تشخیص لحن نظرات است. همچنین در این مقاله برای مشخص کردن اهمیت کلمات از میزان تکرار کلمات و بحث های مشابه tf-idf استفاده شده است.
الگوریتم RNTN در تمامی آزمایش‌ها موفق‌تر از باقی الگوریتم‌ها عمل کرده است. یکی از خواص این روش تشخیص صحیح جملات نفی منفی (۶) است مثل جمله‌ی “این فیلم بد نبود” که به این معنا نیست که فیلم خوب بود بلکه یعنی فیلم کم بد بود! ‫‫‫‫‫‫[۲]

شکل ۲. چند مثال از تشخیص لحن نظرات در روش ارائه شده توسط دانشگاه Stanford

در هر دو مقاله‌ی فوق از n-gram با طول های مختلف برای بدست آوردن نتایج بهتر در الگوریتم‌های پیاده‌سازی شده استفاده شده است. یکی از نتایج بدست آمده این است که هرچقدر طول n-gram کمتر باشد، احتمال تشخیص یک نظر به عنوان یک نظرِ خنثی بیشتر است و هرچقدر این طول بیشتر شود، دسته‌بندی دقیق‌تر و ریزتری شکل می‌گیرد.

تأثیر طول n-gram بر تشخیص لحن یک نظر

۳. روش‌های پیاده‌سازی‌

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

۱. روش Naive Bayes:
به‌طور ساده در این روش، دسته‌بندی پدیده‌ها بر پایه احتمال وقوع یا عدم وقوع یک پدیده‌ است. این روشِ کلاسه‌بندی با دریافت یک مجموعه داده به عنوان داده‌های تمرینی، آموزش داده می‌شود (۸). شیوه‌ی یادگیری در الگوریم به روش یادگیری با ناظر (۹) است (توضیح این روش فراتر از بحث است. برای مطالعه‌ی بیشتر به صفحه‌ی Supervised Learning در سایت Wikipedia مراجعه شود.) به طور کلّی این روش بر پایه‌ی نظریه‌ی بِیز در زمینه‌ی آمار و احتمالات بنا شده است.

شکل ۳. نحوه‌ی محاسبه‌ی احتمال رخداد یک پدیده در نظریه‌ی بِیز

این روش کلاسه‌بندی در ابزار scikit-learn به ۳ روش پیاده‌سازی شده است:
. روش Gaussian: وقتی که داده‌های ما به صورت نرمال باشند (۱۰)
. روش Multinomial: برای شمارش گسسته (مثل تعداد تکرار یک کلمه در یک متن)
. روش Bernoulli: برای مواقعی که یک ویژگی به صورت گسسته بیان شود (مثل بودن یا نبودن کلمه در متن که با ۰ و ۱ نشان داده شود)

یک مثال ساده از پیاده‌سازی Gaussian NB توسط scikit-learn:

# Import necessary libraries
from sklearn.naive_bayes import GaussianNB
import numpy as np

# Assigning predictor and target variables
# dots is an array of dots in plane (features)
# labels is an array of labels which will be assigned to x dots
dots=np.array([[-3,7],[1,5],[1,2],[-2,0],[2,3],[-4,0],[-1,1],[1,1],[-2,2],[2,7],[-4,1],[-2,7]])
labels = np.array([3, 3, 3, 3, 4, 3, 3, 4, 3, 4, 4, 4])

# Create a Gaussian NB classifier
model = GaussianNB()

# Train model
model.fit(dots, labels)

# Predict Output 
predictedLabels = model.predict([[1, 2], [3, 4]])
print predictedLabels

>>> predictedLabels 
>>> ([3, 4])
# The classifier assigned label "3" to dot [1, 2] and label "4" to dot [3, 4]

۲. روش درخت تصمیم‌گیری:
در این روش رده‌بند به کمک داده‌های تمرینی، یک درخت تصمیم‌گیری تولید می‌کند (شکل ۴) و سپس در فاز آزمایش هر داده‌ی جدیدی که وارد می‌شود، از ریشه‌ی درخت شروع می‌کند به حرکت کردن و در هر مرحله با انتخاب یکی از شاخه‌های درخت به یک سطح پایین‌تر در درخت می‌رود. آنقدر این مسیر ادامه پیدا می‌کند تا داده به یک برگ برسد و نهایتاً مقدار آن برگ، تصمیمی می‌شود که برای آن داده گرفته می‌شود (شکل ۵)
به طور کلی در بحث تشخیص لحن نظر، هر برگ یا مقدار «مثبت» و یا مقدار «منفی» دارد. لذا هر نظری که وارد درخت تصمیم‌گیری می‌شود، نهایتاً در یکی از کلاس‌های مثبت یا منفی قرار می‌گیرد.

شکل ۴. در این جدول میزان رضایت مشتریان از سرویس‌های ارائه شده توسط دو هتل مختلف در بازه‌های زمانی ماهانه مشخص شده است. نحوه‌ی تهیه‌ی جدول به این صورت است که به عنوان مثال در جدول Hotel-A خانه‌ی ۲-۲ به این معناست که در ماه فوریه سال ۲۰۱۱ (February-11) نظراتی که در آن‌ها در مورد غذا صحبت شده است، ۸۲٪ نظر مثبتی بوده‌اند. در نهایت به کمک این جدول درخت تصمیم‌گیری ساخته می‌شود.

شکل ۵. درخت تصمیم‌گیری ساخته شده از روی جدول شکل ۴

یک مثال ساده از پیاده‌سازی درخت تصمیم‌گیری توسط scikit-learn:

# Import necessary libraries
from sklearn import tree
from sklearn.metrics import accuracy_score

# Assume there is some dataset about email divided into train and test datas
trainDir = "../train-mails"    
testDir = "../test-mails"

# Assigning predictor and target variables
# extract_feature is a blackbox that gives directory and returns lists of features
featureTrain, labelTrain = extract_features(trainDir)
featureTest, labelTest = extract_features(testDir)

# Create a Decision Tree classifier
model = tree.DecisionTreeClassifier()

# Train model
model.fit(featuresTrain, labelTrain)

# Predict Output 
predictedLabels = model.predict(featureTest)

# Computing the accuracy of model
>>> accuracy_score(labelTest, predictedLabels)
>>> 91.53%

۳. روش Maximum Entropy:
این روش یک نوع کلاسه‌بندی بر اساس احتمال است. به طور کلی بر پایه‌ی قانون Maximum Entropy در مسائل احتمال بنا شده است و بین تمامی مُدل‌هایی که از روی داده‌های آزمایشی ساخته می‌شود، آن مدلی را انتخاب می‌کند که بیشترین آنتروپی را داشته باشد. کلاسه‌بندی MaxEnt می‌تواند برای انواع مختلفی از مسائل مثل تشخیص زبان (۱۱)، کلاسه‌بندی موضوعی (۱۲) و تشخیص لحن نظر به کار گرفته شود.
در ماژول TextBlob این روش به صورت زیر تعریف شده است:

This classifier is parameterized by a set of “weights”, which are used to combine the joint-features that are generated from a featureset by an “encoding”. In particular, the encoding maps each (featureset, label) pair to a vector. The probability of each label is then computed using the following equation:

                           dotprod(weights, encode(fs,label))
prob(fs|label) = ----------------------------------------------------
                  sum(dotprod(weights, encode(fs,l)) for l in labels)

Where `dotprod` is the dot product:
dotprod(a, b) = sum(x * y for (x, y) in zip(a, b))

۴. آزمایش‌ها

  • داده‌های مورد استفاده:
    این مجموعه داده شامل ۲۵۰۰۰ نظر برای بخش یادگیری (۱۳) و ۲۵۰۰۰ نظر برای بخش آزمودن (۱۴) می‌باشد که دقیقاً نیمی از هرکدام از این بخش‌ها نظرات مثبت و نیم دیگر شامل نظرات منفی هست. لذا این مجموعه از نظر لحن، به صورت دودویی کلاسه بندی شده‌است (یعنی یک نظر یا مثبت است یا منفی. این که چند درصد مثبت و چند درصد منفی است مشخص نشده).
    نظرات از سایت معتبر IMDB که مربوط به صنعت سینما هست جمع‌آوری شده و از هر فیلمی بیش از ۳۰ نظر وجود ندارد (برای عملکرد بهتر). همچنین نظرات دارای قطبیت بالا هستند یعنی تمامی نظرات مثبت، ۷ یا بیشتر ستاره دریافت کرده‌اند (از شخص نظردهنده) و نظرات منفی ۴ یا کمتر (لازم به ذکر است که نظرات در سایت IMDB توسط کاربران برای هر فیلم داده می‌شود و هر کاربر از ۱۰ نمره‌ای یا به اصطلاح ستاره‌ای به فیلم می‌دهد)
    هر نظر در یک فایل text قرار دارد و نظرات مثبت در یک directory و نظرات منفی در directory دیگری قرار دارد. همچنین در نام هر فایل تعداد ستاره‌های داده شده توسط نظردهنده قید شده است. [۴]


  • ابزارها:
    برای تحلیل داده‌های نوشتاری (مانند تحلیل نظرات) و کلاسه‌بندی آن‌ها در زبان پایتون ماژول‌هایی وجود دارد که در ذیل اشاره‌ی مختصری به آن‌ها شده است. در پیاده‌سازی انجام شده از ماژول‌های TextBlob و NLTK استفاده شده است. اما برای پیاده‌سازی‌های مختلف دیگر که بعضا می‌توانند دقیق‌تر هم عمل‌کنند می‌توان از ماژول‌های دیگر مانند ماژول Scikit-Learn استفاده کرد.
    ۱. ماژول NumPy: یک ابزار پایه‌ای برای محاسبات ریاضیاتی در زبان پایتون. در اکثر ابزارهای دیگر از این ماژول ارث‌بری شده است.
    ۲. ابزار scikit-learn: ابزاری بسیار قدرتمند برای پردازش و تحلیل داده. این ابزار بر پایه‌ی ماژول‌های NumPy, SciPy و Matplotlib پیاده‌سازی شده است. یکی از مهم‌ترین کارایی‌های این ابزار برای این مطلب، Classification های پیاده‌سازی شده در آن است.
    ۳. ماژول Natural Language Toolkit: یا همان NLTK که معروف‌ترین و قدرتمندترین ابزار موجود برای پردازش متن است. این ماژول درون خود از ماژول NumPy ارث‌بری می‌کند. (در اینجا برای کلاسه‌بندی و کارهای دیگر مورد استفاده قرار می‌گیرد.)
    ۴. ماژول TextBlob: این ماژول از همان ماژول NLTK و ابزار دیگری به نام Pattern ارث‌بری کرده است. از این رو این ماژول محدودتر از NLTK است اما کارهای پیشرفته‌تری را انجام می‌دهد. (مانند Tokenize کردن جملات، پیاده‌سازی برخی classifier ها و ...)


  • نتایج ارزیابی:
    مقایسه‌ی دو روش اصلی کلاسه‌بندی پیاده‌سازی شده برای این مساله نشان می‌دهد که روش Naive Bayes همواره بهتر از روش درخت تصمیم‌گیری عمل می‌کند. این موضوع برای تمام اندازه‌های مختلف مجموعه داده‌ای که به عنوان داده‌ی تمرینی به رده‌بند داده می‌شود صادق است.
    همچنین می‌بایست به این موضوع اشاره کرد که سرعت انجام محاسبات در روش Naive Bayes بسیار بالاتر از روش درخت تصمیم‌گیری است.

شکل ۶. نسبت اندازه‌ی مجموعه داده‌ی تمرینی به دقت تشخیص رده‌بند

شکل ۷ دقت تشخیص رده‌بند‌ها را پس از انجام بهبود‌های مختلف بر روی پیاده‌سازی انجام شده نشان می‌دهد.

شکل ۷. نسبت اندازه‌ی مجموعه داده‌ی تمرینی به دقت تشخیص رده‌بند پس از انجام بهبود‌ها

این نتایج ۲ نکته را نشان می‌دهند:
۱. در روش Naive Bayes این بهبود به طور میانگین بین ۰ تا ۱۰ درصد بوده است و در کل ۴٪ افزایش دقت رخ داده است. اما این میزان برای روش درخت تصمیم‌گیری بسیار بیشتر بوده است و به طور میانگین بین ۵ تا ۲۴ درصد بوده است که در کل افزایش دقت ۱۲٪ای رخ داده است. همچنین دقت نهایی رده‌بند درخت تصمیم‌گیری به میزان ۱۷٪ افزایش داشته است.
۲. مقایسه‌ی ۲ نمودار موجود در شکل‌های ۶ و ۷ نشان می‌دهد که نوسانات موجود در میزان دقت تشخیص رده‌بند‌ها به میزان قابل‌توجهی کاهش داشته است که این موضوع نشان از اهمیت انجام پیش‌پردازش بر روی مجموعه داده‌ها دارد.


  • کار‌های انجام شده برای افزایش دقت رده‌بند‌ها و بهبود نتایج به‌دست آمده:

۱. انجام پیش‌پردازش: برای این منظور چند کار انجام شده است
-نشانه‌گذاری: که توضیح لازم برای این کار در قسمت مربوطه داده شده است.
-کوچک کردن تمام حروف کلمات: زیرا بزرگ یا کوچک بودن حروف کلمات تاثیری در لحن نظر ندارند و نباید به عنوان کلمات جدید با آن‌ها برخورد کرد.
-حذف حرف S از پایان کلمات (نشانه‌ی جمع و نشانه‌ی مالکیت)
-حذف ing و ed از انتهای فعل ها زیرا ریشه‌ی فعل برای ما اهمیت دارد.
-حذف ly از انتهای قید‌ها
-تبدیل n't به not و حذف فعل‌های to be (زیرا تنها می‌توانند منفی بودن را منتقل کنند. برای همین تنها not را نگه می‌داریم.)

۲. تبدیل صفت‌های مثبت به یکدیگر:
خود کلمه‌ی به کار رفته برای تعریف از چیزی اهمیت چندانی ندارد. موضوع اصلی مثبت بودن آن کلمه است. به همین دلیل صفت‌های مثبت در نظر تشخیص داده می‌شوند و به یک صفت مثبت واحد تبدیل می‌شوند.

۳. تبدیل صفت‌های منفی به یکدیگر:
اتفاقی که برای صفت‌های مثبت می‌افتد برای صفات منفی نیز صادق است. لذا همان کار برای تبدیل صفت‌های منفی مختلف در یک نظر به یک صفت منفی واحد انجام می‌شود.

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


انجام این روش برای پیدا کردن کلمات بیهوده در نهایت به ما کمک می‌کند تا کلماتی که بیشتر در نظرات مثبت و کلماتی که بیشتر در نظرات منفی به کار می‌روند را پیدا کنیم. (به نوعی می‌توانیم این کلمات را کلمات کلیدی در نظر بگیریم.) پیدا کردن کلمات کلیدی این کمک را به ما می‌کنند تا بتوانیم ویژگی‌ها را استخراج کنیم.
نتایج به‌دست آمده از استخراج ویژگی‌ها به صورت سطحی کلمات زیر را به ما نشان می‌دهد:
برخی از کلمات که بیشتر در نظرات مثبت تکرار می‌شوند: good, show, war, very, star
برخی از کلمات که بیشتر در نظرات منفی تکرار می‌شوند: bad, just, real, no, horror, watch
این کلمات می‌توانند نتایج جالبی را به ما نشان دهند. به عنوان مثال احتمالا کاربران برای فیلم‌های ترسناک بیشتر نظر منفی می‌گذارند. در مقابل، احتمالا کاربران برای فیلم‌های جنگی و اکشن بیشتر نظر مثبت می‌گذارند. و یا کاربران در نظرات منفی خود به احتمال بالایی قید می‌کنند که این فیلم را «نبینید» یا از «دیدن» این فیلم ابراز پشیمانی می‌کنند.


  • برخی از تشخیص‌های درست و تشخیص‌های اشتباه:

. نظرات مثبت که مثبت تشخیص داده شده‌اند:

-This short deals with a severely critical writing teacher whose undiplomatic criticism extends into his everyday life. When he learns why that's not a good idea, we learn a bit about the beautiful craft of writing that he's been lecturing on.

-A boy who adores Maurice Richard of the Montreal Canadiens receives, much to his horror, a Toronto Maple Leafs sweater in the mail. I recently watched this in a class in which few of the students were interested in hockey, but nearly everyone knew about Maurice Richard and the Toronto/Montreal rivalry. Highly entertaining, amusing, and accurate.

-While the romance in this film is an important aspect, it is largely about the role of responsibility and duty in modern Indian. All of the major characters were well fleshed out, and had their own "inner life". I recommend this strongly.

-A stunningly well-made film, with exceptional acting, directing, writing, and photography. A newlywed finds married life not what she expected, and starts to question her duty to herself versus her duty to society. Together with her sister-in-law, she makes some radical departures from conventional roles and mores.

-First time I saw this great movie and Alyssa, my star, playing Frances Ella Fitz, was so great in this movie! It was just so real and her little dog so cute! I saw it the first time when I was like 11 years old and it was the best movie i had ever seen, and you know what? I still think so! 10/10 = greatest ever!

-Brilliant and moving performances by Tom Courtenay and Peter Finch.

-Extremely funny. More gags in each one of these episodes than in ten years of Friends. And with a good (ie. funny) Nordberg, not the fab-only-casted OJ Simpson in the movies. When will these episodes emerge on DVD?

-This story focuses on the birth defect known as FAS, or Fetal Alcohol Syndrome, a disease diagnosed too often among Native Americans. In spite of the down-beat nature of this drama, the great script and the characterizations move the story along very well. This is arguably Smits best performance.

. نظرات مثبت که منفی تشخیص داده شده‌اند:

-For all that has been said about the subject matter, and the controversy that surrounded it, please do not overlook what I feel to be the most important part of the film: the salient struggles of everyone to keep their pride through their trials. Whether dealing with self-imposed male braggadocio, a sexual reawakening, or even life itself, everybody is human.

-I thought I was going to watch another Friday The 13th or a Halloween rip off, But I was surprised, It's about 3 psycho kids who kill, There's not too many movies like that, I can think of Mikey, Children Of The Corn and a few others, It's not the greatest horror movie but it's a least worth a rent.

-The theme is controversial and the depiction of the hypocritical and sexually starved india is excellent. Nothing more to this film. There is a lack of good dialogues (why was the movie in english??). There was lack of continuity and lack of passion/emotion in the acting.

. نظرات منفی که مثبت تشخیص داده شده‌اند:

-An interesting period picec showing us what was amazing in 1938. Gosh, Ma, a fake accident ring suing for $25,000!!! I guess projected into the 21st century it would amount to a lot of money. The acting would amount to pure 21st century ham. Nice to see the president as a hard-working newcomer.

-hair, the movie based on the broadway hit, fails to achieve any redeemable cinematic qualities. you cant really take the play and make it a movie. whether one is so tempted by the rock music to see this movie, it really detracts from the quality of a broadway show. worse than seeing sitcom reruns. musical fiasco, and cant believe others rated it so high.

-There are a few scripts like this one floating around Hollywood; this one is not even close to the best -- just the first. This is all production value, no substance, but the Disney name probably will help it. A good idea, a wasted opportunity.

-There must be an error. This movie belongs with "Plan 9", and a lot others as a quite entertaining, silly diversion. You'll never accept you like it, yet you will watch it whenever it comes out on TV. It's as simple as that.

-I and a friend rented this movie. We both found the movie soundtrack and production techniques to be lagging. The movie's plot appeared to drag on throughout with little surprise in the ending. We both agreed that the movie could have been compressed into roughly an hour giving it more suspense and moving plot.

-This film features two of my favorite guilty pleasures. Sure, the effects are laughable, the story confused, but just watching Hasselhoff in his Knight Rider days is always fun. I especially like the old hotel they used to shoot this in, it added to what little suspense was mustered. Give it a 3.

-A sprawling, overambitious, plotless comedy that has no dramatic center. It was probably intended to have an epic vision and a surrealistic flair (at least in some episodes), but the separate stories are never elevated into a meaningful whole, and the laughs are few and far between. Amusing ending, though.

-Widow hires a psychopath as a handyman. Sloppy film noir thriller which doesn't make much of its tension promising set-up.

. نظرات منفی که منفی تشخیص داده شده‌اند:

-I laughed so much when I saw this film I nearly soiled myself! Awful acting, laughable effects (super imposed explosions), and dodgy slow motion fighting. One of the worst films I've ever seen!

-Shakespeare would have been outraged. The writers mutilated Shakespeare's amazing work. Ariel is the only believable acting performance. The African voodoo, secluded swamp, and "Gator Man" character make the movie a mockery of Shakespeare's true Tempest. Don't waste your eye-sight on this movie.

-Formulaic slasher film, only this one stars three ten year olds (all born during a lunar eclipse) as the killers. Nice, huh? A little bit of gore and a nice nude scene may make this worthwhile for diehard fans of the genre, others beware.

-After 15 minutes watching the movie I was asking myself what to do: leave the theater, sleep or try to keep watching the movie to see if there was anything worth. I finally watched the movie: what a waste of time. Maybe I am not a 5 years old kid anymore!

-what was Bruce Willis thinking when he signed on for this one?? this one made no sense to me.. i was so confused by it, it wasnt funny at all.. I dont even know why Disney made this one.. Bruce is a Great actor whom ive liked for a Long time.. and this disappointed me a lot.. Pass this one by on the video shelf....

-An obscure horror show filmed in the Everglades. Two couples stay overnight in a cabin after being made a little uneasy by the unfriendliness of the locals. Who, or what, are the Blood Stalkers? After awhile they find out. Watch for the character of the village idiot who clucks like a chicken, he certainly is weird.

-I found this movie really hard to sit through, my attention kept wandering off the tv. As far as romantic movies go.. this one is the worst I've seen. Don't bother with it.

۵. کارهای آینده

یکی از کارهای آینده می‌تواند پیاده‌سازی بهتر و دقیق‌تر روش‌های کلاسه‌بندی باشد.
برای این منظور می‌توان از ماژول scikit-learn برای کلاسه‌بندی مجموعه داده‌ها استفاده کرد. (زیرا scikit-learn ابزاری قوی‌تر نسبت TetxBlob است.)
نکته‌ای که در استفاده از این ماژول وجود دارد این است که scikit-learn داده‌ها را تنها به صورت عددی می‌تواند دریافت کند. و برای همین باید مجموعه داده را در یک مرحله‌ی پیش‌پردازش از فضای رشته‌ای به فضای عددی ببریم (به کمک روش‌های مختلف). جهت انجام این کار هم می‌توان از ماژول NumPy استفاده کرد. در حالی که این اتفاقات به صورت خودکار در ماژول TextBlob انجام می‌شود.
همچنین درصورت امکان می‌توان به بررسی و پیاده‌سازی روش‌های بیشتری از انواع روش‌های کلاسه‌بندی پرداخت.

برای دریافت کد پروژه و همچنین dataset مورد استفاده در آن به GitHub مربوطه مراجعه نمایید.

۶. مراجع

[1] Pang, Bo, Lillian Lee, and Shivakumar Vaithyanathan. "Thumbs up? Sentiment Classification using Machine Learning Techniques."
[2] Richard Socher, Alex Perelygin, Jean Y. Wu, Jason Chuang, Christopher D. Manning, Andrew Y. Ng and Christopher Potts. "Recursive Deep Models for Semantic Compositionality Over a Sentiment Treebank" Stanford University, Stanford, CA 94305, USA
[3] Liu, Bing, and Lei Zhang. "A survey of opinion mining and sentiment analysis." Mining Text Data. Springer US, 2012. 415-463.
[4] Maas, Andrew L. and Daly, Raymond E. and Pham, Peter T. and Huang, Dan and Ng, Andrew Y. and Potts, Christopher. "Learning Word Vectors for Sentiment Analysis." Portland, Oregon, USA, June 2011.

۷. پانویس

(1) Text Preprocessing
(2) Emoji
(3) Subconstituent
(4) Mapping
(5) Part of Speech
(6) Negating Negative Sentences
(7) Testing
(8) Learning
(9) Supervised Learning
(10) Normal Distribution
(11) Language Detection
(12) Topic Classification
(13) Train
(14) Test

پیوندهای مفید

محسن ایمانی

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

توضیحات مقدّماتی پروژه، بسیار خوب پروژه را معرفی و روند اصلی کار را بیان می کند. متن تقریباَ بدون خطا های املایی و ویرایشی است. قسمت مراجع بسیار مرتب است و از منابع بسیار خوبی استفاده شده. قسمت پیاده سازی کد ها می توانست شامل روش های بیشتری باشد؛ امّا علی رغم کمبود وقت و فشردگی دروس که فرمودید، روش های نامبرده شده، بصورت کامل و مقبول بیان شدند. خسته نباشید.

محسن ایمانی

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

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

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

  • بسیاری از ابزارهایی که معرفی کرده‌اید هیچ استفاده‌ای در پیاده‌سازی شما نداشته‌اند مانند Scipy, Numpy, Scikit-learn, matplotlib.

  • بخش پیش‌پردازش در متن پژوهش شما اضافه شده است، اما در پیاده‌سازی پیش‌پردازشی روی متن انجام نداده‌اید.

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

  • سعی کنید در متن خود کم‌تر از لغات انگلیسی استفاده کنید. از معادل‌های فارسی آن‌ها استفاده نمایید. مثلا به جای Classifier از رده‌بند، به جای Dataset از مجموعه داده بنویسید. در جاهای زیادی از معادل‌های مناسب استفاده کرده‌اید اما به جای این که معادل را در پرانتز و روبروی کلمه بیاورید آن را در پانویس بگذارید.

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

موفق باشید

تایید شده

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

موفق باشید

تایید شده

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

تایید شده

با سلام
کار شما تقریبا کامل بود. تنها چند نکته قابل ذکر است.
در بخش کارهای مرتبط بهتر بود توضیحات بیشتر و با استفاده از تصاویر میدادید.
در بخش بهبود نتایج نیز بهتر بود به طور جداگانه تاثیر هرکدام از بهبود هایی که داده اید را بررسی می کردید.
خسته نباشید !

محسن ایمانی

خدا قوت!

رد شده

با سلام
برای تهیه ی این نوشته زحمات زیادی کشیده شده و پیش از ارایه ی نظر به نگارنده ی آن خسته نباشید می گویم.

  • مقدمه فارغ از محتوا بیش از آن که شبیه یک مقاله باشد به یک ارایه ی شفاهی شباهت دارد. مقدمه بیش از حد به مباحث علمی وابسته است در صورتی باید با زبانی ساده تر پروژه را شرح دهد و مباحث علمی در کار های مرتبط و آزمایش ها بررسی شود.

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

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

  • صحفه آرایی مناسب است.

  • توضیحات کافی است.

  • مطالب کامل است.

  • پیاده سازی به خوبی شرح داده شده است.

  • استفاده ی مناسب از نمودار و اشکال شده است.
    مقدمه 5/10
    کار های مرتبط 15/20
    توضیحات آزمایش 30/35
    پیاده سازی 35/35
    من به شما نمره ی 80 را می دهم و معادل آن ۴ ستاره از ۵ ستاره است. موفق باشید.