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

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

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

Основы анализа сентимента и эмоционального окраса текста

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

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

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

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

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

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

Использование SQL для простого анализа сентимента

Определение положительных, отрицательных и нейтральных текстов

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

CREATE TABLE TextSentiments (
    id INT PRIMARY KEY,
    text VARCHAR(500),
    sentiment VARCHAR(10)
);

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

SELECT id, text
FROM TextSentiments
WHERE text LIKE '%замечательно%' OR text LIKE '%прекрасно%' OR text LIKE '%восхитительно%';

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

SELECT id, text
FROM TextSentiments
WHERE text LIKE '%плохо%' OR text LIKE '%ужасно%' OR text LIKE '%неудовлетворительно%';

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

SELECT id, text
FROM TextSentiments
WHERE text LIKE '%SmartGadget%' AND (text LIKE '%замечательно%' OR text LIKE '%прекрасно%' OR text LIKE '%восхитительно%');

Этот запрос вернет все строки, в которых упоминается "SmartGadget" и содержится положительная тональность.

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

SELECT sentiment, COUNT(*) AS count
FROM TextSentiments
GROUP BY sentiment;

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

Примеры SQL-кода в действии

Предположим, у нас есть следующие текстовые данные в таблице "TextSentiments":

id

text

sentiment

1

Продукт просто замечательный!

Положительный

2

Этот гаджет оставляет желать лучшего...

Отрицательный

3

Нейтральный комментарий

Нейтральный

4

Спасибо за отличный продукт!

Положительный

Пример запроса для выявления положительных текстов:

SELECT id, text
FROM TextSentiments
WHERE text LIKE '%замечательный%' OR text LIKE '%отличный%';

Пример запроса для подсчета количества текстов по тональности:

SELECT sentiment, COUNT(*) AS count
FROM TextSentiments
GROUP BY sentiment;

Использование словарей для анализа эмоционального окраса

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

Процесс анализа эмоционального окраса с использованием SQL начинается с создания таблицы, содержащей словарь эмоций. Это может быть таблица, в которой каждому слову или выражению присвоена ассоциированная эмоциональная оценка. Давайте создадим таблицу "EmotionDictionary", которая будет содержать слова и их эмоциональные оценки:

CREATE TABLE EmotionDictionary (
    word VARCHAR(100) PRIMARY KEY,
    emotion VARCHAR(20)
);

INSERT INTO EmotionDictionary (word, emotion)
VALUES
    ('радость', 'положительная'),
    ('грусть', 'отрицательная'),
    ('удовлетворение', 'положительная'),
    ('страх', 'отрицательная'),
    ('интерес', 'положительная'),
    ('ненависть', 'отрицательная');

В этой таблице мы определили некоторые слова и связали их с эмоциональными оценками.

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

Предположим, у нас есть таблица "Texts", содержащая тексты, которые мы хотим проанализировать:

id

text

1

Этот фильм был действительно забавным!

2

Утро началось с хороших новостей.

3

Не могу сказать, что я был впечатлен.

Мы можем использовать SQL для определения эмоционального окраса каждого текста на основе словаря эмоций. Например:

SELECT t.id, t.text, d.emotion
FROM Texts t
JOIN EmotionDictionary d ON t.text LIKE '%' || d.word || '%';

В данном запросе мы связываем тексты из таблицы "Texts" с соответствующими словами из таблицы "EmotionDictionary". Если в тексте встречается слово из словаря, то анализируемая эмоция добавляется к результату.

Примеры SQL-кода в действии

Пусть у нас есть следующие данные в таблицах "EmotionDictionary" и "Texts":

Таблица "EmotionDictionary":

word

emotion

радость

положительная

грусть

отрицательная

удовлетворение

положительная

страх

отрицательная

интерес

положительная

ненависть

отрицательная

Таблица "Texts":

id

text

1

Этот фильм был действительно забавным!

2

Утро началось с хороших новостей.

