Введение

Мы живем в эпоху революции, когда основное внимание уделяется интеллектуальным машинам, способным понимать людей и взаимодействовать с ними. Фактически, в нашей повседневной жизни мы тесно связаны с голосовыми помощниками, чат-ботами и машинным переводом, а также с различными популярными приложениями NLP (обработки естественного языка),отрасли ИИ. (искусственный интеллект). И, конечно же, Анализ настроений — это наиболее часто используемая область применения, основанная на концепции НЛП. Звучит интересно! Итак, если вы новичок. Давайте начнем.

Обратите внимание, что читатели должны быть знакомы со средой написания кода Python и обладать базовыми знаниями о том, как работают модели машинного обучения (с учителем или без учителя).

Что за шумиха вокруг анализа настроений?

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

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

Вы можете использовать результаты анализа настроений в следующей области бизнеса.

  1. Мониторинг бренда
  2. Исследование рынка
  3. Анализ отзывов
  4. Мониторинг социальных сетей
  5. Накопление бизнес-аналитики и т. д.

Но зачем нам предварительно обученные модели?

Живя в век цифровых технологий, мы с вами повсюду оставляем цифровые следы. Каждую секунду генерируется большой объем данных. Допустим, вы собрали миллионы отзывов. Сколько времени вы ожидаете у человека, который читает каждый введенный текст и резюмирует его с настроением? Даже если вы делегируете это нескольким людям, всегда будет какая-то предвзятость, основанная на человеческом суждении. Если я говорю о технических ограничениях, вы знаете, что вам нужно сначала обучить любую модель машинного обучения с учителем на размеченных данных, чтобы генерировать прогнозы, и для вашей машины может быть слишком дорого строить модели НЛП с нуля.

Итак, если вы новичок и у вас мало времени и ресурсов, вы все равно можете начать свое путешествие по анализу настроений с помощью предварительно обученных моделей НЛП. Доступно множество предварительно обученных моделей, которые можно настроить на основе ваших данных и целей анализа. Мы будем использовать коды Python для работы с двумя из множества доступных предварительно обученных моделей: Vader Lexicon и Flair. .

Постановка задачи

Мы наблюдаем огромный скачок в онлайн-сервисах доставки почти во всех секторах, и в последнее время онлайн-доставка еды стала новой вещью. Covid также вынудил этих общительных людей оставаться дома и заказывать онлайн. Но может быть много других причин, по которым люди предпочитают или не предпочитают онлайн-доставку еды. Поэтому, чтобы понять человеческий опыт онлайн-доставки еды и получить полезную информацию, был проведен опрос. Вы можете получить доступ к этим данным на Kaggle здесь. Здесь мы будем использовать столбец с произвольным текстом — Отзыв и генерировать настроения для каждого собранного отзыва с помощью приведенного ниже пошагового подхода:

  1. Импорт необходимых библиотек и модулей Python
  2. Импорт данных
  3. Исследование данных
  4. Очистка данных
  5. Запустите модель и создайте настроение

1. Импортировать библиотеки

import re
import string
import numpy as np
import pandas as pd
import nltk
nltk.download('wordnet')
nltk.download('stopwords')
from nltk.corpus import stopwords
from nltk.tokenize import WordPunctTokenizer
from nltk.stem.wordnet import WordNetLemmatizer
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")

2. Импорт данных

path = r"G:\Data Science\Blog"
text_data = pd.read_csv(path+'\\'+'data.csv')
text_data.head(2)

3. Исследование данных

Данные содержат в общей сложности 55 переменных, включая непрерывные, категориальные и текстовые поля. Тональность будет генерироваться на данных произвольного текста, поэтому мы извлекли обзоры из остального набора данных и преобразовали все текстовые данные в нижний регистр, потому что Python — язык с учетом регистра (в противном случае он будет интерпретировать NIL, Nil, nil; все как разные входы)

# Extracting reviews from data
reviews = []
reviews = pd.DataFrame(text_data.iloc[:, -1], index = text_data.index)
reviews['Reviews'] = reviews['Reviews'].str.lower() 
reviews.head()

