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

Одной из причин высокой популярности языка программирования Python является разнообразие библиотек нацеленных на обработку естественного языка (NLP). Сегодня мы рассмотрим одну из них под названием Dostoevsky.

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

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

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

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

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

Почему выбор пал на Dostoevsky?

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

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

Для чего все это нужно?

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

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

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

Читай далее:  10 лучших Python расширений в VS Code

Установка библиотеки

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

pip install dostoevsky
процесс установки библиотеки 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” означающий разговорные фразы без эмоций. К примеру поздравления, приветствия и благодарности.

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

close

Изучаешь Python?

Оформи подписку и получи моментальный доступ к новым публикациям

Поделиться записью в социальных сетях


Добавить комментарий

Ваш адрес email не будет опубликован