Почему этот пост?

Блех, еще одно дело для моего профиля! Не-не, анализатор настроений технически намного сложнее того, что мы собираемся реализовать, но зачем нам анализировать настроения? Короче

  • Оценивать общественное мнение
  • Помогите предприятиям и организациям принимать обоснованные решения на основе отзывов клиентов (иногда и сотрудников)
  • Оперативно реагируйте на проблемы или жалобы клиентов.
  • Измеряйте успех их маркетинговых кампаний или запусков продуктов.
  • Управление репутацией и многое другое.

Посмотрите мою модель здесь

Как модель анализирует текст (следовательно, тональность)?

Модель 1: Вейдер

  • Подход, основанный на лексиконе: VADER (Valence Aware Dictionary и sEntiment Reasoner) использует предварительно созданный лексикон (словарь), который содержит большое количество слов и связанных с ними оценок тональности. Каждому слову в лексиконе присваивается оценка полярности (положительная, отрицательная или нейтральная) и оценка интенсивности (насколько сильно слово передает настроение).

Пример:

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

Глядя на партитуру (словарь) «Я люблю кино»

|  Word | Polarity | Intensity |
|:-----:|:--------:|:---------:|
| I     | 0        | 0.9       |
| Love  | +1       | 4         |
| a     | 0        | 1.2       |
| movie | 0        | 1.3       |

Определение дает формулу типа Norm(∑(Polarity.Intensity)) , при использовании для приведенной выше таблицы оценка тональности получается как 1 {(0x0,9 + 1,4 + 0x1,2 + 0x1.3)/4}, но действительно ли это 1?

Нет, как видно выше (вы можете попробовать мой развернутый код здесь), оценка меньше 1, но почему?

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

  1. Контекстная валентность: VADER учитывает контекстуальную валентность слов, то есть учитывает влияние модификаторов, которые могут изменить тональность слова. Например, он признает, что ощущение «хорошего» в «нехорошем» отрицается.
  2. Пунктуация и использование заглавных букв: VADER считает пунктуацию и использование заглавных букв ценной информацией для анализа настроений. Восклицательные знаки, например, могут усилить настроение.
  3. Обработка смайликов, сленга и выделения: VADER предназначен для обработки смайликов, сленга и слов с выделением (например, с использованием всех заглавных букв). Он понимает, что эти элементы могут передавать настроение, и соответствующим образом корректирует свой анализ.
  4. Изменение валентности: VADER учитывает эффект модификаторов, которые могут изменить валентность (настроение) слова. Например, такие слова, как «не» или «но», могут изменить смысл следующего слова. Это изменение валентности реализуется с помощью набора грамматических правил и эвристик.

Итак, почти точная формула (зависит и от версии, и от реализации!) выглядит так.

В этой формуле:

  • valence_scores представляют оценки тональности отдельных слов/фраз из лексикона тональности.
  • valence_modifiers представляют оценки тональности модификаторов (например, слов отрицания), которые могут изменить тональность.
  • alpha — константа нормализации.

Чтобы узнать больше о VADER, нажмите на ссылку для скачивания здесь

КОД: ВЕЙДЕР

import nltk
from nltk.sentiment import SentimentIntensityAnalyzer

nltk.download('vader_lexicon')
sia = nltk.sentiment.SentimentIntensityAnalyzer()

# function to use VADER
def sentiment_analyzer(text, model_name):
  positive_score = 0.0
  negative_score = 0.0
  if model_name == "Vader":
      sentiment_score = sia.polarity_scores(text)
      positive_score = sentiment_score['pos']
      negative_score = sentiment_score['neg']
   # use neutral_score = sentiment_score['neu'] for neutral
   # use compound_score = sentiment_score['compound'] for compound score
 return positive_score, negative_score

Почему VADER не лучший?

  1. Доверие к лексикону: VADER в значительной степени полагается на предварительно созданный лексикон настроений, который может не охватывать все лингвистические нюансы. Например, он может бороться со сленгом или контекстно-зависимыми настроениями, такими как «Netflix и расслабься», что имеет значение, отличное от его буквальной интерпретации.
  2. Отсутствие обучения: VADER не проходит обучение по конкретным наборам данных, что ограничивает его способность адаптироваться к различным предметным областям. Например, он может неточно отражать настроение в текстах, относящихся к предметной области, таких как медицинские или юридические документы.
  3. Бинарная классификация настроений: VADER классифицирует настроения как положительные, отрицательные или нейтральные, без более точной детализации. Например, он может классифицировать «Мне нравится этот продукт, но он мог бы быть лучше» как нейтральный, игнорируя выраженные смешанные чувства.
  4. Контекстуальное понимание: хотя VADER учитывает некоторую контекстуальную валентность, он может столкнуться со сложными лингвистическими структурами. Например, он может не понять сарказма в таких фразах, как «О, отлично, еще одна встреча».
  5. Ограниченный объем: VADER фокусируется в первую очередь на анализе настроений, пренебрегая другими аспектами, такими как распознавание сущностей или анализ настроений на основе аспектов. Следовательно, он не может обеспечить всесторонний анализ текста.

