Dostoevsky — анализ тональности в Python за 5 минут

Анализ тональности в Python с помощью Dostoevsky

Сегодня мы рассмотрим библиотеку для обработки естественного языка под названием Dostoevsky.

Введение

Для начала, давайте разберемся с терминологией. Определение тональности — это метод анализа речи в компьютерной лингвистике.

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

Позитивные: «Сегодня хорошая погода», «Я счастлив проводить с тобою время», «Мне нравится эта музыкальная композиция».

Негативные: «В больнице была ужасная очередь», «Сосед с верхнего этажа мешает спать», «Маленькая девочка потерялась в торговом центре».

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

Плюсы библиотеки

Причин на самом деле немного, опишу основные

  • Команда разработчиков является носителем русского языка, что соответственно гарантирует его лучшую поддержку.
  • Библиотека проста и внедрить ее в свои проекты не составит большого труда.
  • Отсутствие документации на русском языке. Мне хотелось бы тоже внести небольшой вклад в популяризацию обработки естественного языка.

Преследуемые цели

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

  • Фильтрация информационного потока. Я как и все потребляю очень много информации и 90% получаемой мной информации это — текст. Я стараюсь его агрегировать в один источник на электронную почту. Углубляться в методы получения информации в рамках этой статьи я не буду, но было бы хорошо сортировать эту информацию на позитивную, негативную и нейтральную. Такой метод фильтрации позволяет ограничивать мое психологическое состояние от получения неприятных новостей одним-двумя днями в неделю или вовсе избавление от него целиком.
  • Создание чат ботов. Большинство крупных компаний используют ботов для оптимизации расходов на клиентский сервис. Будь то это боты в социальных сетях или голосовые ассистенты в колл-центрах. Обработав негативную информацию ботом ее можно систематизировать и анализировать, выявляя узкие места в обслуживание, качестве и например логистики, кейсы для каждой компании сугубо индивидуальны и мест для внедрения очень много.
  • Фильтрация сообществ от токсичных участников. Наверняка каждый из нас состоит в чатах или быть может вы являетесь владельцем группы в социальных сетях, публичной страницы или же у вас свой блог с активной аудиторией в комментариях. Можно агрегировать информацию поступающую от участников и вести аналитику. Складывать все сообщения в базу, устанавливать пороговые значения для негативных высказываний и выводить средние значения. Далее вы можете на выбор автоматизировать действия с этими участниками, предупреждать их о том, что они создают негативный фон и это может плохо повлиять на активность сообщества, либо же принимать более радикальные меры — отключать пользователям возможность публикации или блокировать насовсем.

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

Установка

Официальная страница библиотеки находится в GitHub репозитории так же библиотеки представлена в репозитории PyPi и благодаря этому мы можем установить ее через пакетный менеджер pip

pip install dostoevsky
Dostoevsky - анализ тональности в Python за 5 минут
процесс установки библиотеки Dostoevsky с помощью pip

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

Установка RuSentiment

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

python3 -m dostoevsky download fasttext-social-network-model
Установка набора данных RuSentiment в библиотеку dostaevsky
Установка набора данных RuSentiment в библиотеку dostaevsky

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

Использование

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

Давайте напишем наш код и воспользуемся набором фраз, которые я придумал в самом начале статьи, заодно проверим насколько я справляюсь с задачами нейронной сети 🙂

from dostoevsky.tokenization import RegexTokenizer
from dostoevsky.models import FastTextSocialNetworkModel

tokenizer = RegexTokenizer()
model = FastTextSocialNetworkModel(tokenizer=tokenizer)

messages = [
    'Сегодня хорошая погода',
    'Я счастлив проводить с тобою время',
    'Мне нравится эта музыкальная композиция',
    'В больнице была ужасная очередь',
    'Сосед с верхнего этажа мешает спать',
    'Маленькая девочка потерялась в торговом центре',
]

