С увеличением объема текстовых данных, доступных в Интернете, анализ настроений становится более полезным, чем когда-либо прежде, и организации, которые могут использовать возможности анализа настроений, скорее всего, получат конкурентное преимущество.

Проще говоря, анализ настроений включает в себя чувства — счастливые, грустные, нейтральные и т. д. Таким образом, конечной целью анализа настроений является декодирование основной эмоции, настроения или настроения текста.

В этой статье мы сосредоточимся на анализе настроений в отношении данных Twitter, связанных с COVID-19. В объем этой статьи входит знакомство с анализом настроений, выполнение предварительной обработки текста, выполнение извлечения признаков и классификация текста с использованием простой модели логистической регрессии. Идея состоит в том, чтобы помочь вам начать работу с анализом настроений и предоставить вам основные концепции и инструменты для анализа текстов, таких как комментарии, твиты и обзоры продуктов, для получения информации от аудитории.

Оглавление

  1. Введение в классификацию анализа настроений
  2. Типы классификации анализа настроений
  3. Предварительная обработка текстовых данных
  4. Извлечение признаков
  5. Тренировочные модели
  6. Метрики оценки
  7. Заключение

Остановимся на каждой теме подробнее:

Введение в классификацию анализа настроений

Анализ настроений, также известный как анализ мнений, является вариантом использования обработки естественного языка (NLP) и относится к категории классификации текста. Он включает в себя использование методов НЛП для выявления и извлечения соответствующей информации из текстовых данных и присвоения ее положительной, отрицательной или нейтральной категории настроения.

Анализ настроений полезен для организаций, чтобы понять, как клиенты воспринимают их продукты и услуги, и принимать обоснованные решения на основе полученной информации.

Например, представьте, что вы владелец ресторана и недавно добавили в свое меню новое блюдо. Вы рекламировали его на своем сайте, и многие заказывали его, а также давали много отзывов. Вы можете понять общее отношение ваших клиентов к новому блюду, используя инструменты анализа настроений для анализа текстовых данных их отзывов, что, в свою очередь, поможет вам предпринять необходимые шаги для поддержания удовлетворенности клиентов и сохранения конкурентоспособности.

Типы классификации анализа настроений

Существует два основных метода классификации анализа настроений:

1. Метод на основе правил. Метод на основе правил — это практический подход к анализу текста без обучения или использования моделей машинного обучения. Он включает в себя использование набора предопределенных правил и шаблонов для определения тональности данного текста.

Рассмотрим следующий сценарий: вы анализируете отзывы клиентов о своем новом ресторане и хотите классифицировать каждый отзыв как положительный, отрицательный или нейтральный. Алгоритм может быть:

я. Определите три класса настроений: положительное, отрицательное и нейтральное.

II. Составьте список эмоциональных слов и фраз, которые могут выражать определенное настроение. Например: слова с положительным настроением могут быть восхитительными, великолепными, удивительными и замечательными, слова с отрицательным настроением могут быть разочаровывающими, ужасными, ужасными и плохими, а слова с нейтральным настроением могут быть средними, нормальными и приличными.

III. Разработайте правила и шаблоны для определения тональности данного отзыва. Например, если отзыв содержит большое количество положительных слов, классифицируйте его как положительный.

IV. Назначьте оценку каждому слову тональности в зависимости от силы его тональности и используйте ее для расчета общей оценки тональности для обзора. Слово с негативным настроением, такое как «разочаровывает», может получить -1 балл, слово с положительным настроением, такое как «удивительно», может получить +1 балл, а слово с нейтральным настроением, такое как «хорошо», может получить 0 баллов.

v. Протестируйте алгоритм на наборе выборочных обзоров и при необходимости уточните правила и шаблоны для повышения точности. Пример: допустим, у нас есть следующий отзыв клиента: «Макароны были в порядке, но обслуживание разочаровало». Исходя из нашего алгоритма, мы бы:

  • Определите «разочаровывает» как слово с негативным настроением (-1 балл) и определите «хорошо» как слово с нейтральным настроением (0 баллов).
  • Рассчитайте общую оценку тональности -1 для отзыва.
  • Классифицировать отзыв как отрицательный.

