Как мы создавали новостные заголовки на русском языке с помощью Deep Learning
Всем привет! Меня зовут Виктор Трохименко. Я — Data Scientist в компании Genesis. Мы провели исследование о создании заголовков для новостных статей и хотели бы поделиться своими наблюдениями.
Введение
Все больше и больше медиабизнесов переключаются на автоматизацию своих процессов. Это явная тенденция последних нескольких лет, и цифровой мир движется к ней.
В прошлом году мы в Genesis Media решили, что можем помочь нашим авторам писать заголовки для статей, используя самые популярные источники информации Data Science. Мы считаем, что такие инновации могут и улучшить качество заголовков, и сэкономить время для редакций.
За основу мы взяли www.nur.kz — новостной сайт № 1 в Казахстане, который в среднем публикует около 3.5к новостей на русском языке в месяц и имеет более 500к просмотров самых популярных статей в сети. По состоянию на март 2019 года было установлено более 3 млн приложений NUR.kz на Android и около 600к на iOS.
Чтобы решить проблему с созданием заголовка, мы взяли ряд подходов (моделей) и протестировали их. Результаты на скриншотах ниже представлены на русском языке. Также немного поговорим и об английском языке.
Что собой представляет обобщение текста
Обобщение текста (или резюмирование, но мы остановимся на
Когда это делается с помощью компьютерных технологий, то есть автоматически, мы называем этот процесс «автоматическим обобщением текста». Несмотря на то, что ОТ традиционно было сосредоточено на вводе текста, информация также может быть представлена и в мультимедийной форме, например, изображения, видео или аудио, а также онлайн-информация или гипертекст. Кроме того, мы можем говорить о обобщении одного или нескольких документов. В наших экспериментах мы использовали только текст без изображений. Более подробная информация приведена в
Выход ОТ модели может производиться в формате некой выдержки (то есть когда выполняется выбор «важных» предложений в документе) или аннотация/резюмирование (когда обобщение может служить заменой оригинальному документу).
Что касается стиля выходных данных, обычно проводится четкое различие между индикативными и информативными обобщениями. Первый используется для определения тем, которые рассматриваются в исходном тексте и могут дать краткое представление, о чем идет в нем речь, а второй предназначен для освещения тем исходного текста [link 1, link 2].
Оценка качества
Ни для кого не секрет, что модели нужно как-то оценивать. Например, для оценки бинарной классификации чаще всего используют метрику площадь под ROC-кривой (очень доступно о ней написано в блоге д.ф.-м.н., проф. Александра Дьяконова). Также в этом примере можно смотреть и на точность, полноту, f1-меру, матрицу ошибок.
Оценка ОТ включает в себя меры для автоматического определения качества обобщения путем сравнения его с другими (идеальными/справочными) сводками, созданными людьми.
Оценку заголовков мы можем свести к задаче машинного перевода; для этого чаще всего используют следующие метрики: METEOR, BLEU и ROUGE (с ее разновидностями).
BLEU
BLEU (Bilingual evaluation understudy) — модификация точности (precision) совпадения ответа модели и «правильного ответа», перевзвешенной так, чтобы не давать идеальную оценку ответу из одного правильного слова.
Для Python есть библиотека ‘sentence_bleu’ от nltk:
ROUGE
ROUGE (Recall-oriented understudy for gisting evaluation) — подсчитывает долю пересечения множеств n-грамм слов в эталоне и в полученном тексте. Больше о ROUGE с ее разновидностями доступно в статье.
Для Python есть также готовая библиотека rouge:
В качестве функции оптимизации будем использовать ROUGE-L (Longest Common Subsequence).
Данные
Всего было собрано более 2.8 млн записей со следующими признаками: «заголовок» и «текст», как показано ниже:
Сбор данных
Данные состоят из нескольких частей:
- nur.kz (~300k);
- news_lenta.csv (~700k);
- novayagazeta.ru (~14k);
- news-article-2015 (остаток от вышеуказанных), относящиеся к проекту ‘The news topic radar’ в рамках Machine Learning for Social Good от крупнейшего международного сообщества Open Data Science. Оно объединяет специалистов, исследователей и инженеров, связанных с Data Science.
Предварительная обработка
Для предварительной обработки использовались различные операции с регулярными выражениями. Например:
Модели
В этой части мы хотели бы описать все наши подходы к ОТ. Начнем с простых моделей, так сказать «из коробки», а затем перейдем к более сложным.
Решения «из коробки»
На самом деле существует довольно много таких решений, но мы остановились на двух из них более-менее удовлетворяющих: gensim и summa. Больше всего они подходят для английского языка, но все равно не всегда идеально отрабатывают. Но если их использовать для русского языка, то они часто выдают все предложение целиком или часть одного-двух предложений из текста:
Кроме того, summa часто не может выдать хоть какой-то вменяемый результат. Как вы можете догадаться, мы сразу же отвергли подход «из коробки».
На основе TensorFlow
После готовых решений мы отправились искать другие подходы, где мы можем обучаться на собственных данных. Конечно же, мы нашли несколько таких. Для начала мы взяли модель, написанную на Tensorflow, — простую реализацию ОТ с использованием библиотеки seq2seq. Эта модель использует предобученный Glove для инициализации векторов слов. LSTM (долгая краткосрочная память) с stack_bidirectional_dynamic_rnn используется в качестве энкодера, а LSTM BasicDecoder — декодера, и BeamSearchDecoder был использован для вывода. BahdanauAttention с нормализацией весов используется в качестве механизма внимания.
В качестве альтернативы Glove решили использовать предобученный FastText.
Несколько примеров (обученных на 100к образцов):
мвф прогнозирует железную дорогу на украине как цена на миниатюрах из средневековых манускриптов # года наса сфотографировало вспышку на солнце в ярославле загорелся # повесился дтп нато хочет объединиться в командование сми # количество пилотов поможет в подмосковье следующем году пилот разбившегося ми # позвонили на связь в хмао в сбербанке заговорили о новом падении рубля рафаэль надаль не готов вернуться к алискамп сбербанк и втб начинает выпуск миллиарда на # процентов яресько # украина остается в конце санкций
На основе Keras
Также мы решили попробовать еще один подход — keras-text-summarization. В этом репозитории есть много разных примеров. Для того, чтобы решить какую лучше всего использовать модель для русского языка, был создан вопрос в их репозитории. И мы получили следующий ответ: «I think recursive-rnn-1 or recursive-rnn-2 should be good for the start».
Ниже можно посмотреть на отличие между RecursiveRNN1 и RecursiveRNN2:
Несколько примеров (обученных на 500к образцов с помощью RNN1):
['при взрыве на заводе в италии погибли 17 человек', 'астрономы нашли новые данные о новых звезд', 'депутат госдумы пожаловался на депутата', 'в сша предложили запретить продажу алкоголя в продаже', 'в сети начали разработку игры про в российском itunes', 'в москве ограбили дом', 'бывшего президента сша приговорили к смерти за убийство', 'президент чехии потребовал от россии вернуть деньги', 'телеканал сообщил о планах закрыть телеканал после трех дней', 'в москве нашли способ найти машины с моста в москве’]
и оценка (распределение ROUGE-L):
count 5000.000000 mean 0.173687 std 0.154972 min 0.000000 25% 0.000000 50% 0.139717 75% 0.264327 max 0.912343
На основе OpenNMT
OpenNMT (Open-Source Neural Machine Translation) — это полнофункциональная нейронная система машинного перевода с открытым исходным кодом, использующая математический инструментарий Torch. Он предназначен в основном для исследований, поэтому в нем можно попробовать много новых идей в переводе, создании обобщений, изображений в текст или морфологию.
На этой странице вы можете посмотреть, как легко начать обучение модели. Но сначала нужно подготовить правильные исходные и целевые данные.
Несколько примеров (обучено на 500к образцов):
человек человек в москве енисей на улице начало трансляции в матче сборная не матче на матче мира цска - цска в матче мира на киеве на скиатлоне доллар на дтп с дтп на иерусалиме из-за иерусалиме доллар и киеве на матче на матче на москве на открытии торгов упала курс доллара в украине сознания сознания сознания анонс человек в дтп в москве человек на результате погибли в киеве в москве доллар на открытии доллар доллар на евро на матче видео евро доллара на открытии рублей в евро вышла видео на матче в москве
И оценка (распределение ROUGE-L):
count 5000.000000 mean 0.040450 std 0.082222 min 0.000000 25% 0.000000 50% 0.000000 75% 0.089443 max 1.000000
На этой странице можно узнать, как использовать Transformer на GPU.
Как мы знаем, чтобы достичь лучшего результата модели, основанной на Transformer, обучаться нужно недели, конечно, если у вас не свой дата-центр с TPU (но такое доступно лишь в Google).
Заключение
Наиболее удовлетворительный для нас результат был получен с помощью модели на основе Keras. Мы решили остановиться на этом варианте, потому что, по нашему мнению, он показал результат, который ближе к идеальному, чем у всех остальных.
Немного о времени для обучения этих моделей:
- Tensorflow ~5 дней (SageMaker на aws на m4.16xlarge);
- Keras свыше 9 дней (на 2080ti);
- OpenNMP ~17 часов (на 2080ti, эту модель мы хотели просто затестить).
Литература
- Elena Lloret. Text Summarization : an overview.
- Edmundson, H. P. New Methods in Automatic Extracting. In Inderjeet.
- Mani and Mark Marbury, editors. Advances in Automatic Text Summarization. MIT Press, 1999.
- Padro Cirera, L., Fuentes, M.J., Alonso, L., et al. Approaches to Text Summarization: Questions and Answers. Revista Iberoamericana de Inteligencia Artificial, ISSN
1137–3601, (22):79—102, 2004. - A Gentle Introduction to Calculating the BLEU Score for Text in Python.
- ROUGE: A Package for Automatic Evaluation of Summaries .