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

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

تو این پست آموزشی، تجزیه و تحلیل احساسات در توییتر رو بر اساس NLP و با استفاده از کتابخونه NLTK پایتون انجام میدیم.

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

حالا بیایید کارمون رو با ایمپورت کتابخونه ها شروع کنیم:

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
from sklearn.model_selection import train_test_split # function for splitting data to train and test sets

import nltk
from nltk.corpus import stopwords
from nltk.classify import SklearnClassifier

from wordcloud import WordCloud,STOPWORDS
import matplotlib.pyplot as plt

دانلود دیتاست

برای دانلود دیتاست موردنیاز برای این پروژه، روی این لینک کلیک کنید:

data = pd.read_csv('Sentiment.csv')
# Keeping only the neccessary columns
data = data[['text','sentiment']]

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

برای اینکه این تحلیل با نتایج خاص و مفیدی همراه باشه، اون دسته توییت­هایی که خنثی هستند و شامل یه نظر مثبت یا منفی نیستن رو از دیتاست حذف میکنیم چون هدف اصلی از این کار تحلیل فرق بین توییت های مثبت و منفیه.

# Splitting the dataset into train and test set
train, test = train_test_split(data,test_size = 0.1)
# Removing neutral sentiments
train = train[train.sentiment != "Neutral"]"

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

اول، هشتگ­ها، منشن­ها و لینک­ها رو از متن توییت ها پاک میکنیم. الآن دیگ، داده­ها آماده این هستند که با wordcloud، مهم‌ترین و برجسته­ترین کلمات مربوط به توییت های مثبت و منفی رو نشون بدیم.

train_pos = train[ train['sentiment'] == 'Positive']
train_pos = train_pos['text']
train_neg = train[ train['sentiment'] == 'Negative']
train_neg = train_neg['text']

def wordcloud_draw(data, color = 'black'):
    words = ' '.join(data)
    cleaned_word = " ".join([word for word in words.split()
                            if 'http' not in word
                                and not word.startswith('@')
                                and not word.startswith('#')
                                and word != 'RT'
                            ])
    wordcloud = WordCloud(stopwords=STOPWORDS,
                      background_color=color,
                      width=2500,
                      height=2000
                     ).generate(cleaned_word)
    plt.figure(1,figsize=(13, 13))
    plt.imshow(wordcloud)
    plt.axis('off')
    plt.show()
    
print("Positive words")
wordcloud_draw(train_pos,'white')
print("Negative words")
wordcloud_draw(train_neg)

جالبه که به برجسته ترین کلمات مربوط به دیتاست توییت های مثبت توجه کنید:

truth, strong, legitimate, together, love, job

نتیجه اینه که مردم معتقدند که کاندید ایده ­آل اونها دارای ویژگی‌هایی مثل راستگویی و کاردرستیه و در کل خوبه.

از طرف دیگه، توییت های منفی شامل کلمات زیر هستن:

influence, news, elevatormusic, disappointing, softball, makeup, cherry picking, trying

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

بعد مصورسازی، هشتگ­ها، منشن­ها، لینک­ها و stopword­ها رو از مجموعه آموزشی حذف میکنیم.

 stopword­ها کلماتی هستند که استفاده از اونها در این جستجو و تجزیه و تحلیل اهمیتی نداره.

معمولاً این نوع کلمات از پرس‌وجوها حذف میشن چون اطلاعات غیرمفید و بی‌اهمیت زیادی رو برمیگردونن. (مثل: the،for، this و …)

tweets = []
stopwords_set = set(stopwords.words("english"))

for index, row in train.iterrows():
    words_filtered = [e.lower() for e in row.text.split() if len(e) >= 3]
    words_cleaned = [word for word in words_filtered
        if 'http' not in word
        and not word.startswith('@')
        and not word.startswith('#')
        and word != 'RT']
    words_without_stopwords = [word for word in words_cleaned if not word in stopwords_set]
    tweets.append((words_without_stopwords, row.sentiment))

test_pos = test[ test['sentiment'] == 'Positive']
test_pos = test_pos['text']
test_neg = test[ test['sentiment'] == 'Negative']
test_neg = test_neg['text']

در مرحله بعد، با nltk lib، ویژگی‌ها رو استخراج میکنیم و این کار رو با اندازه‌گیری یه فرکانس توزیع و انتخاب کلیدهای حاصل انجام میدیم.

# Extracting word features
def get_words_in_tweets(tweets):
    all = []
    for (words, sentiment) in tweets:
        all.extend(words)
    return all

def get_word_features(wordlist):
    wordlist = nltk.FreqDist(wordlist)
    features = wordlist.keys()
    return features
w_features = get_word_features(get_words_in_tweets(tweets))

def extract_features(document):
    document_words = set(document)
    features = {}
    for word in w_features:
        features['contains(%s)' % word] = (word in document_words)
    return features

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

wordcloud_draw(w_features)

با استفاده از nltk NaiveBayes Classifier، ویژگی‌های استخراج‌شده رو طبقه‌بندی میکنیم:

# Training the Naive Bayes classifier
training_set = nltk.classify.apply_features(extract_features,tweets)
classifier = nltk.NaiveBayesClassifier.train(training_set)

درنهایت، با معیارهای نه‌چندان هوشمندانه، نحوه نمره دهی الگوریتم طبقه‌بندی رو اندازه‌گیری میکنیم:

neg_cnt = 0
pos_cnt = 0
for obj in test_neg: 
    res =  classifier.classify(extract_features(obj.split()))
    if(res == 'Negative'): 
        neg_cnt = neg_cnt + 1
for obj in test_pos: 
    res =  classifier.classify(extract_features(obj.split()))
    if(res == 'Positive'): 
        pos_cnt = pos_cnt + 1
        
print('[Negative]: %s/%s '  % (len(test_neg),neg_cnt))        
print('[Positive]: %s/%s '  % (len(test_pos),pos_cnt))    

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

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

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

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

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