×

Как мы создавали новостные заголовки на русском языке с помощью Deep Learning

Команда Data Scientists в компании Genesis провела исследование о создании заголовков для новостных статей и хотела бы поделиться своими наблюдениями.

Введение

Все больше и больше медиабизнесов переключаются на автоматизацию своих процессов. Это явная тенденция последних нескольких лет, и цифровой мир движется к ней.

В прошлом году мы в Genesis Media решили, что можем помочь нашим авторам писать заголовки для статей, используя самые популярные источники информации Data Science. Мы считаем, что такие инновации могут и улучшить качество заголовков, и сэкономить время для редакций.

За основу мы взяли www.nur.kz — новостной сайт № 1 в Казахстане, который в среднем публикует около 3.5к новостей на русском языке в месяц и имеет более 500к просмотров самых популярных статей в сети. По состоянию на март 2019 года было установлено более 3 млн приложений NUR.kz на Android и около 600к на iOS.

Чтобы решить проблему с созданием заголовка, мы взяли ряд подходов (моделей) и протестировали их. Результаты на скриншотах ниже представлены на русском языке. Также немного поговорим и об английском языке.

Что собой представляет обобщение текста

Обобщение текста (или резюмирование, но мы остановимся на 1-м варианте, далее — ОТ) — text summarization — это краткое текстовое описание одного или нескольких пунктов статьи. ОТ также может быть определено как процесс выделения самой важной информации из источника (или источников) для создания сокращенной версии для конкретного пользователя (или пользователей) и задачи (или задач).

Когда это делается с помощью компьютерных технологий, то есть автоматически, мы называем этот процесс «автоматическим обобщением текста». Несмотря на то, что ОТ традиционно было сосредоточено на вводе текста, информация также может быть представлена и в мультимедийной форме, например, изображения, видео или аудио, а также онлайн-информация или гипертекст. Кроме того, мы можем говорить о обобщении одного или нескольких документов. В наших экспериментах мы использовали только текст без изображений. Более подробная информация приведена в 4-м разделе этой статьи.

Выход ОТ модели может производиться в формате некой выдержки (то есть когда выполняется выбор «важных» предложений в документе) или аннотация/резюмирование (когда обобщение может служить заменой оригинальному документу).

Что касается стиля выходных данных, обычно проводится четкое различие между индикативными и информативными обобщениями. Первый используется для определения тем, которые рассматриваются в исходном тексте и могут дать краткое представление, о чем идет в нем речь, а второй предназначен для освещения тем исходного текста [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, эту модель мы хотели просто затестить).

Литература

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному1
LinkedIn

Схожі статті




30 коментарів

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

Тепер зрозуміло яке знаряддя у пропагандистів. Вчора був День Конституції, а в Твітері Тренд по Україні — матєрне слово сусідів.

как пагодка в Маскве?©

Дебильная бизнес-идея.

Хотя с другой стороны автоматизация даст гораздо худший результат, кликбейт упадёт, говносми потеряют доходы. Одобряю.

а у Вас был похожий кейс чтоли?

Регулярно вижу когда заголовок частично или полностью перевирает суть новости. И это дело рук человека который этот заголовок придумывал опираясь на свои соображения о том как стоит завлекать читателей.

Вас же «бот» опираясь на текст хотя бы не будет врать, тоесть не будет писать в заголовке того что повышает кликбейт, но отсутствует в тексте.

А поскольку в тексте новости обычно напихивают до 50% реферальной информации которая на самом деле никакого отношения к новости не имеет — заголовок может получится вообще адовый (случайный набор слов). Всё, работа сделана, человек прочитал заголовок и прошёл мимо.

имхо, но зато таким образом можно хоть как-то, но гарантировать честность создания тайтла

Если это будет работать так то я только за. Без сарказма.

Москва, Ростов-на-Дону... Де б я ще все це побачив...

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

Ну а самое главное — цель-то какая? Генерировать заголовки, худо-бедно подходящие к тексту статьи? Но эта задача легко решается и без ИИ, тут хватит и ЕИ копирайтера.
Или все-таки нужны заголовки, которые цепляют и побуждают кликать? Вот эта задачка с практической точки куда интереснее. Но и сложнее в реализации (причем сложность тут в том не как обучить модель, а где взять хорошую обучающую выборку).

поинт был в том, чтобы генерировать заголовки именно под наш казахский сайт

А журналіст який написав дану статтю, забув зробити заголовок?

И при этом он обязательно должен быть уникальным?

Нет шансов что тайтлы станут когда-нибудь пиктограммами?

У вас там работы не найдется для меня, хотя бы оплачиваемой стажировки?

Мне 44 года. Я по знакомству хотел. Королевским советником.

сгенерировать довольно интересный тайтл

Качество обобщения и CTR — всё же разные целевые функции.

АБ тест запилили?

Keras свыше 9 дней (на 2080ti);

1) Розмір вихідного заголовку ви задаєте через параметри? Чи як він регулюється?
2) Скільки часу генерується заголовок для новини середнього розміру?

[1] регулируются через параметры в каждом подходе по-своему, которые Вы можете посмотреть в линках, указанные в статье

Чи розділяються речення? Тобто чи здатен keras-text-summarization згенерувати кілька граматично закінченних речення і їх відповідно відокремити один від одного?

Підписатись на коментарі