تحلیل احساسات با پایتون

پروژه یادگیری ماشین برای تحلیل احساسات با زبان برنامه نویسی پایتون

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

تحلیل احساسات چیست؟

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

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

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

به عنوان مثال:

 “I love this camera. It’s amazing!”

کلمات احساساتی به‌عنوان کلمات قطبی و لغت‌نامه احساساتی هم شناخته میشن که به‌طورکلی می تونیم اونها را به دو دسته تقسیم کنیم:

کلمات مثبت: فوق العاده، زیبا، شگفت انگیز و …

کلمات منفی: وحشتناک، نفرت انگیز، بی چاره و …

پروژه یادگیری ماشین برای تحلیل احساسات با پایتون

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

برای دانلود دیتاست میتونین روی این لینک کلیک کنید.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns 
from sklearn.feature_extraction.text import CountVectorizer
count=CountVectorizer()
data=pd.read_csv("Train.csv")
data.head()


این دیتاست شامل ۴۰ هزار نظر در مورد فیلم‌ها هست که از IMDB استخراج شده. اگر خوب دقت کنید، میبینین که این دیتاست دارای ۲ ستون مهمه. یکی از این ستون ها شامل متن‌هایی هست که نظر و عقیده کاربر رو در مورد یک فیلم بیان میکنه و ستون دیگر برچسب مربوط به اون متن هست که میتونه ۰ یا ۱ باشه. ۰ به معنی نظر منفی و ۱ به معنی نظر مثبت هست.

الآن بیاید پراکندگی داده‌ها رو به‌صورت مصور نشون بدیم:

fig=plt.figure(figsize=(5,5))
colors=["skyblue",'pink']
pos=data[data['label']==1]
neg=data[data['label']==0]
ck=[pos['label'].count(),neg['label'].count()]
legpie=plt.pie(ck,labels=["Positive","Negative"],
                 autopct ='%1.1f%%', 
                 shadow = True,
                 colors = colors,
                 startangle = 45,
                 explode=(0, 0.1))

بعد،  RE (regular expression) رو ایمپورت می‌کنیم و از اون برای حذف تگ‌های html مثل  ‘<a>’ استفاده می‌کنیم. به کمک این کتابخانه همه تگ‌ها رو با یه رشته خالی جایگزین می‌کنیم. بعد ایموجی هایی که در داخل نظرات درج شده رو به‌صورت کاراکتر درمیاریم.

به این صورت که:

ایموجی خنده –>  : )

ایموجی غمگین –> : (

ایموجی ناراحت –> :\

import re
def preprocessor(text):
             text=re.sub('<[^>]*>','',text)
             emojis=re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)',text)
             text=re.sub('[\W]+',' ',text.lower()) +\
                ' '.join(emojis).replace('-','')
             return text   
data['text']=data['text'].apply(preprocessor)

البته، برای حفظ ترتیب و تمیزی متن‌ها، این ایموجی ها به آخر متن اضافه میشن.

حالا با استفاده از PorterStemmer مربوط به nltk، ساده‌سازی داده‌ها و حذف پیچیدگی‌های مربوط به داده‌ها رو انجام میدیم:

from nltk.stem.porter import PorterStemmer
porter=PorterStemmer()
def tokenizer(text):
        return text.split()
def tokenizer_porter(text):
    return [porter.stem(word) for word in text.split()]

مصورسازی کلمات منفی و مثبت

برای اینکه بتونیم کلمات مثبت و منفی رو به‌صورت مصور نشون بدیم از تکنیک wordcloud استفاده می‌کنیم. قبل از این کار، stop word ها رو حذف می‌کنیم. منظور از stop word کلماتی هستند که زیاد تکرار میشن و معنی و مفهوم خاصی رو به یه متن اضافه نمی‌کنند.

یه لیست خاصی برای این کلمات وجود نداره و هر ابزار برای خودش لیست مخصوصی از این کلمات داره ولی از رایج‌ترین این کلمات در زبان انگلیسی می تونیم به موارد زیر اشاره کنیم:

the, is, at, which, and on

import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
stop=stopwords.words('english')

from wordcloud import WordCloud
positivedata = data[ data['label'] == 1]
positivedata =positivedata['text']
negdata = data[data['label'] == 0]
negdata= negdata['text']

def wordcloud_draw(data, color = 'white'):
    words = ' '.join(data)
    cleaned_word = " ".join([word for word in words.split()
                              if(word!='movie' and word!='film')
                            ])
    wordcloud = WordCloud(stopwords=stop,
                      background_color=color,
                      width=2500,
                      height=2000
                     ).generate(cleaned_word)
    plt.figure(1,figsize=(10, 7))
    plt.imshow(wordcloud)
    plt.axis('off')
    plt.show()
    
print("Positive words are as follows")
wordcloud_draw(positivedata,'white')
print("Negative words are as follows")
wordcloud_draw(negdata)

کلمات مثبت برجسته: love, excellent, perfect, good, beautiful, kind, excellent

کلمات منفی برجسته: horrible, wasteful, problem, stupid, horrible, bad, poor

خب حالا از TF-IDF Vertorizer برای تبدیل داکیومنت به ماتریس ویژگی استفاده می‌کنیم. این مرحله برای آموزش مدل یادگیری ماشین خیلی مهمه چون قراره با وزن دهی به کلمات مهم کیفیت آموزش رو ارتقا بده:

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf=TfidfVectorizer(strip_accents=None,lowercase=False,preprocessor=None,tokenizer=tokenizer_porter,use_idf=True,norm='l2',smooth_idf=True)
y=data.label.values
x=tfidf.fit_transform(data.text)

آموزش یادگیری ماشین برای تحلیل احساسات

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

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(x,y,random_state=1,test_size=0.5,shuffle=False)

حالا مدل روی برای تحلیل احساسات آموزش میدیم و این کار رو با مدل Logistic Regression انجام میدیم:

from sklearn.linear_model import LogisticRegressionCV
clf=LogisticRegressionCV(cv=6,scoring='accuracy',random_state=0,n_jobs=-1,verbose=3,max_iter=500).fit(X_train,y_train)
y_pred = clf.predict(X_test)
from sklearn import metrics

# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

Accuracy: 0.89045

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

برای هرگونه سوال در زمینه آموزش ها فقط کافیه روی لینک واتساپ یا تلگرام (در زیر همین پست) کلیک کنید. یا با شماره تماس بالای صفحه سایت تماس بگیرید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...