В этом примере алгоритм правильно классифицирует отзыв как отрицательный, основываясь на наличии отрицательного слова «разочарование».

Важно отметить, что, хотя метод, основанный на правилах, может быть полезным подходом для определенных приложений, методы, основанные на машинном обучении, обычно считаются более эффективными для задач классификации анализа тональности, поскольку они могут адаптироваться к новым данным и учиться на них. , делая их более гибкими и адаптируемыми.

2. На основе машинного обучения:

Метод на основе машинного обучения – это метод классификации настроений, который автоматически распределяет текст по категориям положительных, отрицательных или нейтральных настроений с помощью алгоритмов машинного обучения. Этот метод включает в себя обучение модели на размеченном тексте и соответствующих метках тональности, а затем использование обученной модели для прогнозирования тональности нового немаркированного текста.

Допустим, у вас есть 5000 отзывов клиентов о новом блюде в вашем меню, и каждый отзыв имеет звездный рейтинг и письменный отзыв. По сути, вы собираетесь научить компьютер учиться на этих отмеченных отзывах, чтобы он мог классифицировать новые обзоры на основе их настроений.

Но прежде чем вы это сделаете, вы должны превратить этот неструктурированный текст во что-то, что сможет понять компьютер. Это означает, что вы должны придумать некоторые функции, которые можно измерить. Теперь я знаю, что это может показаться сложным, но не волнуйтесь — мы разберем это шаг за шагом! И к концу этой статьи вы сможете обучить свою собственную модель классификации настроений, как профессионал.

В этой статье мы сосредоточимся на подходе, основанном на машинном обучении. Набор данных, который мы будем использовать, можно получить на Kaggle. Он содержит твиты от разных пользователей со всего мира, обсуждающих COVID-19, включая их мысли, опыт и мнения. Он имеет 6 столбцов — UserName, ScreenName, Location, Tweeted At, OriginalTweet и Sentiment, но мы сосредоточимся на столбце OriginalTweet и Sentiment. Столбец OriginalTweet содержит текст твита, который мы будем использовать для анализа тональности. Столбец Настроение содержит метки для каждого твита как Положительный, Отрицательный или Нейтральный, которые мы будем использовать для обучения и оценки нашей модели машинного обучения.

Предварительная обработка текстовых данных

Предварительная обработка данных — самый важный шаг для любой модели машинного обучения. То, насколько хорошо необработанные данные были очищены и предварительно обработаны, играет важную роль в производительности модели. Точно так же и в случае с анализом настроений самым первым шагом является предварительная обработка текста. Предварительная обработка текста включает в себя очистку и преобразование текстовых данных, чтобы сделать их пригодными для анализа.

Чтобы предварительно обработать наши текстовые данные для анализа настроений, мы выполним следующие шаги:

  • Удаление всех HTML-ссылок, чисел, URL-адресов, хэштегов и знаков препинания.
  • Все символы в нижнем регистре, чтобы одно и то же слово не воспринималось по-разному из-за разного регистра.
  • Разделение текстов на более мелкие единицы, которые могут быть словами, фразами или предложениями.
  • Удаление всех стоп-слов, которые являются частью грамматики языка, но не придают смысла предложениям.
  • Определение корней и лемматизация для приведения слов к их базовой форме.

Чтобы предварительно обработать наш набор данных, давайте поместим все эти шаги в функцию. Но перед этим мы должны загрузить набор данных. Набор данных был разделен на обучающий и тестовый наборы. Как я упоминал ранее, мы сосредоточимся на двух столбцах — OrignalTweet и Sentiment.

Давайте загрузим набор данных с этими двумя столбцами, используя pandas.

import pandas as pd
# Load the train dataset into a pandas DataFrame
train_df = pd.read_csv('Corona_NLP_train.csv', encoding = 'latin-1', 
                       usecols = ['OriginalTweet', 'Sentiment'])

# Load the test dataset into a pandas DataFrame
test_df = pd.read_csv('Corona_NLP_test.csv',
                         usecols = ['OriginalTweet', 'Sentiment'])

Распечатаем содержимое первого твита в столбце твитов обучающей выборки.

# Print first tweet in training set
print(train_df['OriginalTweet'][0])#import csv

