وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

پایتون برای NLP: تجزیه و تحلیل احساسات با Scikit-Learn

0 2
زمان لازم برای مطالعه: 8 دقیقه


این پنجمین مقاله از مجموعه مقالات است روی NLP برای پایتون. در مقاله قبلی خود توضیح دادم که چگونه می‌توان از کتابخانه spaCy پایتون برای انجام بخش‌هایی از برچسب‌گذاری گفتار و شناسایی موجودیت نام‌گذاری شده استفاده کرد. در این مقاله، روش انجام تجزیه و تحلیل احساسات با استفاده از داده های توییتر را با استفاده از کتابخانه Scikit-Learn نشان خواهم داد.

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

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

در این مقاله خواهیم دید که چگونه می توانیم تحلیل احساسات داده های متنی را انجام دهیم.

تعریف مشکل

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

راه حل

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

واردات کتابخانه های مورد نیاز

اولین قدم مثل همیشه این است که import کتابخانه های مورد نیاز:

import numpy as np 
import pandas as pd 
import re
import nltk 
import matplotlib.pyplot as plt
%matplotlib inline

توجه داشته باشید: تمام اسکریپت های مقاله با استفاده از Jupyter نوت بوک.

وارد کردن مجموعه داده

مجموعه داده ای که ما می خواهیم برای این مقاله استفاده کنیم به صورت رایگان در اینجا موجود است لینک GitHub.

به import مجموعه داده، از پانداها استفاده خواهیم کرد read_csv عملکرد، همانطور که در زیر نشان داده شده است:

data_source_url = "https://raw.githubusercontent.com/kolaveridi/kaggle-Twitter-US-Airline-Sentiment-/master/Tweets.csv"
airline_tweets = pd.read_csv(data_source_url)

بیایید ابتدا ببینیم که مجموعه داده با استفاده از چگونه به نظر می رسد head() روش:

airline_tweets.head()

خروجی به شکل زیر است:

پایتون برای NLP: تجزیه و تحلیل احساسات با Scikit-Learn

تحلیل داده ها

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

plot_size = plt.rcParams("figure.figsize") 
print(plot_size(0)) 
print(plot_size(1))

plot_size(0) = 8
plot_size(1) = 6
plt.rcParams("figure.figsize") = plot_size 

بیایید ابتدا تعداد توییت های هر ایرلاین را ببینیم. یک نمودار دایره ای برای آن ترسیم می کنیم:

airline_tweets.airline.value_counts().plot(kind='pie', autopct='%1.0f%%')

در خروجی می‌توانید درصد توییت‌های عمومی برای هر شرکت هواپیمایی را ببینید. یونایتد ایرلاین بیشترین تعداد توییت یعنی 26 درصد را دارد و پس از آن US Airways (20 درصد) قرار دارد.

پایتون برای NLP: تجزیه و تحلیل احساسات با Scikit-Learn

بیایید اکنون توزیع احساسات در همه توییت ها را ببینیم. اسکریپت زیر را اجرا کنید:

airline_tweets.airline_sentiment.value_counts().plot(kind='pie', autopct='%1.0f%%', colors=("red", "yellow", "green"))

خروجی اسکریپت بالا به شکل زیر است:

پایتون برای NLP: تجزیه و تحلیل احساسات با Scikit-Learn

از خروجی مشاهده می‌کنید که اکثر توییت‌ها منفی هستند (63%)، پس از آن توییت‌های خنثی (21%) و سپس توییت‌های مثبت (16%) هستند.

در مرحله بعد، بیایید توزیع احساسات برای هر شرکت هواپیمایی را ببینیم،

airline_sentiment = airline_tweets.groupby(('airline', 'airline_sentiment')).airline_sentiment.count().unstack()
airline_sentiment.plot(kind='bar')

خروجی به شکل زیر است:

پایتون برای NLP: تجزیه و تحلیل احساسات با Scikit-Learn

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

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

import seaborn as sns

sns.barplot(x='airline_sentiment', y='airline_sentiment_confidence' , data=airline_tweets)

خروجی اسکریپت بالا به شکل زیر است:

پایتون برای NLP: تجزیه و تحلیل احساسات با Scikit-Learn

از خروجی می توانید متوجه شوید که سطح اطمینان برای توییت های منفی در مقایسه با توییت های مثبت و خنثی بالاتر است.

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

پاکسازی داده ها

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