3

Не могу сказать, что я был впечатлен.

Пример SQL-запроса для определения эмоционального окраса текстов:

SELECT t.id, t.text, d.emotion
FROM Texts t
JOIN EmotionDictionary d ON t.text LIKE '%' || d.word || '%';

Применение функций агрегации для анализа

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

id

text

sentiment

1

Продукт просто замечательный!

Положительный

2

Этот гаджет оставляет желать лучшего...

Отрицательный

3

Нейтральный комментарий

Нейтральный

4

Спасибо за отличный продукт!

Положительный

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

SELECT sentiment, COUNT(*) AS count
FROM TextSentiments
GROUP BY sentiment;

Такой запрос вернет нам следующий результат:

sentiment

count

Положительный

2

Отрицательный

1

Нейтральный

1

Этот результат показывает общее количество отзывов в каждой категории тональности.

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

SELECT sentiment, AVG(LENGTH(text)) AS avg_length
FROM TextSentiments
GROUP BY sentiment;

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

sentiment

avg_length

Положительный

31

Отрицательный

32

Нейтральный

24

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

Расчет общей эмоциональной окраски текстов в выборке

Помимо анализа каждой категории тональности по отдельности, можно также расчитать общую эмоциональную окраску текстов в выборке. Для этого мы можем использовать числовые значения, связанные с каждой тональностью. Например, давайте представим, что мы хотим использовать значения -1, 0 и 1 для отрицательной, нейтральной и положительной тональности соответственно. Мы можем использовать функцию SUM для расчета общей эмоциональной окраски:

SELECT SUM(
    CASE
        WHEN sentiment = 'Положительный' THEN 1
        WHEN sentiment = 'Отрицательный' THEN -1
        ELSE 0
    END
) AS total_sentiment
FROM TextSentiments;

Этот запрос вернет общую эмоциональную окраску текстов в выборке.

Примеры SQL-кода в действии

Пусть у нас есть следующие данные в таблице "TextSentiments":

id

text

sentiment

1

Продукт просто замечательный!

Положительный

2

Этот гаджет оставляет желать лучшего...

Отрицательный

3

Нейтральный комментарий

Нейтральный

4

Спасибо за отличный продукт!

Положительный

Пример SQL-запроса для подсчета количества текстов по тональности:

SELECT sentiment, COUNT(*) AS count
FROM TextSentiments
GROUP BY sentiment;

Пример SQL-запроса для расчета средней длины текстов в каждой категории тональности:

SELECT sentiment, AVG(LENGTH(text)) AS avg_length
FROM TextSentiments
GROUP BY sentiment;

Пример SQL-запроса для расчета общей эмоциональной окраски текстов:

SELECT SUM(
    CASE
        WHEN sentiment = 'Положительный' THEN 1
        WHEN sentiment = 'Отрицательный' THEN -1
        ELSE 0
    END
) AS total_sentiment
FROM TextSentiments;

Примеры применения

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

Для начала, мы создадим таблицу "CustomerReviews" для хранения отзывов клиентов:

CREATE TABLE CustomerReviews (
    id INT PRIMARY KEY,
    product_id INT,
    review_text TEXT,
    sentiment VARCHAR(20)
);

Предположим, у нас есть следующие отзывы:

id

product_id

review_text

sentiment

1

101

Замечательные наушники, отличное качество звука!

Положительный

2

102

Не покупайте, ужасное качество...

Отрицательный

3

103

Средний продукт, не впечатлил.

Нейтральный

4

101

Просто влюблена в этот продукт!

Положительный

5

104

Неплохие наушники за такую цену.

Положительный

6

105

Пока не знаю, не успела испытать.

Нейтральны

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

Пример 1: Расчет общей эмоциональной окраски

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

CREATE TABLE EmotionDictionary (
    word VARCHAR(100) PRIMARY KEY,
    emotion VARCHAR(20)
);

