В этой статье мы рассмотрим подход к асимметричному анализу тональности деловых новостей. Главная особенность задачи заключается в том, что нам хотелось бы понять не просто тональную окраску всей новости, а тональность относительно конкретной сущности-организации в тексте. То есть в одном и том же тексте мы ожидаем получать разный сантимент для разных компаний.
На практике такая задача интересна, прежде всего, в области финансов:
Выявление недобросовестных контрагентов. Информационный фон может использоваться как фактор при принятии решения о приостановке платежей недобросовестных контрагентов;
Кредитный риск. Предположим, что мы анализируем кредитный риск своих контрагентов и хотим знать о наступлении неблагоприятного события, которое сможет повлиять на платежеспособность по обязательствам (тогда мы можем приостановить рассмотрение заявки на выдачу кредита или отменить очередной намеченный транш и т.д.);
Ценовой индикатор. Анализ мнений аналитиков по поводу роста цен на акции/ товары, что в дальнейшем можно использовать для понимания трендов, принятия решения о покупке/продаже активов.
Рассмотрим пример новости, подлежащей анализу:
Компания X расторгла контракт с Y, выбрав Z в качестве эксклюзивного поставщика сепулек для своих сепулькаров. Лишившись такого крупного заказчика, Y, и раньше испытывавшая серьезные проблемы из-за повышения налогов, может оказаться на грани банкротства, сообщают аналитики сепулька-информ.
Для Z это позитивная новость, для Y тональность новости будет негативной. Относительно сепулька-информ ничего не происходит и, наконец, X не выиграл и не проиграл от этой сделки, по крайне мере текст на это явно не указывает – оценка нейтральная. Нет никакого смысла оценивать тональность такой новости целиком, тональность текста будет меняться относительно каждой компании.
Эксперименты
Изначально мы пытались решить задачу с помощью готовых датасетов. Кроме русскоязычного датасета Sentiment Analysis in Russian найти размеченные новости (твиты и отзывы не подходят для такой задачи) не удалось. С англоязычными источниками возникла аналогичная проблема: в открытом доступе имеется только набор заголовков новостей SENTIMENT ANALYSIS FOR FINANCIAL NEWS, но такие тексты слишком короткие для применения обученной на них модели.
Не удалось найти и готовый инструмент для решения нашей задачи. После ряда попыток со словарями тональностей, синтаксическими деревьями, мешками слов и т.д. стало очевидно, что нам нужна предобученная модель, способная понимать контекст. Перечислим некоторые подходы, которые мы применяли для этой задачи:
1. Дообучение классификатора на эмбеддингах BERT.
Первой была предпринята попытка обойтись без своего датасета. Мы брали сантимент всей новости, автоматически выделяли ключевую (или главную) сущность в тексте и считали, что оценка относится к этой сущности.
Базовый подход: брали от статьи 512 токенов, связанных с интересующей нас сущностью и пропускали через BERT, на полученных эмбеддингах обучали классификатор. Подробнее с этим подходом можно ознакомиться тут.
2. Дообучение LSTM на эмбеддингах BERT.
Каждую статью мы разбивали на последовательности из 512 токенов, которые пропускали через BERT. Затем от полученных эмбеддингов брали только первые, соответствующие метке, классификации и собирали их обратно в «единую статью». Чтобы все статьи получались одинакового размера, применяли padding из пустых векторов и, наконец, подавали на вход LSTM. Если обычный BERT может принимать на вход не более 512 токенов, то такой трюк с разбиением статьи на последовательности позволяет ничего не выбрасывать из новости. Такой подход оказался лучше первого.
Хотя обе модели показывали приемлемые результаты на известных датасетах, как только мы начинали брать длинные новости и заменять общие новости финансовыми, все сразу ломалось. Особенные трудности возникали, когда текст был посвящён одновременно нескольким сущностям.
Стало очевидно, что главным недостатком открытых датасетов по sentiment analysis является симметричность: то есть оценка всей новости без выделения сущностей внутри неё.
Главным выводом для нас стало, что несимметричность не просто важна, а является ключевой частью решения задачи. Следовательно, модель должна уметь выделять сущности и дообучаться этому.
3. Попытка применения zero-short classification.
В процессе исследования мы наткнулись на такую тему, как Natural Language Inference (NLI). Тем более, что как раз появилась первая открытая русскоязычная модель. Идея была проста: вдруг ничего не придется дообучать и модель сама поймет, чего мы от неё хотим.
В качестве лейблов мы передавали модели варианты типа «позитивное событие для сущности», «нейтральное событие для сущности», «негативное событие для сущности». Результат модели оказался неудовлетворительным. Несмотря на неудачную попытку, направление NLI кажется очень перспективным. В будущем мы сделаем свою собственную модель zero-short classification, также обученную на финансовых новостях.
4. Дообучение BERT на новых данных.
Для обучения BERT мы подготовили свою асимметричную разметку, придумали как выделять интересующие нас сущности и ужимать текст до 512 токенов. Добавили к BERT слой классификации, при этом обучая не только его, а весь BERT.
Важно понимать, что разметка данных достаточно субъективный процесс. Оценки могут зависеть от смысла задачи, а разметчики должны иметь необходимые знания чтобы правильно сделать разметку. Изначально мы отобрали 2,5 тысячи новостей финансового характера и попытались выполнить разметку с привлечением стажеров, но после валидации этой разметки пришлось её выкинуть. У наших случайных разметчиков не было достаточного экономического понимания для правильного восприятия ситуации в новости. Так, например, большинство из них давали нейтральную оценку введению временной администрации в банке, не понимая, что это действие сопряжено с серьёзными нарушениями банка или процедурой банкротства.
В рамках MVP мы разметили 480 новостей силами одного исследователя. Этого набора данных оказалось достаточно для демонстрации работоспособности модели.
Как объяснить BERT асимметричность и указать на ключевые сущности?
Унификация сущности
Мы размечали одну и ту же новость относительно каждой встреченной сущности в ней. То есть если в тексте упоминаются три компании, то мы получим три примера текста для оценки, где ключевая сущность, к которой относится оценка, выделена специальным образом. Мы можем унифицировать ключевую сущность заменой специального вида или добавить имя сущности в начало текста, например, ‘ООО Ромашка | ’ + текст новости.
На практике хорошо себя показала простая замена ключевой сущности на специальный символ «X».
В качестве разметки использовалась семибалльная шкала тональности: от «-3» до «+3», где «-3» – это крайне негативное событие, «+3» – крайне позитивное, «0» – нейтральное и т.д.
Рассмотрим для наглядности упрощенный пример разметки.
Исходный текст:
«ЦБ отозвал лицензию у банка БВТ, сообщает Финам»
Разметка:
«X отозвал лицензию у банка БВТ, сообщает Финам» – тональность «0»
«ЦБ отозвал лицензию у X, сообщает Финам» – тональность «-3»
«ЦБ отозвал лицензию у банка БВТ, сообщает X» – тональность «0»
Препроцессинг текста новости
Поскольку модели типа BERT имеют ограничения, нам надо сокращать размер текста, при этом не потеряв ничего полезного. В этой части задачи имеется большой размах для творчества. Приведем несколько возможных подходов:
-
При помощи синтаксического дерева:
используя синтаксический анализатор из библиотеки Natasha, мы строим синтаксическое дерево, у которого в каждом узле находится слово или знак пунктуации;
начиная с найденного узла, содержащего сущность, запускаем на дереве «алгоритм закраски»: сначала помечаем узлы дерева на m уровней выше найденного, затем узлы на n уровней ниже уже помеченных (m и n – настраиваемые параметры);
все помеченные узлы объединяем в текст, если между узлами имеются пропуски, ставим троеточие.
Более простой вариант: брать все предложения, в которых упоминается интересующая нас сущность. В рамках этого подхода мы обучали рассматриваемую далее модель.
В русскоязычных новостях мы активно использовали набор библиотек Natasha в качестве вспомогательного инструмента:
для извлечения именованных сущностей и их нормализации;
разбиения статей на предложения;
извлечение информации из синтаксического дерева для автоматического выделения ключевых именованных сущностей и сокращенного варианта текста.
Стоит отметить, что в тексте часто одна и та же сущность может встречаться в виде сокращений, псевдонимов или аббревиатур. Это известная проблема разного написания названий организаций в зависимости от издательства, настроения автора, погоды, дня недели и т.д. Кажется, авторы не подозревают, что нам хочется обучать нейронки на их новостях.
Для контрагента, записанного в базе как АО «Тинькофф банк», получится найти в статьях множество вариантов написания: «Тинькофф», «банк Тинькофф», «Тинькофф-банк», Tinkoff, TCSG, Банк Олега Тинькова и т.д.
Для приведения сущностей к единой форме мы используем словарь возможных написаний для каждой сущности и нечеткий поиск с помощью библиотеки FuzzyWuzzy. Это также важно для задачи матчинга новости и базы контрагентов, по которым мы хотим проводить анализ.
Workflow подготовки данных и обучения модели:
Для каждой новости:
Выделяем сущности и делаем оценку тональности новости относительно каждой;
Приводим разные варианты употребления одной сущности к единому виду;
Делаем замену ключевой сущности на X;
Ужимаем текст исходной новости до 512 токенов относительно X.
В итоге мы получаем N* примеров и обучаем BERT с дополнительным выходным слоем классификации.
Результаты
На нашей разметке на тестовой выборке модель продемонстрировала следующие результаты:
Accuracy: 0.7301
-
F1 score: 0.5210
Полученные результаты стоит рассматривать как обнадеживающие. Качество модели можно улучшить за счет увеличения обучающей выборки и подбора параметров модели. Стоит отметить, что несмотря на ошибки, модель ошибается в соседние классы, при этом явно не путая негативные и позитивные примеры.
На данный момент модель склонна путаться, когда в одном тексте попадаются несколько сущностей с противоположным смыслом:
Банк «А» получил прибыль, а банк «Б» – убыток.
Также модель ошибается, когда встречается двойной смысл. Например, негативное действие с нейтральными или позитивными последствиями:
Создатели российского бренда уличной одежды Don't Care сожгли последний билет на концерт американской рок-группы Nirvana и выпустили одежду с принтом из его пепла. Об этом сообщается в пресс-релизе, поступившем в редакцию «Ленты.ру».
Для «Ленты» будет нейтральная тональность (оценка «0»). Для Don't Care получится негативная (оценка «-1») – такой специфичный пример модель обработала неправильно, скорее всего ориентируясь на «сожгла последний». Уверенность модели для «Ленты» в ответе «0» была с вероятностью 99%, а для Don't Care модель начала сомневаться: вероятность для класса «-1» равна 0.84, а для класса «1» – 0.126.
Workflow использования модели:
При использовании обученной модели мы выдаем оценки для нескольких самых важных сущностей в новости. При этом важность определяется как взвешенное количество упоминаний сущности в тексте новости. Когда она встречается как подлежащее, мы берём её с большим весом. В конечном итоге мы просто отсекаем все неважные сущности, доля упоминания которых не превышает заданный порог.
Является ли сущность подлежащим или его частью, мы определяем с помощью синтаксического дерева, выдаваемого Natasha.
Берем новость и извлекаем ключевые сущности.
Для каждой ключевой сущности:
Приводим разные варианты употребления одной сущности к единому виду;
Делаем замену ключевой сущности на X;
Ужимаем текст примера до 512 токенов относительно X;
Подаем в обученную модель;
Получаем вероятности классов шкалы тональностей, выбираем наиболее вероятный класс.
Комплексная задача оценки тональности деловых новостей.
Задача определения тональности новостей является важнейшей задачей в рамках системы новостного анализа. Помимо определения тональности необходимо уметь решать и целый ряд других задач:
Дедубликация новостей;
Определение важности новости;
Извлечение именованных сущностей;
Матчинг извлеченных сущностей с базой сущностей-контрагентов;
Определение релевантности новости и сущности;
Анализ тональности;
Визуализация результатов;
Инструмент разметки ошибок для дообучения модели.
В этой статье мы вскользь затронули задачи 3-5, основное же внимание было уделено анализу тональности.
Модель асимметричного анализа тональности выложена в открытый доступ на huggingface. Не стоит забывать, что при использовании модели крайне важна подготовка текста (workflow использования модели).
Представленная модель позволяет работать только с русскоязычными текстами. Сейчас мы работаем над дообучением ее мультиязычности без сильной потери качества, разбираемся с NLI подходами, а также занимается доработкой обучающей выборки.
ipostny
Добрый день!
Отличная статья, интересный подход. Могли бы Вы, пожалуйста, показать пример препроцессинга новости?
neoflex Автор
Спасибо за обратную связь!
Пример из готового продукта выложить не сможем, также в препроцессинге довольно много строк кода. Поэтому подготовим простой пример с необходимой логикой и в ближайшие дни поделимся им.
neoflex Автор
Старались максимально упростить пример, но все равно он вышел достаточно объемным. Пример сделан исключительно для работы с Natasha и в нём не учитываются словари аббревиатур/сокращений и другая дополнительная обработка. Также для простоты приводим пример с сокращением текста на основе выбора предложений, в которых упоминается интересующая нас сущность.