Модель 2: Трансформеры

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

  1. Предварительное обучение: Преобразователи предварительно обучаются на больших наборах текстовых данных с использованием неконтролируемого обучения (без помеченных данных при обучении). Этот шаг помогает им изучить общие языковые представления и уловить семантические отношения между словами.
  2. Точная настройка: после предварительной подготовки модель преобразователя можно точно настроить для задач анализа тональности с использованием помеченных наборов данных. На этом шаге параметры модели настраиваются так, чтобы они специализировались на шаблонах и функциях, связанных с настроениями.
  3. Кодирование входных данных: текстовые входы токенизируются, преобразуя их в числовые представления, называемые токенами. Преобразователи могут обрабатывать входные последовательности переменной длины и кодировать каждый токен вместе с информацией о его положении.
  4. Уровни трансформатора: входные токены обрабатываются через несколько уровней нейронных сетей самообслуживания и прямой связи в архитектуре преобразователя. Механизмы внутреннего внимания позволяют модели сосредотачиваться на различных частях входной последовательности в зависимости от их релевантности друг другу.
  5. Классификация настроений: окончательное скрытое представление из слоев преобразователя передается в слой классификации настроений, такой как полностью подключенная нейронная сеть или слой softmax. Этот слой сопоставляет представление с метками настроений, такими как положительное, отрицательное или нейтральное.
  6. Обучение и оптимизация. Модель обучается на наборе данных анализа тональности с использованием таких методов, как обратное распространение ошибки и градиентный спуск, чтобы свести к минимуму разницу между прогнозируемыми и истинными метками тональности. Алгоритмы оптимизации, такие как Адам или стохастический градиентный спуск, используются для обновления параметров модели.
  7. Вывод: после обучения модель преобразователя можно использовать для анализа тональности новых, невидимых текстов. Модель обрабатывает входной текст через слои преобразователя, а слой классификации тональности предоставляет прогнозируемую метку тональности.

В качестве резюме диаграммы:

КОД: Трансформеры

from transformers import AutoTokenizer
from transformers import AutoModelForSequenceClassification

def sentiment_analyzer(text, model_name):
    # Check if the model name is "RoBERTa"
    if model_name == "RoBERTa": #Robustly Optimized BERT approach
    #BERT: Bidirectional encoded representation of Transformer
        # Define the pre-trained model and tokenizer
        MODEL = f"cardiffnlp/twitter-roberta-base-sentiment"
        tokenizer = AutoTokenizer.from_pretrained(MODEL)
        model = AutoModelForSequenceClassification.from_pretrained(MODEL)

        # Encode the input text using the tokenizer
        encoded_text = tokenizer(text, return_tensors='pt')

        # Pass the encoded text through the model
        output = model(**encoded_text)

        # Detach the output from the computation graph and convert it to a numpy array
        scores = output[0][0].detach().numpy()

        # Apply softmax function to the scores to get probabilities
        scores = softmax(scores)

        # Create a dictionary to store the scores for each sentiment label
        scores_dict = {
            'roberta_neg': scores[0],
            'roberta_neu': scores[1],
            'roberta_pos': scores[2]
        }

        # Extract the positive and negative scores from the probabilities
        positive_score = float(scores[2])
        negative_score = float(scores[0])

    # Return the positive and negative scores
    return positive_score, negative_score

Почему Трансформер лучше?

  1. Контекстуальное понимание: трансформеры превосходно понимают контекст, в котором появляются слова или фразы. Для анализа тональности это означает, что они могут фиксировать влияние окружающих слов на тональность определенного слова или фразы. Например, в предложении «Фильм нехороший» трансформеры могут распознать, что «не» сводит на нет ощущение «хорошего», и соответствующим образом скорректировать общее настроение.
  2. Дальние зависимости: преобразователи могут эффективно моделировать зависимости между словами или фразами, которые находятся далеко друг от друга в предложении. Это имеет решающее значение для анализа настроений, поскольку на настроения могут влиять слова, появляющиеся в тексте раньше или позже. Например, фраза «Я люблю фильм» действительно очень положительна, но ВЕЙДЕР поставил оценку ~0,6. Посмотрите, что делает Transformer (например, RoBERTa), он дал очень положительную оценку «Я люблю кино». Как упоминалось ранее, RoBERTa здесь лучше.

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

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

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

Развертывание

Мы будем использовать Gradio для развертывания нашей модели.

import gradio as gr  # Importing the gradio library

# Creating a text input box with 15 lines and a label
input_text = gr.inputs.Textbox(lines=15, label="Input Text")  

# Creating a radio button input to choose between "Vader" and "RoBERTa" sentiment analyzers
sentiment_model = gr.inputs.Radio(["Vader", "RoBERTa"], label="Choose Sentiment Analyzer")  
outputs = [gr.Slider(minimum=0, maximum=1, step=0.01, label="Positive Sentiment"),  # Creating a slider output for positive sentiment
           gr.Slider(minimum=0, maximum=1, step=0.01, label="Negative Sentiment")]  # Creating a slider output for negative sentiment

# Creating a gradio interface with the sentiment_analyzer function as the main function, input_text and sentiment_model as inputs, and outputs as output components
iface = gr.Interface(fn=sentiment_analyzer, inputs=[input_text, sentiment_model], outputs=outputs)  
iface.launch(inline=False)  
# Launching the gradio interface in a separate browser window

Заключение

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