Как мы видим, столбец твитов в нашем наборе данных содержит нерелевантную информацию, такую ​​как упоминания и ссылки, которые потенциально могут повлиять на точность нашей модели машинного обучения. Поэтому предварительная обработка текста является важным шагом в подготовке наших данных.

Для этого мы напишем функцию, которая берет необработанные твиты в столбце OriginalTweet и возвращает список очищенных твитов, применяя все описанные выше шаги.

import re
import nltk
import string
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer, WordNetLemmatizer

# Define regular expressions to match patterns in the tweet
html_regex = re.compile('<.*?>')
number_regex = re.compile('\d+')
url_regex = re.compile('https?://\S+')
hashtag_regex = re.compile('#\w+')
# Define a string of all punctuation characters
punctuations = string.punctuation
# Define a list of stop words to remove
stop_words = set(stopwords.words('english'))
# Define an instance of the PorterStemmer
stemmer = PorterStemmer()
# Define an instance of the WordNetLemmatizer
lemmatizer = WordNetLemmatizer()

# Define a function to preprocess the tweets column
def preprocess_tweet(tweet):
    # Remove HTML links from the tweet
    tweet = re.sub(html_regex, '', tweet)
    
    # Remove numbers from the tweet
    tweet = re.sub(number_regex, '', tweet)
    
    # Remove URLs from the tweet
    tweet = re.sub(url_regex, '', tweet)
    
    # Remove hashtags from the tweet
    tweet = re.sub(hashtag_regex, '', tweet)
    
    # Remove punctuation from the tweet
    tweet = ''.join(char for char in tweet if char not in punctuations)
    
    # Convert the tweet to lowercase
    tweet = tweet.lower()
    
    # Tokenize the tweet into individual words
    words = word_tokenize(tweet)
    
    # Remove stop words from the tweet
    filtered_words = [word for word in words if word not in stop_words]
    
    # Apply stemming to the filtered words
    stemmed_words = [stemmer.stem(word) for word in filtered_words]
    
    # Apply lemmatization to the stemmed words
    lemmatized_words = [lemmatizer.lemmatize(word) for word in stemmed_words]
    
    # Join the lemmatized words back into a single string
    preprocessed_tweet = ' '.join(lemmatized_words)
    
    # Remove extra white spaces from the preprocessed tweet
    preprocessed_tweet = re.sub('\s+', ' ', preprocessed_tweet).strip()
    
    return preprocessed_tweet

Приведенная выше функция использует регулярные выражения для сопоставления шаблонов в твите и библиотеку NLTK для удаления стоп-слов, токенизации, основы и лемматизации текста.

Мы можем применить эту функцию как к тренировочному, так и к тестовому наборам, чтобы очистить их. Очищенные твиты можно сохранить в новом столбце «CleanedTweet».

train_df_1 = train_df.copy()
test_df_1 = test_df.copy()

train_df_1['CleanedTweet'] = train_df_1['OriginalTweet'].apply(lambda text:preprocess_tweet(text))
test_df_1['CleanedTweet'] = test_df_1['OriginalTweet'].apply(lambda text:preprocess_tweet(text))

print("The tweet before cleaning is: ")
print(train_df_1['OriginalTweet'][3])
print()
print()
print("The tweet after cleaning is: ")
print(train_df_1['CleanedTweet'][3])

Ура! Из твита удалены хештеги, знаки препинания, URL. В целом, этап предварительной обработки текста необходим для подготовки текстовых данных для анализа тональности и повышения эффективности и точности анализа.

Извлечение признаков

Следующим шагом после предварительной обработки текстовых данных является извлечение признаков. Извлечение функций включает в себя идентификацию и извлечение соответствующих функций из текстовых данных, которые можно использовать для обучения нашей модели машинного обучения.

Существует несколько методов извлечения признаков при обработке естественного языка. Вот некоторые из этих методов:

  • Bag of Words (BoW). BoW — это метод, который представляет текстовые данные в виде вектора частоты слов. BoW подсчитывает частоту каждого слова, чтобы определить важные слова или фразы в тексте.
  • Внедрение слов — Вложение слов сопоставляет слова в векторном пространстве, где похожие слова расположены близко друг к другу.
  • Метод Term Frequency-Inverse Document Frequency (TF-IDF) — TF-IDF присваивает веса словам в текстовых данных на основе их частоты и важности. Учитывается частота слова в документе (частота термина) и частота слова во всем корпусе (обратная частота документа). Это позволяет нам идентифицировать важные слова или фразы в тексте.