Теперь мы выявим случаи, когда не было зафиксировано ни одного соответствующего отзыва. Это будет

  1. Все варианты ноль
  2. Все варианты буквы нет
  3. Все варианты без комментариев
  4. Только числовые данные в поле обзора

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

print(reviews[(reviews['Reviews'].str.contains("nil"))|(reviews['Reviews'] == 'no')
              |(reviews['Reviews'].str.contains("comment"))|(reviews['Reviews'].str.isnumeric())].shape)
reviews[(reviews['Reviews'].str.contains("nil"))|(reviews['Reviews'] == 'no')
        |(reviews['Reviews'].str.contains("comment"))|(reviews['Reviews'].str.isnumeric())].value_counts()

Как видим, таких случаев неактуальных отзывов, которые мы перечислили выше, всего 153. Например, 141 человек прокомментировал «ноль», 4 человека прокомментировали «ноль» с дополнительным пробелом, 4 человека прокомментировали «нет», 1 человек прокомментировал «без комментариев» и 1 человек прокомментировал «560075» (только числовой ввод). Все это не релевантные входы, поэтому мы их удалим.

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

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

# Filter out cases where no reviews received - i.e. cases where input is received as nill, no or no comment 
reviews = reviews[~(reviews['Reviews'].str.contains("nil"))]
reviews = reviews[~(reviews['Reviews'] == 'no')]
reviews = reviews[~(reviews['Reviews'].str.contains("comment"))]
# Remove repetition of words
pattern = re.compile("r(.)\1{2,}", re.DOTALL)
reviews['Reviews'] = reviews['Reviews'].str.replace(pattern, r"\1")
# Remove digits
reviews['Reviews'] = reviews['Reviews'].str.replace(r"\d+", '')
# Remove punctuation mark
reviews['Reviews'] = reviews['Reviews'].str.replace('[^\w\s]', '')
# Transform short form of negation words 
reviews['Reviews'] = reviews['Reviews'].str.replace(r"(can't|cannot)", "can not")
reviews['Reviews'] = reviews['Reviews'].str.replace(r"don't", "do not")
reviews['Reviews'] = reviews['Reviews'].str.replace(r"doesn't", "does not")
# Filter out blanks or null if any after data  & reset index
reviews['Reviews'] = reviews[~(reviews['Reviews'] == '')]
reviews =  reviews[reviews['Reviews'].notnull()]
reviews = reviews.reset_index(drop = True)
pd.set_option('display.max_colwidth', None)
reviews.head()

Теперь мы закончили со всеми данными и пришло время запустить модель анализа настроений, но перед этим давайте получим некоторое общее представление о том, как работают простейшие алгоритмы для анализа настроений. Если предложение состоит из семи ключевых слов, оно имеет семь признаков качества. Теперь каждому слову будет присвоена количественная оценка на основе его степени сравнения или словаря, основанного на правилах, и будет вычислена взвешенная оценка этих семи количественных оценок, которая будет общей оценкой утверждения. Положительный балл (> 0) обычно считается позитивным настроением, отрицательный балл (‹0) обычно считается негативным настроением, а балл 0 обычно считается нейтральным.

5. Запустите модель и создайте настроение

Пришло время протестировать нашу первую модель Vader_Lexicon.

Что такое лексикон Вейдера?

VADER (Valence Aware Dictionary and sEntiment Reasoner) — это инструмент для анализа настроений, основанный на лексике и правилах, специально настроенный на чувства, выраженные в социальных сетях (Источник — geeksforgeeks ).

Вывод Vader_Lexicon приводит к 4 категориям оценки,

  1. Положительный
  2. Отрицательный
  3. Нейтральный
  4. Сложный

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

nltk.download('vader_lexicon')
from nltk.sentiment.vader import SentimentIntensityAnalyzer
# Creating instance
analyzer = SentimentIntensityAnalyzer()
SA_VL = reviews.copy(deep = True)
SA_VL['Positive'] = [analyzer.polarity_scores(x)['pos'] for x in SA_VL['Reviews']]
SA_VL['Negative'] = [analyzer.polarity_scores(x)['neg'] for x in SA_VL['Reviews']]
SA_VL['Neutral'] = [analyzer.polarity_scores(x)['neu'] for x in SA_VL['Reviews']]
SA_VL['Compound'] = [analyzer.polarity_scores(x)['compound'] for x in SA_VL['Reviews']]
SA_VL['Positive'] = SA_VL['Positive'].round(2)*100
SA_VL['Negative'] = SA_VL['Negative'].round(2)*100
SA_VL['Neutral'] = SA_VL['Neutral'].round(2)*100
SA_VL['Compound'] = SA_VL['Compound'].round(2)*100
SA_VL.head()

