Сегодня мы рассмотрим библиотеку для обработки естественного языка под названием Dostoevsky.
Введение
Для начала, давайте разберемся с терминологией. Определение тональности — это метод анализа речи в компьютерной лингвистике.
Он используется для определения настроения конкретных высказываний. Приведу простые примеры позитивных и негативных предложений.
Позитивные: «Сегодня хорошая погода», «Я счастлив проводить с тобою время», «Мне нравится эта музыкальная композиция».
Негативные: «В больнице была ужасная очередь», «Сосед с верхнего этажа мешает спать», «Маленькая девочка потерялась в торговом центре».
Помимо позитивных и негативных оценок тональности существуют еще нейтральные. Нейтральная тональность не содержит в себе эмоциональной окраски.
Плюсы библиотеки
Причин на самом деле немного, опишу основные
- Команда разработчиков является носителем русского языка, что соответственно гарантирует его лучшую поддержку.
- Библиотека проста и внедрить ее в свои проекты не составит большого труда.
- Отсутствие документации на русском языке. Мне хотелось бы тоже внести небольшой вклад в популяризацию обработки естественного языка.
Преследуемые цели
На самом деле это очень хороший вопрос. На данный момент нейронные сети очень популярны, но их использование в конкретных задачах весьма ограниченно. Ситуация чем то напоминает историю с блокчейном, технология потрясающая но почему то в жизни людей совсем не используется. Для себя я нашел несколького кейсов использования лингвистического анализа.
- Фильтрация информационного потока. Я как и все потребляю очень много информации и 90% получаемой мной информации это — текст. Я стараюсь его агрегировать в один источник на электронную почту. Углубляться в методы получения информации в рамках этой статьи я не буду, но было бы хорошо сортировать эту информацию на позитивную, негативную и нейтральную. Такой метод фильтрации позволяет ограничивать мое психологическое состояние от получения неприятных новостей одним-двумя днями в неделю или вовсе избавление от него целиком.
- Создание чат ботов. Большинство крупных компаний используют ботов для оптимизации расходов на клиентский сервис. Будь то это боты в социальных сетях или голосовые ассистенты в колл-центрах. Обработав негативную информацию ботом ее можно систематизировать и анализировать, выявляя узкие места в обслуживание, качестве и например логистики, кейсы для каждой компании сугубо индивидуальны и мест для внедрения очень много.
- Фильтрация сообществ от токсичных участников. Наверняка каждый из нас состоит в чатах или быть может вы являетесь владельцем группы в социальных сетях, публичной страницы или же у вас свой блог с активной аудиторией в комментариях. Можно агрегировать информацию поступающую от участников и вести аналитику. Складывать все сообщения в базу, устанавливать пороговые значения для негативных высказываний и выводить средние значения. Далее вы можете на выбор автоматизировать действия с этими участниками, предупреждать их о том, что они создают негативный фон и это может плохо повлиять на активность сообщества, либо же принимать более радикальные меры — отключать пользователям возможность публикации или блокировать насовсем.
Эти варианты использования я придумал в моменте написания статьи, наверняка затратив больше времени и хорошенько подумав, что то придет в голову еще.
Установка
Официальная страница библиотеки находится в GitHub репозитории так же библиотеки представлена в репозитории PyPi и благодаря этому мы можем установить ее через пакетный менеджер pip
pip install dostoevsky
В процессе устанавливаются все необходимые зависимости для работы библиотеки.
Установка RuSentiment
Для того, чтобы наша нейронная сеть умела распознавать тональность, ее нужно этому обучить. Разумеется сырых данных у нас нет, да и процесс разметки данных давольно трудоемкий и однообразный, поэтому мы воспользуемся уже существующим набором данных. RuSentiment — это набор аннотированных данных собранный из социальной сети ВКонтакте, казалось бы лучше и придумать невозможно.
python3 -m dostoevsky download fasttext-social-network-model
Поздравляю, теперь у нас установлена нейронная сеть с предобученным набором данных.
Использование
Пришло время написать наше первое приложение. Не стоит боятся, ничего сложного в этом процессе не будет. Нам всего лишь нужно подготовить список с предложениями и передать его в обработчик, а он в свою очередь вернет нам результат.
Давайте напишем наш код и воспользуемся набором фраз, которые я придумал в самом начале статьи, заодно проверим насколько я справляюсь с задачами нейронной сети 🙂
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
Результат работы приложения
- Сегодня хорошая погода -> {‘positive’: 0.9879562258720398, ‘negative’: 0.01323282066732645}
- Я счастлив проводить с тобою время -> {‘positive’: 0.5000100135803223, ‘skip’: 0.38492217659950256}
- Мне нравится эта музыкальная композиция -> {‘positive’: 0.9637899398803711, ‘neutral’: 0.21734751760959625}
- В больнице была ужасная очередь -> {‘negative’: 0.9903015494346619, ‘skip’: 0.1520422399044037}
- Сосед с верхнего этажа мешает спать -> {‘neutral’: 0.839743971824646, ‘negative’: 0.18714269995689392}
- Маленькая девочка потерялась в торговом центре -> {‘neutral’: 0.23935934901237488, ‘skip’: 0.1778208613395691}
Давайте разбираться по пунктам, что же у нас произошло.
Во первых, я угадал с позитивной интонацией, но вот с негативной ошибся))
Во вторых, значения ключей обозначают степень уверенности нейронной сети в правильности предсказания, максимально — 1.
В третьи — появился новый маркер речевых фраз «skip«. Он означает что нейронная сеть не смогла разобрать эту фразу и скорее всего там отсутствует эмоциональный контекст.
Еще существует маркер «speech» означающий разговорные фразы без эмоций. К примеру поздравления, приветствия и благодарности.
Заключение
Для тех кому понравилась статья и хочется что-то сделать самому — попробуйте сменить модель распознавания, в библиотеке есть обученая на проверку токсичности фраз, пройдите по тем же фразам, а результат опубликуйте в комментариях посмотрим что там получится.
Отсутствие документации на русском языке.
Это точно плюс ? )
Егор Егоров,здравствуйте!
Пожалуйста, Вы не могли бы помогите нам ответить на следующие вопросы:
1. Если проанализировать текст новостного сообщения, будут ли результаты анализа настроения точными?
2. Окончательный результат, например, positive 0,9534 или negative 0,833, Каковы правила подсчета баллов и на какую конкретную теорию ссылаются?
Здравствуйте. Много стало людей задавать подобные вопросы. Хочу сразу сказать, я не разработчик этой библиотеки и все детали реализации мне неизвестны, плюс статье уже более 2х лет. Что-то наверняка за это время в библиотеке поменялось. Поэтому открывайте ишью на гитхабе автора и задавайте вопросы там, это самый лучший вариант.
Егор, здравствуйте!
Вы не могли бы через пожалуйста уточните следующие моменты:
1. «сменить модель распознавания» — как именно это сделать? Где взять список моделей?
2. «в библиотеке есть обученная на проверку токсичности фраз» — имеется в виду в RuSentiment? А можно, как-то заглянуть в эту модель? Она в bin-файле, как ее декодировать? И как вообще на датасет изначальный выйти не подскажете?
Спасибо!
Здравствуйте. В примерах мы используем модель 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
Декодировать модель у вас врятле выйдет, единственное можно уточнить у автора(ов) библиотеки какими данными они пользовались.
Супер, спасибо
Супер
🙂
прикольна конечно только, » я нейронная сеть» надо в кавычки
Исправим 🙂
Прочитала до конца. Отличная статья, очень информативная
Спасибо!