مجموعه ویژگی های ما فقط از توییت ها تشکیل می شود. اگر به مجموعه داده خود نگاه کنیم، ستون یازدهم حاوی متن توییت است. توجه داشته باشید که شاخص ستون 10 خواهد بود زیرا ستون های پانداها از طرح نمایه سازی مبتنی بر صفر پیروی می کنند که در آن ستون اول ستون 0 نامیده می شود. مجموعه برچسب ما شامل احساس توییتی است که باید پیش بینی کنیم. احساس توییت در ستون دوم (شاخص 1) قرار دارد. برای ایجاد یک ویژگی و یک مجموعه برچسب، می توانیم از iloc روش خارج از قاب داده پانداها.

اسکریپت زیر را اجرا کنید:

features = airline_tweets.iloc(:, 10).values
labels = airline_tweets.iloc(:, 1).values

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

processed_features = ()

for sentence in range(0, len(features)):
    
    processed_feature = re.sub(r'\W', ' ', str(features(sentence)))

    
    processed_feature= re.sub(r'\s+(a-zA-Z)\s+', ' ', processed_feature)

    
    processed_feature = re.sub(r'\^(a-zA-Z)\s+', ' ', processed_feature) 

    
    processed_feature = re.sub(r'\s+', ' ', processed_feature, flags=re.I)

    
    processed_feature = re.sub(r'^b\s+', '', processed_feature)

    
    processed_feature = processed_feature.lower()

    processed_features.append(processed_feature)

در اسکریپت بالا، با حذف تمام کاراکترهای خاص از توییت ها شروع می کنیم. بیان منظم re.sub(r'\W', ' ', str(features(sentence))) آن را انجام می دهد.

در مرحله بعد، تمام کاراکترهای تک باقی مانده در نتیجه حذف کاراکتر ویژه با استفاده از را حذف می کنیم re.sub(r'\s+(a-zA-Z)\s+', ' ', processed_feature) عبارت منظم. به عنوان مثال، اگر کاراکتر ویژه را حذف کنیم ' از جانب Jack's و جای آن را با فضا جایگزین کنید، ما مانده ایم Jack s. اینجا s معنی ندارد، بنابراین با جایگزین کردن تمام کاراکترهای منفرد با یک فاصله، آن را حذف می کنیم.

با این حال، اگر همه کاراکترهای منفرد را با فاصله جایگزین کنیم، چندین فاصله ایجاد می شود. بنابراین، همه فضاهای چندگانه را با استفاده از فضاهای تک جایگزین می کنیم re.sub(r'\s+', ' ', processed_feature, flags=re.I) regex علاوه بر این، اگر رشته متن شما در بایت باشد، یک کاراکتر را فرمت کنید b به رشته اضافه می شود. اسکریپت بالا با استفاده از regex آن را حذف می کند re.sub(r'^b\s+', '', processed_feature).

در نهایت، متن با استفاده از حروف کوچک تبدیل می شود lower() تابع.

نمایش متن به شکل عددی

الگوریتم های آماری از ریاضیات برای آموزش مدل های یادگیری ماشین استفاده می کنند. با این حال، ریاضیات فقط با اعداد کار می کند. برای اینکه الگوریتم های آماری با متن کار کنند، ابتدا باید متن را به عدد تبدیل کنیم. برای انجام این کار، سه رویکرد اصلی وجود دارد که عبارتند از Bag of Words، TF-IDF و Word2Vec. در این بخش به کیسه کلمات و طرح TF-IDF می پردازیم.

کیسه کلمات

طرح کیسه کلمات ساده ترین راه برای تبدیل متن به اعداد است.

به عنوان مثال، شما سه سند دارید:

  • Doc1 = “من دوست دارم فوتبال بازی کنم”
  • Doc2 = “بازی خوبی است”
  • Doc3 = “من فوتبال را به راگبی ترجیح می دهم”

در رویکرد کیسه کلمات، اولین قدم ایجاد واژگانی از تمام کلمات منحصر به فرد است. برای سه سند فوق، واژگان ما به صورت زیر خواهد بود:

Vocab = (I, like, to, play, football, it, is, a, good, game, prefer, over, rugby)

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

(1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0)

TF-IDF

در رویکرد کیسه کلمات، هر کلمه وزن یکسانی دارد. ایده پشت رویکرد TF-IDF این است که کلماتی که کمتر در همه اسناد و بیشتر در اسناد جداگانه وجود دارند، بیشتر به طبقه بندی کمک می کنند.

TF-IDF ترکیبی از دو عبارت است. فرکانس مدت و بسامد سند معکوس. آنها را می توان به صورت زیر محاسبه کرد:

TF  = (Frequency of a word in the document)/(Total words in the document)

IDF = Log((Total number of docs)/(Number of docs containing the word))

TF-IDF با استفاده از کتابخانه Scikit-Learn

خوشبختانه برای ما، پایتون Scikit-Learn کتابخانه شامل TfidfVectorizer کلاسی که می تواند برای تبدیل ویژگی های متن به بردارهای ویژگی TF-IDF استفاده شود. اسکریپت زیر این کار را انجام می دهد:

from nltk.corpus import stopwords
from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer (max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words('english'))
processed_features = vectorizer.fit_transform(processed_features).toarray()

در کد بالا تعریف می کنیم که max_features باید 2500 باشد، به این معنی که فقط از 2500 کلمه متداول برای ایجاد بردار ویژگی “کیف کلمات” استفاده می کند. کلماتی که کمتر دیده می شوند برای طبقه بندی چندان مفید نیستند.

به همین ترتیب، max_df مشخص می کند که فقط از کلماتی استفاده شود که حداکثر در 80٪ اسناد وجود دارد. کلماتی که در همه اسناد وجود دارد بسیار رایج هستند و برای طبقه بندی چندان مفید نیستند. به همین ترتیب، min-df روی 7 تنظیم شده است که نشان می دهد کلماتی را که در حداقل 7 سند وجود دارد را شامل می شود.

تقسیم داده ها به مجموعه های آموزشی و آزمایشی

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

کد زیر را اجرا کنید:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(processed_features, labels, test_size=0.2, random_state=0)

در کد بالا ما از train_test_split کلاس از sklearn.model_selection ماژول برای تقسیم داده های ما به مجموعه های آموزشی و آزمایشی. این روش مجموعه ویژگی را به عنوان پارامتر اول، مجموعه برچسب را به عنوان پارامتر دوم و مقداری برای the می گیرد test_size پارامتر. ما مقدار 0.2 را برای آن مشخص کردیم test_size به این معنی که مجموعه داده های ما به دو مجموعه داده های 80% و 20% تقسیم می شود. ما از مجموعه داده 80% برای آموزش و 20% مجموعه داده برای آزمایش استفاده خواهیم کرد.

آموزش مدل

هنگامی که داده ها به مجموعه های آموزشی و آزمایشی تقسیم می شوند، می توان از الگوریتم های یادگیری ماشین برای یادگیری از داده های آموزشی استفاده کرد. شما می توانید از هر الگوریتم یادگیری ماشینی استفاده کنید. با این حال، ما از الگوریتم Random Forest به دلیل توانایی آن در عمل بر روی داده های غیر عادی استفاده خواهیم کرد.

را sklearn.ensemble ماژول شامل RandomForestClassifier کلاسی که می تواند برای آموزش مدل یادگیری ماشین با استفاده از الگوریتم جنگل تصادفی استفاده شود. برای انجام این کار، باید با شماره تماس بگیرید fit روش روی را RandomForestClassifier کلاس و ویژگی‌ها و برچسب‌های آموزشی ما را به عنوان پارامتر ارسال کنید. به اسکریپت زیر نگاه کنید:

from sklearn.ensemble import RandomForestClassifier

text_classifier = RandomForestClassifier(n_estimators=200, random_state=0)
text_classifier.fit(X_train, y_train)

پیش بینی و ارزیابی مدل

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

predictions = text_classifier.predict(X_test)

در نهایت، برای ارزیابی عملکرد مدل‌های یادگیری ماشین، می‌توانیم از معیارهای طبقه‌بندی مانند a ماتریس سردرگمی، اندازه گیری F1، دقت و غیره

برای یافتن مقادیر این معیارها، می‌توانیم استفاده کنیم classification_report، confusion_matrix، و accuracy_score آب و برق از sklearn.metrics کتابخانه به اسکریپت زیر نگاه کنید:

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

print(confusion_matrix(y_test,predictions))
print(classification_report(y_test,predictions))
print(accuracy_score(y_test, predictions))

خروجی اسکریپت بالا به شکل زیر است:

((1724  101   45)
 ( 329  237   48)
 ( 142   58  244))
              precision    recall  f1-score   support

    negative       0.79      0.92      0.85      1870
     neutral       0.60      0.39      0.47       614
    positive       0.72      0.55      0.62       444

   micro avg       0.75      0.75      0.75      2928
   macro avg       0.70      0.62      0.65      2928
weighted avg       0.74      0.75      0.73      2928

0.7530737704918032

از خروجی می بینید که الگوریتم ما به دقت 75.30 دست یافته است.

نتیجه

تجزیه و تحلیل احساسات یکی از متداول ترین کارهای NLP است که به تعیین افکار عمومی در مورد یک موضوع خاص کمک می کند.

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

در مقاله بعدی روش انجام مدل‌سازی موضوع با Scikit-Learn را نشان خواهم داد، که یک تکنیک بدون نظارت برای تجزیه و تحلیل حجم زیادی از داده‌های متنی با خوشه‌بندی اسناد در گروه‌ها است.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-23 19:05:08

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

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

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید