تجزیه و تحلیل احساسات – انجمن DEV

شروع با تحلیل احساسات
این فرآیند تشخیص احساسات مثبت یا منفی در متن است.
همچنین به آن نظر کاوی نیز گفته می شود.
این یک رویکرد به پردازش زبان طبیعی (NLP) است که لحن عاطفی را شناسایی می کند
پشت مجموعه ای از متن
سازمان ها برای تعیین و دسته بندی نظرات در مورد یک محصول، خدمات یا ایده بسیار از آن استفاده می کنند
تحلیل احساسات شامل استفاده از داده کاوی، یادگیری ماشین (ML)، هوش مصنوعی
و زبانشناسی محاسباتی برای استخراج متن برای احساسات و اطلاعات ذهنی.
چنین اطلاعاتی ممکن است به صورت زیر طبقه بندی شوند:
- مثبت
- خنثی
- منفی این طبقه بندی به عنوان نیز شناخته می شود قطبیت از یک متن
تجزیه و تحلیل احساسات درجه بندی شده - بسیار مثبت
- مثبت
- خنثی
- منفی
- خیلی منفی به این تحلیل احساسات درجه بندی شده یا ریزدانه نیز گفته می شود.
انواع تحلیل احساسات
- مبتنی بر هدف – انگیزه پشت یک متن را تشخیص می دهد
- ریزدانه – تجزیه و تحلیل احساسات درجه بندی شده
- تشخیص احساسات – امکان تشخیص احساسات مختلف را فراهم می کند
- مبتنی بر جنبه – متن را برای دانستن جنبهها/ویژگیهای خاصی که در تمام قطبیها ذکر شده است، تجزیه و تحلیل میکند.
ما در حال حاضر به این گونه ها نخواهیم پرداخت.
این به نوبه خود به سازمان ها کمک می کند تا بینش هایی را در مورد احساسات مشتری در زمان واقعی جمع آوری کنند.
تجربه مشتری و شهرت برند
به طور کلی این ابزارها از تجزیه و تحلیل متن برای تجزیه و تحلیل منابع آنلاین استفاده می کنند.
مزایای تجزیه و تحلیل احساسات
- مرتب سازی داده ها به عنوان مقیاس
- تجزیه و تحلیل زمان واقعی
- معیارهای سازگار
مراحل درگیر در تحلیل احساسات
تجزیه و تحلیل احساسات به طور کلی مراحل زیر را دنبال می کند:
- داده ها را جمع آوری کنید – متن مورد تجزیه و تحلیل شناسایی و جمع آوری می شود.
- داده ها را پاک کنید – دادهها برای حذف نویز و بخشهایی از گفتار که معنایی مرتبط با احساس متن ندارند، پردازش و پاک میشوند.
- استخراج ویژگی ها – یک الگوریتم یادگیری ماشینی به طور خودکار ویژگی های متن را برای شناسایی احساسات منفی یا مثبت استخراج می کند.
- یک مدل ML را انتخاب کنید – ابزار تجزیه و تحلیل احساسات متن را با استفاده از مدل ML مبتنی بر قانون، خودکار یا ترکیبی امتیاز می دهد.
- طبقه بندی احساسات – هنگامی که یک مدل انتخاب می شود و برای تجزیه و تحلیل یک متن استفاده می شود، یک امتیاز احساسی به متن از جمله مثبت، منفی از خنثی اختصاص می دهد.
بیایید با استفاده از یک مثال، یک شیرجه عمیق در تحلیل احساسات داشته باشیم
مرحله 1. جمع آوری داده ها
ما می خواهیم از مجموعه داده های UCI Machine Learning Repository استفاده کنیم.
بیایید با وارد کردن کتابخانههایی که استفاده خواهیم کرد شروع کنیم:punkt
یک بسته داده است که شامل مدل های از پیش آموزش دیده برای توکن سازی است.
# import the required packages and libraries
import numpy as np
import pandas as pd
import nltk
nltk.download('punkt')
بارگذاری مجموعه داده
pd.set_option('display.max_colwith', None)
df = pd.read_csv('https://gist.githubusercontent.com/fmnobar/88703ec6a1f37b3eabf126ad38c392b8/raw/76b84540ccd4b0b207a6978eb7e9d938275886ff/imdb_labelled.csv')
df.head()
خروجی
اکنون می بینیم که تنها دو ستون وجود دارد text
و label
.
را label
نشان دهنده احساس بررسی است
- 1 نشان دهنده یک احساس مثبت است
- 0 نشان دهنده یک احساس منفی است. بنابراین این نشان دهنده قطبیت این احساسات است.
اکنون یک رشته نمونه ایجاد می کنیم که اولین ورودی در آن است text
ستون دیتا فریم df
.
sample = df.text[0]
sample
خروجی
توکن ها و بیگرام ها
آ. توکن ها
آ token
واحد معنی واحدی است که در متن قابل شناسایی است.
به عنوان a نیز شناخته می شود unigram
.Tokenization
فرآیند تجزیه یک متن به نشانه های فردی است.
عملکردهایی که انجام می دهند tokenization
نامیده می شوند tokenizers
.
این مفهوم با nltk.word_tokenize
تابع.
- تابع یک رشته متن را به عنوان ورودی می گیرد و لیستی از نشانه ها را برمی گرداند.
-
متن را به کلمات و علائم نگارشی جداگانه تقسیم می کند.
بیایید نمونه ای از استفاده از توابع با توکن کردن را مشاهده کنیمsample
متنsample_tokens = nltk.tokenize(نمونه)
نمونه_توکن ها[:10] # فهرستی از عناصر را تا توکن دهم مشاهده کنید
خروجی
ب بیگرام
اگر دو یونیگرم/توکن را با هم ترکیب کنیم a را تشکیل می دهیم bigram
.
بیگرام یک جفت نشانه مجاور در یک متن است.
آنها برای به تصویر کشیدن برخی از زمینه های یک کلمه خاص استفاده می شوند
یا عبارت appers.
از آنها برای ساخت مدل های آماری زبان استفاده می شود
دنباله ای از n کلمه / نشانه.
با تجزیه و تحلیل فراوانی n-گرم های مختلف در مجموعه بزرگی از متن،
سیستم های NLP می توانند یاد بگیرند که احتمال وقوع کلمات متفاوت در یک زمینه خاص را پیش بینی کنند.
bigrams
با اجرا می شوند nltk.bigrams
تابع
بیایید این را در عمل ببینیم
sample_bitokes = list(nltk.bigrams(sample_tokens))
# Return the first 10 bigrams
sample_bitokens[:10]
خروجی
توزیع فرکانس
به تعداد یا نسبت کلمات یا ستایش های مرتبط با احساسات مثبت یا منفی اشاره دارد.
اساساً وقوع هر کلمه/ عبارت احساسی را می شمارد
و سپس توزیع فرکانس را محاسبه کنید.
با استفاده از nltk.FreqDist
تابع
10 توکن برتر در نمونه ما کدامند؟
sample_freqdist = nltk.FreqDist(sample_tokens)
# Return the top 10 most frequent tokens
sample_freqdist.most_common(10)
خروجی
این نتایج در نهایت منطقی است:
- یک کاما،
the
،a
یا دوره ها می توانند در یک عبارت کاملاً رایج باشند.
بیایید یک تابع به نام ایجاد کنیم tokens_top
که در یک متن می گیرد
به عنوان ورودی و n رایج ترین نشانه در یک متن داده شده را برمی گرداند.
def tokens_top(text, n):
# create tokens
tokens = nltk.word_tokenize(text)
# create the frequency distribution
freqdist = nltk.FreqDist(tokens)
# return the top n most common tokens
return freqdist.most_common(n)
# Call the function
tokens_top(df.text[1], 10)
خروجی
ماتریس سند – مدت
ماتریسی است که نشان دهنده بسامد عباراتی است که در مجموعه ای از اسناد وجود دارد.
سطرها نشان دهنده اسناد موجود در مجموعه و ستون ها بیانگر اصطلاحات هستند.
سلول های ماتریس نشان دهنده بسامد یا وزن هر عبارت است.
ما می توانیم این را با scikit-learn's
CountVectorizer
مثال
#import the package
from sklearn.feature_extraction.text import CountVectorizer
def create_dtm(series):
# Create an instance/object of the class
cv = CountVectorizer()
# create a dtm from the series parameter
dtm = cv.fit_transform(series)
# convert the sparse array to a dense array
dtm = dtm.todense()
# get column names
features = cv.get_feature_names_out()
# create a dataframe
dtm_df = pd.DataFrame(dtm, columns = features)
# return the dataframe
return dtm_df
# Call the function for df['text].head
create_dtm(df['text'].head())
خروجی
پاکسازی داده ها
اهمیت ویژگی
به میزانی اشاره دارد که یک ویژگی/متغیر خاص به آن کمک می کند
پیشبینی یا طبقهبندی در تحلیل احساسات
روش های مختلفی وجود دارد که می توان برای تعیین اهمیت ویژگی استفاده کرد:
- الگوریتم های یادگیری ماشینی به عنوان مثال درختان تصمیم و جنگل های تصادفی
- روش های آماری به عنوان مثال تحلیل همبستگی یا رگرسیون
اهمیت ویژگی ابزار مفیدی در تحلیل احساسات است زیرا می تواند به شناسایی کمک کند
مهم ترین ویژگی برای پیش بینی دقیق احساس یک متن.
مثال
ما یک تابع “top_n_tokens” را تعریف می کنیم که دارای 3 پارامتر استtext
، sentiment
و n
تابع بالا را برمی گرداند n
مهمترین نشانه ها
برای پیش بینی احساس متن
استفاده خواهیم کرد LogisticRegression
از جانب sklearn.linear_model
با پارامترهای زیر:
solver="lbfgs"
max_iter = 2500
-
random_state = 1234
از sklearn.linear_model واردات LogisticRegression
def top_n_tokens (متن، احساس، n):
# یک نمونه از کلاس ایجاد کنید
lgr = LogisticRegression(solver=”lbfgs”، max_iter = 2500، random_state = 1234)
cv = CountVetorizer()# create the DTM dtm = cv.fit_transform(text) # fit the logistic regression model lgr.fit(dtm, sentiment) # get the coefficients coefs = lgr.coef_[0]; # create the features/column names features = cv.get_features_names_out() # create the dataframe df = pd.DataFrame({'Tokens' : features, 'Coefficients' : coefs}) # return the largest n return df.nlargest(n, coefficients) # Test if on df['text] top_n_tokens(df.text, df.label, 10)
خروجی
برای تایید این فرضیه که مهمترین ویژگی ها آنهایی خواهند بود که
نشان دهنده یک احساسات مثبت قوی است، بیایید به 10 کوچکترین ضریب نگاه کنیم.
from sklearn.linear_model import LosticRegression
def bottom_n_tokens(text, sentiment, n):
# create an instance of the class
lgr = LogisticRegression(solver="lbfgs", max_iter = 2500, random_state = 1234)
cv = CountVectorizer()
# create the DTM
dtm = cv.fit_transform(text)
# fit the logistic regression model
lgr.fit(dtm, sentiment)
# get the coefficients
coefs = lgr.coef_[0];
# create the features/column names
features = cv.get_features_names_out()
# create the dataframe
df = pd.DataFrame({'Tokens' : features, 'Coefficients' : coefs})
# return the smallest n
return df.nmallest(n, coefficients)
# Test if on df['text]
bottom_n_tokens(df.text, df.label, 10)
خروجی
در مثالی که تا اینجا پوشش دادهایم، از دادههای برچسبگذاری شده استفاده کردهایم
اگر داده های برچسب دار نداشته باشیم چه می شود؟
سپس می توانیم از مدل های از پیش آموزش دیده استفاده کنیم مانند:
- TextBlob -VADER
- استانفورد ColeNLP
- Google Cloud Natural Language API
- ترانسفورماتورهای صورت در آغوش کشیدن
بیایید کاوش کنیم TextBlob
TextBlob
این یک کتابخانه پایتون است که یک API ساده برای اجرای مشترک فراهم می کند
وظایف NLP مانند تجزیه و تحلیل احساسات.
از یک مدل از پیش آموزشدیده استفاده میکند تا یک امتیاز احساسی را به یک متن از 1- تا 1 اختصاص دهد.
این بر روی NLTK (کیت ابزار زبان طبیعی) ساخته شده است.
همچنین اطلاعات اضافی مانند:
احساس داده های داده شده را در قالب یک تاپل با نام به صورت زیر برمی گرداند:(polarity, subjectivity)
امتیاز قطبی یک شناور در محدوده است [-1.0, 1.0].
- هدف آن تشخیص مثبت یا منفی بودن متن است
ذهنیت شناوری در محدوده است [0.0, 1.0]
- 0.0 بسیار عینی است
- 1.0 بسیار ذهنی است
TextBlob همچنین ویژگی های دیگری مانند:
- برچسب گذاری بخشی از گفتار
- استخراج عبارت اسمی
مثال
بیایید یک تابع به نام تعریف کنیم polarity_subjectivity
که دو استدلال را می پذیرد.
تابع استفاده می کند TextBlob
به ارائه شده text
اگر print_results
= درست است، قطبیت و ذهنیت متن otherM را چاپ می کند
چند عدد از مقادیر شناور را برمیگرداند که 1 قطبیت و 2 موضوع ذهنیت است
می توانید نصب کنید TextBlob
استفاده كردن
!pip install textblob
#import TextBlob
from textblob import TextBlob
def polarity_subjectivity(text = sample, print_results = False):
# create an instance of TextBlob
tb= TextBlob(text)
# if condition is metm print the results
if print_results:
print(f"Polarity is {round(tb.sentiment[0], 2)} : Subjectivity {round(tb.sentiment[1], 2)}")
else:
return (tb.sentiment[0], tb.sentiment[1])
# Test the function
polarity_subjectivity(sample, print_results = True)
خروجی
نتایج نشان میدهد که نمونه ما دارای قطبیت مثبت خفیف است و فکر نسبتاً ذهنی است نه در درجه بالایی.
بیایید یک تابع تعریف کنیم token_count
که رشته ای را می پذیرد و استفاده می کند nltk's word_tokenizer
،
تعداد صحیحی از نشانه ها را در رشته داده شده برمی گرداند
سپس یک تابع دیگر تعریف کنید series_tokens
که یک سری پانداها را به عنوان آرگومان می پذیرد
و تابع را اعمال می کندtoken_count
به سری داده شده
از تابع دوم در 10 ردیف بالای دیتافریم استفاده کنید
# import libraries
from nltk import word_tokenize
# Define the first function that counts the number of tokens in a given string
def token_count(string):
return (len(word_tokenize(string)))
# Define the second function that applies the token_count funnction to a given Pandas series
def series_tokens(series):
return series.apply(token_count)
# Apply the function to the top 10 rows of the data frame
series_tokens(df.text.head(10))
خروجی
بیایید یک تابع به نام تعریف کنیم series_polarity_subjectivity
که اعمال می شود polarity_subjectivity
تابعی که قبلا تعریف کردیم
# define the function
def series_polarity_subjectivity(series):
return series.apply(polarity_subjectivity)
# apply to the top 10 rows of df['text']
series_polarity_subjectivity(df['text'].head(10))
خروجی
اندازه گیری پیچیدگی – تنوع واژگانی
تنوع واژگانی به تنوع کلماتی که در یک نوشتار یا گفتار استفاده می شود اشاره دارد.
این معیار اندازه گیری تعداد دفعات استفاده از کلمات مختلف در یک متن یا گفتار معین است و اغلب به عنوان شاخصی از غنا و پیچیدگی واژگان استفاده می شود.
بنابراین تعداد توکن های منحصر به فرد را بر تعداد کل توکن ها تعریف می کند.
مثال
بیایید a را تعریف کنیم complexity
تابعی که رشته ای را به عنوان آرگومان می پذیرد و امتیاز پیچیدگی واژگانی تعریف شده به عنوان تعداد نشانه های منحصر به فرد از تعداد کل نشانه ها را برمی گرداند.
def complexity(string):
# create a list of all tokens
total_tokens = nltk.word_tokenize(string)
# create a set of words(It keeps only unique values)
unique_tokens = set(total_tokens)
# Return the complexity measure
if len(total_tokens) > 0:
return len(unique_tokens) / len(total_tokens)
# apply the function to top 10 rows
df.text.head(10).apply(complexity)
خروجی
برخی از بینش های جالب ردیف در نمایه 3 و 4 دارای بیشترین تنوع واژگانی هستند. تمام نشانه های موجود در آنها کاملا منحصر به فرد هستند.
پاکسازی متن – کلمات توقف و غیر الفبایی
این مرحله تضمین میکند که دادههای متنی در یک قالب ثابت هستند و نویز را حذف میکند.
اطلاعات نامربوط و سایر تناقضات
برخی از تکنیک های پاکسازی متن:
- حروف کوچک
- توکن سازی
- حذف کلید واژه
- حذف علائم نگارشی
- ریشه زایی و لماتی سازی
- حذف URL ها و اشاره ها
- حذف ایموجی ها و احساسات
مثال
#import the library
from nltk.corpus imort stopwords
# Select only English stopwords
english_stop_words = stopwords.words('english')
# print the first 20
print(english_stop_words[:20])
بیایید به یک مثال برای حذف غیر الفبایی نگاه کنیم
استفاده خواهیم کرد isalpha
string_1 = "Crite_Jes.cd"
string_2 = "a quick dog"
string_2 = "We are good!"
print(f"String_1: {string_1.isalpha()}\n")
print(f"String_1: {string_2.isalpha()}\n")
print(f"String_1: {string_3.isalpha()}\n")
خروجی