results = model.predict(messages, k=2)
for message, sentiment in zip(messages, results):
    print(message, '->', sentiment)

Запишем это в файл и давайте назовем его app.py

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

python3 app.py
dostoevsky run
Запуск нейронной сети

Результат работы приложения

  1. Сегодня хорошая погода -> {‘positive’: 0.9879562258720398, ‘negative’: 0.01323282066732645}
  2. Я счастлив проводить с тобою время -> {‘positive’: 0.5000100135803223, ‘skip’: 0.38492217659950256}
  3. Мне нравится эта музыкальная композиция -> {‘positive’: 0.9637899398803711, ‘neutral’: 0.21734751760959625}
  4. В больнице была ужасная очередь -> {‘negative’: 0.9903015494346619, ‘skip’: 0.1520422399044037}
  5. Сосед с верхнего этажа мешает спать -> {‘neutral’: 0.839743971824646, ‘negative’: 0.18714269995689392}
  6. Маленькая девочка потерялась в торговом центре -> {‘neutral’: 0.23935934901237488, ‘skip’: 0.1778208613395691}

Давайте разбираться по пунктам, что же у нас произошло.

Во первых, я угадал с позитивной интонацией, но вот с негативной ошибся))

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

В третьи — появился новый маркер речевых фраз «skip«. Он означает что нейронная сеть не смогла разобрать эту фразу и скорее всего там отсутствует эмоциональный контекст.

Еще существует маркер «speech» означающий разговорные фразы без эмоций. К примеру поздравления, приветствия и благодарности.

Заключение

Для тех кому понравилась статья и хочется что-то сделать самому — попробуйте сменить модель распознавания, в библиотеке есть обученая на проверку токсичности фраз, пройдите по тем же фразам, а результат опубликуйте в комментариях посмотрим что там получится.

Егор Егоров

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

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий

  1. iamkisly

    Отсутствие документации на русском языке.
    Это точно плюс ? )

    Ответить
  2. Юань

    Егор Егоров,здравствуйте!
    Пожалуйста, Вы не могли бы помогите нам ответить на следующие вопросы:
    1. Если проанализировать текст новостного сообщения, будут ли результаты анализа настроения точными?
    2. Окончательный результат, например, positive 0,9534 или negative 0,833, Каковы правила подсчета баллов и на какую конкретную теорию ссылаются?

    Ответить
    1. Егор Егоров автор

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

      Ответить
  3. Александр

    Егор, здравствуйте!

    Вы не могли бы через пожалуйста уточните следующие моменты:
    1. «сменить модель распознавания» — как именно это сделать? Где взять список моделей?
    2. «в библиотеке есть обученная на проверку токсичности фраз» — имеется в виду в RuSentiment? А можно, как-то заглянуть в эту модель? Она в bin-файле, как ее декодировать? И как вообще на датасет изначальный выйти не подскажете?

    Спасибо!

    Ответить
    1. Егор Егоров автор

      Здравствуйте. В примерах мы используем модель FastTextSocialNetworkModel, но так же, разработчик реализовал внутри своего кода еще одну модельку называется FastTextToxicModel. FastText model trained on russian toxic comments dataset — ее описание. Просто импортируйте модель from dostoevsky.models import FastTextToxicModel и укажите ее в переменную model.

      Подробнее можно посмотреть в исходниках библиотеки тут есть список моделей https://github.com/bureaucratic-labs/dostoevsky/blob/master/dostoevsky/models.py

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

      Ответить
  4. Илья

    Супер, спасибо

    Ответить
  5. Игорь

    Супер

    Ответить
    1. Егор Егоров автор

      🙂

      Ответить
  6. шура

    прикольна конечно только, » я нейронная сеть» надо в кавычки

    Ответить
    1. Егор Егоров автор

      Исправим 🙂

      Ответить
  7. Светлана

    Прочитала до конца. Отличная статья, очень информативная

    Ответить
    1. Егор Егоров автор

      Спасибо!

      Ответить