Мы будем использовать метод TF-IDF для извлечения функций из наших данных твитов.

Давайте начнем с загрузки предварительно обработанного набора данных, который включает в себя столбец очищенных твитов. Затем мы можем токенизировать твиты с помощью функции CountVectorizer, которая преобразует текстовые данные в матрицу количества слов.

X_train = train_df_1['CleanedTweet'].values
X_test = test_df_1['CleanedTweet'].values

# tokenize the tweets using CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
clf = CountVectorizer()
X_train_cv = clf.fit_transform(X_train)
X_test_cv = clf.transform(X_test)

Затем мы можем создать версии TF-IDF токенизированных твитов, используя функцию TfidfTransformer. Это применяет веса TF-IDF к матрице количества слов, что дает нам новую матрицу весов TF-IDF.

# create the TF-IDF versions of the tokenized tweets
tf_transformer = TfidfTransformer(use_idf=True).fit(X_train_cv)

X_train_tf = tf_transformer.transform(X_train_cv)
X_test_tf = tf_transformer.transform(X_test_cv)

print(X_train_tf[0:2])

Теперь у нас есть матрица весов TF-IDF для каждого твита в наборе данных, которую мы можем использовать в качестве признаков для нашей модели машинного обучения.

Эти функции помогут модели определить важные слова или фразы в тексте, связанные с положительным или отрицательным настроением. Выбрав наиболее информативные функции, мы можем повысить точность нашей модели анализа настроений.

Тренировочные модели

Модели машинного обучения обучаются на размеченных данных, чтобы прогнозировать категории тональности для новых текстовых данных. Некоторые популярные алгоритмы машинного обучения для анализа тональности включают Наивный байесовский метод, метод опорных векторов (SVM) и модели глубокого обучения, такие как рекуррентные нейронные сети (RNN) и сверточные нейронные сети (CNN). эм>

После предварительной обработки текстовых данных и извлечения соответствующих функций следующим шагом является обучение модели машинного обучения, которая может прогнозировать категории тональности новых текстовых данных. В этой статье мы будем использовать простую модель логистической регрессии.

Предварительная обработка целевого столбца так же важна, как и предварительная обработка входных текстовых данных. Поэтому перед обучением модели мы предварительно обработаем целевой столбец, чтобы убедиться, что наша модель машинного обучения понимает метки и может точно предсказывать настроение новых твитов. Для этого мы присвоим каждой категории уникальный номер — «Положительный» как 0, «Отрицательный» как 1 и «Нейтральный» как 2.

# Group Extremely Positive and Positive together, as well as Negative and Extremely Negative"
def classes_def(x):
    if x ==  "Extremely Positive":
        return "Positive"
    elif x == "Extremely Negative":
        return "Negative"
    elif x == "Negative":
        return "Negative"
    elif x ==  "Positive":
        return "Positive"
    else:
        return "Neutral"
train_df_1['Sentiment'] = train_df_1['Sentiment'].apply(lambda x:classes_def(x))
test_df_1['Sentiment'] = test_df_1['Sentiment'].apply(lambda x:classes_def(x))
# Encode training and test sets
y_train = train_df_1['Sentiment'].replace({'Positive' : 0, 'Negative' : 1, 'Neutral' : 2})
y_test = test_df_1['Sentiment'].replace({'Positive' : 0, 'Negative' : 1, 'Neutral' : 2})

Теперь давайте обучим модель, инициализировав экземпляр класса LogisticRegression и подгоняя его к предварительно обработанным и преобразованным обучающим данным с помощью метода fit.

# Initialize instance of the LogisticRegression model
lr_model = LogisticRegression()

# Fit model to preprocessed data
lr_model.fit(X_train_tf, y_train)

После того, как модель обучена, мы можем использовать ее для прогнозирования категорий тональности тестовых данных с помощью метода прогнозирования.

# Use the fit model to predict the sentiment categories of the test data
lr_pred = lr_model.predict(X_test_tf)

Метрики оценки

Чтобы оценить производительность нашей модели, мы будем использовать различные оценочные показатели, такие как точность, точность, полнота и оценка F1. Мы будем использовать точность в качестве нашей основной оценочной метрики, затем мы создадим матрицу путаницы и отчет о классификации, чтобы предоставить более подробную информацию о производительности модели.

# Evaluate model performance using confusion matrix
from sklearn.metrics import confusion matrix
import matplotlib.pyplot as plt
import seaborn as sns

cm = confusion_matrix(y_test, lr_pred, labels = [0,1,2])
plt.figure(figsize = (7,7))
sns.heatmap(cm, annot = True, fmt = 'g', cbar = False, cmap =
'Blues')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.xticks(ticks = [0.5, 1.5, 2.5],labels = ['Positive', 'Negative', 'Neutral'])
plt.yticks(ticks = [0.5, 1.5, 2.5],labels = ['Positive', 'Negative', 'Neutral'])
plt.title('Logistic Regression Model', fontsize = 15, fontweight = 'bold')

# Evaluate model performance using classification_report
from sklearn.metrics import classification_report

clr = classification_report(y_test, lr_pred, labels = [0,1,2], 
target_names = ['Positive', 'Negative', 'Neutral'])
print('Classification Report \n', clr)

Наша модель логистической регрессии достигла общей точности 78%. Показатель F1 для положительных и отрицательных эмоций составил 81% и 80% соответственно, что является относительно хорошим показателем. Однако оценка F1 для нейтрального класса была ниже и составила 67%, что указывает на то, что наша модель может испытывать трудности с правильным прогнозированием этого класса. Тем не менее, производительность модели неплохая, и дальнейшая тонкая настройка потенциально может повысить ее точность.

Чтобы повысить точность нейтрального класса, вы можете сбалансировать набор данных, чтобы устранить смещение в сторону большинства классов, и использовать модель, которая может лучше изучать последовательности, например LSTM. Балансировка набора данных гарантирует, что модель обучается на равном количестве примеров из каждого класса, уменьшая смещение в сторону большинства классов. Использование такой модели, как LSTM, которая может лучше изучать последовательности, может улучшить способность модели фиксировать контекст и зависимости между словами в тексте, тем самым повышая ее точность.

В целом, производительность модели логистической регрессии неплохая, и дальнейшая точная настройка потенциально может повысить ее точность.

Заключение

Анализ тональности — ценный инструмент для понимания и анализа тональности текстовых данных. Однако он сталкивается с некоторыми проблемами, такими как обработка сарказма, работа с субъективным языком и управление языковыми нюансами, которые могут повлиять на точность и затруднить получение надежных результатов.

Чтобы решить эти проблемы и повысить точность вашей модели, важно применять лучшие практики, такие как использование высококачественных данных, выполнение перекрестной проверки во избежание переобучения, а также постоянный мониторинг и улучшение производительности модели.

Подводя итог, некоторые основные выводы из статьи включают в себя:

  1. Классификация анализа настроений включает выявление и классификацию настроений, выраженных в текстовых данных.
  2. Существуют различные типы методов классификации анализа настроений, включая методы, основанные на правилах, и методы, основанные на машинном обучении.
  3. Текстовые данные должны быть очищены и предварительно обработаны перед использованием для классификации анализа тональности. Это включает в себя удаление стоп-слов, выделение слов или лемматизацию слов, а также преобразование текста в числовые характеристики с использованием таких методов, как TF-IDF.
  4. Создание эффективной модели машинного обучения для классификации анализа настроений требует выбора соответствующего алгоритма, настройки гиперпараметров и оценки производительности модели с использованием таких показателей, как точность, отзыв, точность и F1-оценка.
  5. Непрерывный мониторинг и совершенствование модели классификации анализа тональности необходимы для обеспечения ее точности и актуальности с течением времени. Этого можно достичь путем включения новых данных, настройки гиперпараметров модели и использования передовых методов, таких как глубокое обучение.

В заключение можно сказать, что анализ тональности — это мощный инструмент для организаций, позволяющий получить представление о мнениях и отзывах клиентов, а Python предоставляет несколько библиотек и фреймворков для реализации анализа тональности. Я надеюсь, что это руководство поможет вам начать работу с классификацией анализа настроений!