برنامه نویسی

تجزیه و تحلیل احساسات – انجمن 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)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

freqDist

این نتایج در نهایت منطقی است:

  • یک کاما، 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)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

def freqdist

ماتریس سند – مدت

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

ما می توانیم این را با 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())
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

dtm

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

اهمیت ویژگی

به میزانی اشاره دارد که یک ویژگی/متغیر خاص به آن کمک می کند
پیش‌بینی یا طبقه‌بندی در تحلیل احساسات

روش های مختلفی وجود دارد که می توان برای تعیین اهمیت ویژگی استفاده کرد:

  • الگوریتم های یادگیری ماشینی به عنوان مثال درختان تصمیم و جنگل های تصادفی
  • روش های آماری به عنوان مثال تحلیل همبستگی یا رگرسیون

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

مثال
ما یک تابع “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)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

pol_sub

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

بیایید یک تابع تعریف کنیم 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))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

سری pol

بیایید یک تابع به نام تعریف کنیم 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")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

الفبای پاک

نوشته های مشابه

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

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

دکمه بازگشت به بالا