Як ми створювали новинні заголовки російською мовою з допомогою 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 млн записів з наступними ознаками: «заголовок» і «текст», як показано нижче:

Збір даних

Дані складаються з декількох частин:

Попередня обробка

Для попередньої обробки використовувалися різні операції з регулярними виразами. Наприклад:

Моделі

У цій частині ми хотіли б описати всі наші підходи до ВІД. Почнемо з простих моделей, так би мовити, «з коробки», а потім перейдемо до більш складним.

Рішення «з коробки»

Насправді існує досить багато таких рішень, але ми зупинилися на двох з них більш-менш відповідають: 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. Ми вирішили зупинитися на цьому варіанті, тому що, на нашу думку, він показав результат, який ближче до ідеального, ніж у всіх інших.
Трохи часу для навчання цих моделей:

Література

Опубліковано: 23/05/19 @ 10:00
Розділ Блоги

Рекомендуємо:

Чому я вибрала Project Management і не помилилася. Поради тим, хто роздумує
5 книг про побудову сильної команди від Олени Кравченко, Program Manager в Luxoft
День вишиванки 2019 в українських IT-компаніях
Кейс: Виведення сайту будинку престарілих в Києві в лідери ніші
PHP дайджест #20: PHP в 2019, прийняті RFC, 7.4 вже вийшов