INSERT INTO EmotionDictionary (word, emotion)
VALUES
    ('замечательные', 'положительная'),
    ('отличное', 'положительная'),
    ('ужасное', 'отрицательная'),
    ('качество', 'нейтральная'),
    ('влюблена', 'положительная'),
    ('неплохие', 'положительная'),
    ('цену', 'нейтральная'),
    ('испытать', 'нейтральная');

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

SELECT cr.product_id, 
       SUM(
           CASE
               WHEN ed.emotion = 'положительная' THEN 1
               WHEN ed.emotion = 'отрицательная' THEN -1
               ELSE 0
           END
       ) AS total_emotion
FROM CustomerReviews cr
JOIN EmotionDictionary ed ON cr.review_text LIKE '%' || ed.word || '%'
GROUP BY cr.product_id;

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

Расчет средней эмоциональной окраски по категориям

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

SELECT p.category, 
       AVG(
           CASE
               WHEN ed.emotion = 'положительная' THEN 1
               WHEN ed.emotion = 'отрицательная' THEN -1
               ELSE 0
           END
       ) AS avg_emotion
FROM CustomerReviews cr
JOIN EmotionDictionary ed ON cr.review_text LIKE '%' || ed.word || '%'
JOIN Products p ON cr.product_id = p.id
GROUP BY p.category;

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

Заключение

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


Материал подготовлен в преддверии старта нового потока курса «Аналитик данных».

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

Комментарии (7)


  1. Tzimie
    28.08.2023 18:42
    +7

    1. Язык SQL это, вероятно, худший язык для парзинга и анализа строк (и я это говорю несмотря на то, что я SQL нежно люблю)

    2. Сарказм у вас не детектируется никак

    3. В 2023 году во время chatGPT анализ по фразам и словам LIKE %% - это я даже не знаю как это назвать


    1. dvgureev
      28.08.2023 18:42

      Это можно назвать ретро стайл.

      Но если серьезно, то существует великое множество готовых библиотек с учётом морфологии. GPT это даже овер для таких задач.

      В крайнем случае можно прицепить триггер на insert в таблице и дергать по api анализ.


  1. Kinski
    28.08.2023 18:42
    +4

    Название статьи - "Анализ сентимента и эмоционального окраса текстов с помощью SQL", содержание статьи - как написать простейшие SQL запросы.

    А я надеялся, что расскажут, как с помощью SQL научились определять эмоциональную окраску текста)


    1. mentin
      28.08.2023 18:42
      +1

      Аналогично. Хотя вряд-ли это можно реально хорошо делать с помощью SQL, разве что добавив в SQL функции для тренировки и предсказания, и поддержку tensorflow, как это сделали BigQuery (наверное не только они, но других не пробовал).


  1. shaggyone
    28.08.2023 18:42
    +1

    Вы могли бы отчасти спасти статью, приложив полное содержимое своей таблицы EmotionDictionary.

    Потом, анализ эмоциональной окраски текста просто по словам, так себе идея. Например я несколько лет обнаружил, что "большое спасибо" преимущественно воспринимается отнюдь не как выражение благодарности. Причём это справедливо и для "Thank you very much".


  1. uuger
    28.08.2023 18:42

    Предложенный способ определения "эмоциональной окраски" напомнил мне один старый анекдот:

    Учительница в школе предлагает детям придумать предложение, в котором слово "прекрасно" употребляется дважды. 
    - Маша: Вчера папа купил маме прекрасное платье, в котором мама прекрасно выглядела.
    - Петя: Моя бабушка готовит прекрасное печенье, которое я прекрасно кушаю.
    - Вовочка: Вчера за ужином моя сестра объявила что беременна, а отец сказал: "Прекрасно, блин*, просто прекрасно!"

    *не уверен на предмет соответствия оригинального слова правилам ресурса


  1. NickNal
    28.08.2023 18:42

    Ох, я рассчитывал увидеть хотя бы FTS со стеммингом, а не like '%%'