# keeping only Compound score column, renaming it to Sentiment and assigning value based on score
SA_VL = SA_VL[['Reviews', 'Compound']]
SA_VL.rename({'Compound' : 'Sentiment'}, axis = 1, inplace = True)
SA_VL['Sentiment'] = SA_VL.apply(lambda x : 'Positive' if x['Sentiment']>0.0 
                                 else ('Negative' if x['Sentiment']<0.0 else 'Neutral'), axis = 1)
SA_VL.head()

Да, вот ты где. Вы успешно сгенерировали настроения с помощью vader_lexicon, и результат правдоподобен. TextBlob — еще одна предварительно обученная модель, которую можно использовать для анализа тональности. (Попробуйте)

Теперь пришло время попробовать другую модель — чутье.

Что такое талант?

Flair построен на платформе глубокого обучения Pytorch. Flair не является предварительно установленной библиотекой, поэтому вам необходимо сначала установить ее из терминала с помощью команды pip. Только версии Python › = 3.6 поддерживают Flair, но, несомненно, это одна из лучших библиотек для работы с любой задачей НЛП.

Flair имеет объект с именем Sentence, который представляет текстовые данные в виде токенов.

Сначала нам нужно импортировать TextClassifier, относящийся к предложению и языку, из flair.models. Здесь мы загрузили TextClassifier с английским корпусом, используя TextClassifier.load(‘en-sentiment’). Затем мы вызываем объект Sentence и инициируем TextClassifier для прогнозирования тональности.

Модель классификации текста здесь использует RNN (рекуррентную нейронную сеть) с встраиванием слов (которое представляет слова в векторе). пространство таким образом, чтобы слова с похожими значениями были ближе), чтобы получить реальную метку класса.

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

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

Ниже приведен код для того же самого.

from flair.data import Sentence
from flair.models import TextClassifier
classifier =TextClassifier.load('en-sentiment')
sentiment = []
score = []
for sample in reviews['Reviews']:
    if sample.strip() == "":
        sentiment.append("")
        score.append("")
    else :
        feedback = Sentence(sample)
        # Create instance
        classifier.predict(feedback)       
        sentiment.append(feedback.labels[0].value)
        score.append(round(feedback.labels[0].score, 2)*100)
        
reviews['Sentiment'] = sentiment
reviews['Score'] = score
pd.set_option('display.max_colwidth', None)
reviews.head()

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

Следующий шаг

Теперь вы сгенерировали настроения для собранных отзывов. Вы можете изучить оценку, связанную с каждым настроением, и быть уверенным в точности с высокими оценками, связанными с каждым настроением. Здесь мы зафиксировали 90% настроений с оценкой › 80, что отлично.

print(reviews.shape[0])
print("Proportion of sentiments with score > 80 : ", round((reviews[reviews['Score']>80].shape[0])/(reviews.shape[0]),2)*100)
reviews['Sentiment'].value_counts()

Мы можем наблюдать, что из 234 ответов 134 положительных и 100 отрицательных, что является примерно сбалансированным распределением настроений. Теперь мы знаем распределение настроений среди положительных и отрицательных ответов, но какие полезные выводы мы можем извлечь из этого?

Выполнение исследовательской аналитики с доступными данными

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

Создайте и обучите свою собственную модель

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

Примените кластеризацию, чтобы глубже изучить проблемную область

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

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

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

Заключение

Основные выводы из этой статьи:

  • Изучите возможности анализа настроений
  • Ознакомьтесь с предварительно обученными моделями
  • Исследование текстовых данных
  • Очистка и предварительная обработка текстов
  • Подробно изучите две предварительно обученные модели: Vader Lexicon и Flair.
  • Внедрите предварительно обученные модели с кодами Python для генерации настроений.

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