.NET Fest: полная программа конференции на сайте. Присоединяйся к самому большому .NET ивенту
×Закрыть

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

Всем привет! Меня зовут Виктор Трохименко. Я — Data Scientist в компании 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, эту модель мы хотели просто затестить).

Литература

LinkedIn

30 комментариев

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

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

извините, каким вообще боком Ваш этот «прекрасный» коммент относится к этой статье?

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

и к чему этот коммент? как он относится к статье то?

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

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

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

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

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

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

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

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

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

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

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

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

удивительные города, впрочем как и все остальные города России

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

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

[0] спасибо за замечание по бэку для кераса. как Вы знаете, то почти всегда юзается на бэке кераса тф, вот и не стал указывать его. также после чистого тф был рассмотрен вариант на керасе, вот и подумал что логично что на бэке использовался тф

ну о ии еще рано говорить как по мне, не так ли? ведь еще даже нет вменяемого его определения. пока только мл, дл и тп. но не суть

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

[2] данная модель только выкатывается в прод; так что о результатах, к сожалению, пока ничего сказать не можем. но когда мы просматривали сами глазами, то большинство заголовков были действительно интересными, на которые хотелось бы так сказать кликнуть.

[3] да, Вы правы, собрать годную выборку это еще та задача

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

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

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

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

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

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

Вы к тому, чтобы вместо слов делать одни пиктограммы?
если Вы об этом, то такое уже делают, в тех же месенджерах

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

welcome to gen.tech
там есть таб «карьера», где Вы можете увидеть все наши открытые вакансии

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

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

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

согласен. скоро будем реально знать наш ctr, вот там и посмотрим что к чему тогда

почти все уже готово чтобы выкатить по-красоте в прод

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

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

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

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

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

в принципе да. но как Вы понимаете, все зависит от таргета в датасете. нам достаточно было делать просто одно предложение для тайтла. цели не стояло сделать несколько предложений одновременно

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