Когда становится совсем нечего читать, открывать книгу не хочется, все статьи на Хабре прочитаны, все нотификации на телефоне обработаны, и даже просмотрен спам в ящиках, я открываю Ленту.ру. У моей жены — профессионального журналиста — в такие моменты начинается аллергия, и понятно, почему. После того, как в 2014 году из Ленты ушла старая команда, уровень желтизны издания пошел вверх, а качество текста и редактуры — вниз. Со временем, периодически по инерции продолжая читать Ленту, я стал замечать, что модели заголовков новостей повторяются: «Обнаружено [вставить псевдо-сенсацию]», «Путин [что-то сделал]», «Безработный москвич [описание его приключений]» и так далее. Это была первая вводная.
Вторая вводная — недавно случайно нашел забавный отечественный аналог @DeepDrumph (это твиттер, в котором выкладываются фразы, сгенерированные нейросетью на основе официального твиттера Трампа) — @neuromzan. К сожалению, автор прекратил выкладывать новые твиты и затаился, но описание идеи сохранилось здесь.
И пришла идея, почему бы не сделать такую же штуку, но на основе заголовков Ленты.ру? Может получиться не менее забавно, учитывая уровень абсурдности некоторых настоящих заголовков на этом ресурсе.
Замечание: здесь рассматривается именно задача генерации последующего текста на основе некоторого вводного. Это не задача Text Summarization, когда, например, на основе текста новости генерируется ее заголовок. Текст новости в моем случае вообще никак не используется.
Данные
Перспектива скачивать и парсить весь контент Ленты меня совсем не радовала, и я стал искать, не делал ли кто уже это до меня. И мне повезло: как раз за несколько дней до того, как у меня появилась эта идея, Ильдар Габдрахманов ildarchegg выложил пост, где он описывает, как граббил контент Ленты, и делится полным архивом. В конце он добавляет «Надеюсь, что кто-то посчитает эти данные интересными и сможет найти им применение.» Конечно! У меня уже есть применение! Спасибо тебе, Ильдар! Твои усилия сэкономили мне несколько дней!
Итак, берем этот архив и выдергиваем оттуда статьи за нужный нам период: с 01.04.2014 (когда ушла старая команда) по настоящее время. Подробно на предварительной обработке данных я останавливаться не буду. Кому интересно, в репозитории на Гитхабе есть отдельный ноутбук с пошаговым описанием процесса.
Первая попытка обучения — Char-RNN
Судя по указанной выше статье, автор neuromzan’а использовал архитектуру Char-RNN, описанную Андреем Карпаты (Andrej Karpathy) в его уже ставшей легендарной статье "The Unreasonable Effectiveness of Recurrent Neural Networks". Давайте попробуем решить нашу задачу с помощью этого подхода. Реализацию Char-RNN под разные языки и фреймворки можно легко найти в интернете. Я взял вот эту — на Keras она получается довольно компактной. Немного модифицировав ее под свои нужды (изменил гиперпараметры и добавил сохранение результатов и более информативный вывод), я запустил обучение.
И результаты меня не порадовали. Идея Char-RNN в том, что сеть учится предсказывать следующий символ на основе N предыдущих. То есть сети в качестве входных данных подается некоторый исходный текст, а дальнейший текст генерируется посимвольно. Поэтому, чтобы научиться писать относительно читабельные тексты, сеть должна:
- Научиться отделять последовательности символов (псевдо-слова) пробелами и иногда ставить точку;
- Научиться генерировать последовательности символов, похожие на настоящие слова;
- Научиться генерировать похожие на настоящие слова с учетом предыдущих почти настоящих слов.
Вот что получилось с двухслойной сетью с 64 LSTM-ячейками, обученной на ограниченном наборе заголовков (<800). В квадратных скобках — вводный текст для сети, генерируем следующие 150 символов:
1 эпоха: "[грязи в стокгольме . названа причина массового сам]ииоеал стаа и ата еааир онсст рррв аитислт и ио о и скд ииау р п .аа итео ли таи уеаа сао аоеи сооааои лртаип оооа лаае о соа ра тлс от";
2 эпоха: "[о прокомментировал слухи об отстранении россии от ]п ма и во роги . по га мо по по к кал ы та поникита ги . о си кай вав пе петбого . па рака с меры пали ва са па . вока са и . ва 2а с ра по в слило и";
3 эпоха: "[лнении плана по ремонту дорог . в якутии девушка и] подра праттонго пробилерей в постедела . сралива . порграны . престрасий придали пелелия . редодной . сотурика . прусбиря . в россирей . в подирачили";
4 эпоха: "[ую шкуру . кэаз: продукция , которая эффективно за] ворое за полита . дона семе ацерика в советили полино . кий рассии в кодат нашрет с на ды пой подо пояли рассийский за в подовали ресскию уна помода ";
5 эпоха: "[экс - чемпиона мира . маккейн раскритиковал трампа]ни . покодила . придовов разнал российский из ради . воростия . в начил подровать . подовых борту . в примозного об ан дто . ав россия боль . маниц . ";
...
25 эпоха: "[а произошло землетрясение магнитудой 7,2. британка]м приходах полицию пообещала за поставшую собчак за глупеледователеся в москве. подмосковные самое ископью мир-стали. колян признался кратите шезвым м";
...
50 эпоха: "[итета олимпиады - 2018 прокомментировал возможное ]полицейские с горовулеской заглаку у наслучать бесажно с кубанского банки в сообщили о вклачуют признили встревахся в петербурге оказались новый сборн"
Дальше обучать не стал. Получается какой-то бред. Да, это похоже на фразы, где есть слова, отделенные пробелами и заканчивающиеся точками. Некоторые “слова” даже являются настоящими словами из русского языка. Но читать это невозможно, и это совсем не похоже на те красивые и смешные реплики, которые были во вдохновивших меня примерах. Изменение гиперпараметров практически никак не сказалось на качестве. Обучение на полном датасете также не сильно улучшило результаты. Возможно, эти товарищи обучали сеть гораздо дольше, добавляли больше слоев и делали их шире, но я решил попробовать другой подход.
Альтернативный метод — Word Embeddings
Я вспомнил, что чуть менее года назад на курсе Udacity Deep Learning Foundation у меня было задание — написать сеть, которая бы генерировала сценарий к Симпсонам (конкретнее, одну сцену в таверне у Мо), взяв для обучения оригинальные сценарии аналогичных сцен из 25 сезонов мультфильма. В этом случае использовался другой подход — Word Embeddings, когда текст генерируется не посимвольно, а по словам, но тоже на основе распределения вероятностей появления определенных слов при заданных [1..N] предыдущих словах.
Этот подход имеет ряд существенных преимуществ перед Char-RNN:
- Сети не нужно учиться генерировать слова — они уже сами по себе являются атомарными элементами, соответственно, сгенерированные фразы изначально будут состоять только из слов из нашего корпуса, не будет ненастоящих слов;
- Слова во фразах лучше согласуются друг с другом, потому что для набора слов {«в», «на», «поехал», «машине», «машину»} большей суммарной вероятностью будет обладать последовательность [«поехал», «на», «машине»], чем [«поехал», «в», «машину»].
- Выше скорость обучения, т.к. для одного и того же корпуса для Char-RNN токенами будут являться символы, а для Word Embeddings — слова. Количество слов в тексте заведомо меньше, чем символов, а для машины что в первом, что во втором случае токен — просто индекс в словаре. Соответственно, за одну итерацию Word Embeddings нужно будет обработать гораздо меньше токенов, чем Char-RNN, и времени на это потребуется примерно пропорционально меньше.
Быстрая проверка гипотезы на ограниченном датасете (те же 2 слоя и 64 ячейки LSTM, генерируем 100 следующих токенов):
Эпоха 1: "[макгрегор]...................................................................................................."
...
Эпоха 4: "[макгрегор]... гигантский двойников.. попросили правительство правительство...... facebook........... попросили.......... попросили............... попросили.... попросили...... попросили. попросили......... пользователей. попросили........... боевой попросили попросили попросили..."
...
Эпоха 10: "[макгрегор]. алексей кадры янин пожиратель двойников техники. иркутск техники в в. в. в.. защитить собственный соглашения пользователей iphone8. в... полиция автоматического. гей-партнерстве. джона продажи через соцсеть. савченко. пост возможность в. продлить победа правительство продлить крыма.. от с. продление мира в. для ветераны правительство продлить о.. с facebook в иркутск для в в в продажи кредит. россии. выполнять соглашения по по петербурга. иркутск олимпиаде. покажут facebook в. android. в. мир. на. От"
...
Эпоха 20: "[макгрегор]. опубликованы кадры выброски боевой техники с воздуха в рязанской в рязанской в. россии собственный защитившего арнольд российской авиатехникой. защитившего техники в рио. моргана моргана. моргана мир в ральф лорен надел в в россии. индия российской 12. на арнольд мира в рио. рио.. назвал для. выполнять первый музей крыма. против проект. иркутск для в моргана против крыма. моргана. android от питтсбург авиатехникой. минэкономразвития крыма правительство крыма. гей-партнерстве против санкций. моргана. для в против крыма. россии. продлить мира на выполнять заходили"
Итак, что тут происходит. На первой эпохе сеть видит, что один из самых часто встречающихся токенов — точка. «А давай-ка я везде понаставлю точек, раз у нее такая высокая частота», — думает она, и получает гигантскую ошибку. Затем она еще пару итераций сомневается, и на 4-й решает, что между точками стоит вставлять какие-нибудь слова. «Ого! Ошибка стала меньше», — радуется сеть, — «Надо продолжить в этом духе, будем вставлять разные слова, но мне очень нравятся точки, поэтому пока я продолжу их ставить». И продолжает ставить точки, разбавляя их словами. Постепенно она понимает, что чаще стоит ставить слова, чем точки, причем некоторые слова должны идти недалеко друг от друга, например она запоминает некоторые отрывки из датасета: «правительство продлить», «выполнять соглашения», «пожиратель двойников» и т.п. К 20 эпохе она уже помнит довольно длинные фразы, типа «опубликованы кадры выброски боевой техники с воздуха». И это показывает, что в принципе подход работает, но на таком маленьком наборе данных сеть довольно быстро переобучается (даже несмотря на dropout), и вместо уникальных фраз выдает заученные.
Посмотрим, что будет, если обучить ее на полном наборе заголовков:
Эпоха 1: "[визажисты] в сша после ссоры с подругой.. девять национализированного украиной приватбанка попросился в отставку. генсек нато похвалил летчиков за перехваты над балтикой. дочка шоколадницы наблюдателей в мире в университете в таиланде после ссоры с подругой. сша заявили об отказе шотландская школьница подлила в подготовке госпереворота. стальная плоть. дк продуктов в париж. девять друзей тесака. в футляр для альта соперницы кислоту. в совфеде предложили дк зил. девять друзей тесака. в новая для ссоры с подругой. сша заявили об отказе объяснено отсутствие антивещества во вселенной. тесак получил 10 лет"
...
Эпоха 5: "[визажисты] в ньюкасле. несвобода вместо свободы. швеция пригласила на вокзалах при ниже 59 рублей. в германии ограничили возможность предвыборных выступлений иностранных политиков. литовский туроператор дать балашихе о часы в свою жизнь. подругу-гадалку слухи о попавшем в плен на воду forbes и путина. тесак получил 10 посетить человек. российских туристов в доминикане выросло в 300. захарова рассказала путина остановить земельный имиджа мире в дтп с такси. путин стали в почти 3 миллиона долларов на неподходящий камуфляж. в хабаровском опекуне-педофиле. власти кндр отказалась от формирования совместной с южной иванушек. резцова рассказала"
…
Эпоха 10: “[визажисты] погиб. велосипедист в буденновске на человека в погибли без перелета. стальная плоть. лесного продажи халифата ввести самые распространенные наркотики в российском tor. в подмосковье. найдена новая опасность солнцезащитных кремов. врачи отговорили горбачева от поездки на прощание с колем. минимальный набор продуктов в россии резко подорожал почти до 72 лет. вирус третьей компанией в турции. приедут архитекторы из россии. слуцкий назвал причину пообещали своем слова об обысках в москве череповца. в нато выразили обеспокоенность растущей военной возможность встречи трампа и съемки репортажа о кражах. забытого матерью в песочнице грудного”
Здесь хватило всего 10 эпох, чтобы loss перестал уменьшаться. Как видим, в этом случае сеть также заучила некоторые довольно длинные куски, но при этом, есть и много относительно оригинальных фраз. Часто можно видеть, как сеть создает длинные фразы из других длинных, например вот так: «тиньков назвал дурова быдлом и публично стер telegram» + «пьяный москвич угнал трактор и попал в дтп с такси» = «пьяный москвич угнал трактор и публично стер telegram».
Однако, все равно, в большинстве случаев фразы получаются не такими красивыми, как у DeepDrumph и neuromzan. Что же тут не так? Нужно обучать дольше, глубже и шире? И тут на меня снизошло озарение. Нет, эти ребята не нашли магическую архитектуру, выдающую красивые тексты. Они просто генерят длинные тексты, отбирают потенциально смешные куски и вручную их редактируют! Финальное слово за человеком — вот в чем секрет!
После некоторой ручной правки можно получить вполне приемлемые варианты:
- «в отреагировал. песков продажи возможность заммэра» >>> «песков отреагировал на возможность продажи должности заммэра»
- «вице-спикера сочли человек» >>> «вице-спикера сочли человеком»
- «депутат лебедев признал неуместным предложение предложение убийстве» >>> «депутат лебедев признал неуместным предложение об убийстве»
… и так далее.
Здесь есть еще один важный момент, связанный с русским языком. Генерировать фразы для русского языка гораздо сложнее, потому что слова и фразы в предложении нужно согласовывать. В английском, конечно, тоже, но в гораздо меньшей степени. Вот пример:
«машина» >>> «car»
«на машине» >>> «by car»
«вижу машину» >>> «see the car»
То есть в английском слово в разных падежах — один и тот же токен с точки зрения сети, а в русском — разные за счет отличающихся окончаний и других частей слова. Поэтому результаты работы модели на английском языке выглядят более правдоподобными, чем на русском. Можно, конечно, лемматизировать слова в русском корпусе, но тогда и сгенерированный текст будет состоять из таких слов, и здесь уж точно без ручного допиливания не обойтись. К слову, я попробовал сделать это, используя модуль pymorphy2, но результат, на мой личный взгляд, был местами даже хуже, несмотря на то, что количество уникальных токенов (слов) после нормализации сократилось более чем в 2 раза. После 20 эпох результат был такой:
“[звездный]. минфин отказать экономика россия по волейбол. для должник по волейбол. греция пообещать побывать в сжр побывать в побывать в отскок. греция пообещать побывать. в красноярск греция пообещать побывать в русало. для должник по волейбол. в отскок. песок. в россия. индия оснастить собственный авианосец российский авиатехника. песок песок. в россия. греция пообещать побывать в рио. ральф лорен надеть на facebook с мобильный.. в рязанский область. российский пшеница подорожать. в россия. в россия появиться один музей солженицын.. украинец попросить правительство вывесить”
Также можно заметить, что часто теряется первоначальное значение слова. Например, в приведенном выше отрывке фамилию “Песков” pymorphy нормализовал в слово “песок” — серьезная потеря для всего корпуса.
Выводы
- Word Embeddings гораздо лучше справляется с генерацией текста, чем Char-RNN;
- При прочих равных качество генерации английского текста в общем случае выше, чем русского, из-за особенностей языков;
- Когда вы слышите о том, что ИИ написал книгу (как это было на днях, когда объявили что алгоритм написал книгу о Гарри Поттере, делите это утверждение на 1000, потому что, скорее всего, алгоритм лишь мог 1) сгенерировать имена и описания персонажей, или 2) сгенерировать общую канву повествования, или 3) сгенерировать полуабсурдный текст, который потом долго и упорно правили и согласовывали люди-редакторы. Либо все это вместе взятое. Но уж точно ИИ не писал книгу от первого до последнего слова. Не на том уровне развития еще наши технологии.
Десерт
Ну и в конце некоторые перлы после ручных правок, как мне кажется, вполне в духе Ленты.ру:
- Минфин отказался от вечеринки в Рязанской области
- Australian отвергла возможность iPhone8 на Android
- Иркутск оставили без воздуха
- Полиция Петербурга против мира Петербурга
- В Китае начались продажи должников
- Минэкономразвития сообщило о гей-партнерстве против санкций
- Греция выступила с мишкой
- Путин помирился с музеем и с Солженицыным
- Голый турист погиб в Буденновске
- Врачи отговорили Горбачева от поездки на прощание с проблемами в области работорговли
- В Британии задумались полуфинальные пары Кубка Конфедераций
- Депутат Лебедев признал неуместным предложение оштрафовать такси
- В Совфеде предложили выбирать почетных Леопольдов
- Вице-спикер Думы обосновал предложение о подготовке госпереворота
- Литовские онкологи в Москве приступили к лечению
- ЦБ выделит деньги на починку каменного пениса тролля
- Снимавшимся в кино сложнее прилично шутить о новой подмосковной ведущей
- Нетрезвый задержанный спровоцировал Госдуму
- Израиль ответил кислотой в лицо
- Глава ФРС США пообещала отсутствие кремов
- Проблему бараков в Ижевске решили через постель
- На Ямале кречеты впервые вывели потомство от самолета Евровидения
- Подмосковье за год потратит больше Бразилии
- У берегов Ливии такси из Иванушек
- Опубликовано число погибших при крушении туристического судна в Раде
- Ким Кардашьян обвинили в подготовке еще одной химической атаки
- Правительство пообещало отсутствие денег на внутренние дела России
- Тысячу вожатых подготовили для работы в России
- Брейвик пожаловался на обстрел своей территории авиаударом
- США потребовали дать в морду Жиркову
- Петербуржец-шизофреник предупредил о считанных днях до блокировки Telegram
Код с ноутбуками и комментариями выложен на Гитхабе. Там же есть предобученная сеть, скрипт для генерации текста (lenta_ai.py) и инструкции по использованию. В 99% случаев вы будете получать бессмысленные наборы слов, и лишь изредка будет попадаться что-то интересное. Ну а если вам хочется “просто посмотреть”, я запустил маленькое веб-приложение на heroku, где можно погенерить заголовки без запуска кода у себя на машине.
Комментарии (38)
sena
21.12.2017 01:02Я тоже заметил резкое падение уровня на ленте. А куда ушла старая команда?
acmnu
21.12.2017 10:30При чем на самом деле резкое падение случалось в последние 2-3 месяца. С 2014 года было плавное снижение, а вот сейчас явно редакторская политика.
mapron
21.12.2017 18:28Да, я тоже что-то в прошлом году не помню обилия постов «ученые выяснили, к чему приводит секс» и все в таком духе.
KaMax
21.12.2017 07:18Тоже развлекался с этой темой… Интересно бы почитать о принципах подбора параметров для разных типов сетей. (кол-во слоев, нейронов, размерность вектора для embedding)
voice32 Автор
21.12.2017 12:22В ноутбуках на гитхабе я пробовал разные конфигурации (кол-во слоев, их размер), но все они давали примерно одинаковые результаты. Если есть желание, можете попробовать более глубокую сеть сделать — там нужно лишь изменить гиперпараметры и немного поправить код. Я пробовал и 3 скрытых слоя с 256 ячейками в каждом, но в этом случае сеть начала просто запоминать заголовки, даже с дропаутом.
KaMax
21.12.2017 12:59Ну вот я о том же… Может наталкивались на какие-то теории касательно этого?
По моим ощущениям, в моем случае, при работе со словами как символами мне, как минимум, не хватало корпуса текстов для обучения. Я пытался сократить словарь разбивая слова на «основу» и «окончание» и использовать их как отдельные символы или даже делать отдельные сетки на «основы» и «окончания» и потом из них собирать… пробовал разбивать просто на «псевдослоги» и т.п. Вобщем, всячески пытался уменьшить размер словаря, т.к., ИМХО, соотношение размера корпуса текстов к словарю нужно максимизировать.
Но так пока и не понял принципа подбора размеров сетей и кол-ва слоев от размера словаря, к примеру.
Еще пробовал играться с сеткой seq2seq. Тоже, неплохие результаты, но хорошими их не назовешь :)voice32 Автор
21.12.2017 14:59Здесь наверно сначала стоит решить, что мы хотим улучшить?
Это может быть более точная формулировка смысла, или просто лучшая согласованность слов в предложении, или еще что-то… И в любом случае, размер сети вряд ли здесь будет определяющим фактором. Я написал, что пробовал, например, приводить слова в нормальную форму. Но это ничего не дало.
Скорее, понадобится больше пре- и пост-обработки.
Например, в для смысла необходимо будет использовать семантически размеченные корпусы (они есть, но это работа в процессе). Для согласования слов можно попробовать поиграться с pymorphy2, но тут опять же нужна семантика, разбор предложения на части, выделение иерархии, чтобы согласование проводить по подчинительным связям.
В общем, мне кажется, что в плане повышения качества генерации я уперся в потолок, а дальше моих знаний NLP пока не достаточно, чтобы проделать то, что я описал выше.Mendel
21.12.2017 15:11выделение иерархии, чтобы согласование проводить по подчинительным связям
ИМХО вот это вот как раз и не нужно.
Наш девиз — проще, выше, умнее.
AOT безусловно молодцы, но не стоит усложнять. Нам не нужно понять смысл, нам нужно сгенерить правдоподобный текст. Максимум генерить текст в контексте чего-то из реального мира (например генерить новости по курсу биткоина или другому хайпу). Гораздо больший эффект даст доработка словаря (Пескова думаю в большинстве морфологических словарей не будет, и его если и разберут, то как кузявую калушку).
KaMax
21.12.2017 15:53Ну, размер, тип используемых сетей и другие параметры, на мой взгляд, все-таки важны, как и данные на которых учить. У меня, игры с кол-вом слоев LSTM и их размерами, добавление туда Embedding слоя и игры с его размерами давали отличные(разные) результаты, но проследить понятную закономерность я не смог.
Меня напрягает, что я смотрю на все это, фактически, как на черный ящик… Нет, я поверхностно понимаю основные принципы слов NN, RNN, embedding, LSTM и т.п., но как подбирать их комбинации и их параметры это для меня открытый вопрос, и что-то я пока понятных материалов по этому поводу не нашел…
И в приложении к этой или похожей задаче, ооочень не хочется выходить за рамки NN. Даже привлекать pymorphy2 не хотелось бы, в конце-концов, слабо нейронке самостоятельно найти закономерности согласования слов в предложении :)
Еще, мне видится, что нужно частично задействовать идею из seq2seq, т.е. работа, в некотором роде, со смыслами фраз.
Но, вот тоже уперся в потолок знаний.Mendel
21.12.2017 16:37И в приложении к этой или похожей задаче, ооочень не хочется выходить за рамки NN. Даже привлекать pymorphy2 не хотелось бы, в конце-концов, слабо нейронке самостоятельно найти закономерности согласования слов в предложении :)
Вы ошибаетесь.
Человек при работе с текстом/речью пользуется большим массивом знаний которые полностью отсутствуют в тексте. Не только в текущем тексте, но в том числе и в обучающем корпусе. Даже сферическая «идеальная сеть» не сможет решить эту задачу. А наши сети не идеальные. Например живая сеть оперирует импульсами а мы плавным аналоговым сигналом (ну или квантованным, но все равно в сравнении с биологическим меандром — плавным). Обычно мы проводим аналогию между частотой импульсов живой сети и не учитываем их комбинации.
Это еще больше убивает информацию в сети.
В общем без дополнительного источника информации (морфологический разбор, который суть размеченная база морфологических признаков, т.е. по сути предобученная морфологии сеть) ничего путного не выйдет.
Про детерминированность кратко:
Пусть у нас есть база неких анкет на которых мы хотим научиться предсказывать два признака — пол человека и цвет его кожи.
Допустим у нас есть только эти четыре входа:
а) Мужчина
б) Женщина
в) Черный
г) Белый
Допустим на вход из всех возможных вариантов (урезаю заготовку статьи) у нас есть только четыре, и они встречаются с такими вероятностями:
2 — мужчина, черный — 40%
3 — мужчина, белый — 10%
9 — женщина, белый — 40%
10 — женщина, черный — 10%
Тогда мы получаем такой ответ:
50% что это мужчина,
50% что это женщина,
50% что белый,
50% что черный.
Хотя более глубокая интерпретация дала бы нам ответ «с 80% вероятностью у нас или черный мужчина или белая женщина».
Ну или давайте возьмем такую комбинацию:
2 — мужчина, черный — 40%
3 — женщина (цвет кожи неизвестен)— 10%
9 — женщина, белый — 40%
10 — черный (пол неизвестен) — 10%
Мужчина — 40%
Женщина — 50%
Черный — 50%
Белый — 40%
т.е. с небольшим перевесом у нас побеждает вариант «черная женщина».
А такого варианта у нас вообще нет. Это химера.
Правильный ответ «с 90% вероятностью у нас или черный мужчина или белая женщина».
Victor_Grigoryev
21.12.2017 07:19-1Автор, полегче, так можно оставить без работы хаброгиктаймовских редакторов-копипастеров!
levap
21.12.2017 10:15Ну что, теперь дело за основным текстом новостей! Мне кажется, здесь тоже можно добиться успеха :)
SystemXFiles
21.12.2017 10:26Хорошо бы сделать генератор заголовков на основе текста новости, вот это действительно будет полезный инструмент.
voice32 Автор
21.12.2017 11:36Эта задача (которую я упоминаю в начале статьи) — text summarization — действительно имеет гораздо большую практическую ценность. В этой области уже довольно много наработок, есть готовые алгоритмы и даже онлайн инструменты (вбейте automatic text summarization в гугле). И я согласен, что это логичный следующий шаг. Осталось найти на это время :)
Надеюсь, что в сообществе найдутся люди, которые этим займутся. Датасет есть, теперь дело в технике.
fatronix
22.12.2017 11:58На реддите есть бот, который формирует вырезки важной информации из текста новостей.В среднем сокращает на 60-70%.
mazahakajay
21.12.2017 13:43«Brioni получил гран-при азербайджана»
«Теннисист порошенко обвинил авакова в подготовке госпереворота»
«Полицейского-молодожена свою фирменную полоску» — это как в анекдоте про гранату.
«Комик определили девять друзей тесака»
«Кетчуп санкциями из-за поломки лайнера»
Ну и конечно мое любимое: «Пупырышка-гройсман в гонке кибератаки». Это так мило. А главное, что практически все заголовки очень актуальны. И санкции вам! И кибератаки!
Спасибо автору! Теперь я знаю как они это делают )
Mendel
21.12.2017 14:29Для увеличения «семантичности» выдачи (все время вспоминается как адвего у меня передрали статистический анализ текстов и назвали его «семантический анализатор») нужно работать с морфологией и словосочетаниями.
Промежуточной проблемой будет морфологическая омонимия.
Как красиво подавать на вход морфологическую омонимию в детерминированной сети я даже и не знаю. Если просто сложить все морфемы всех вариантов слова (с учетом весов вертоятности) то мы получим смешанный образ.
Возможно такая сеть могла бы отдельно помочь с морфологической омонимией, а уже после отработки омонимии обучать для генерации…
Мысли вслух — морфология дальше границы фразы не распространяется, так что на первом этапе банально разбираем обучающую выборку на фразы. Далее натравливаем морфологический анализатор на наши слова. Из полученных массивов слов с учетом весов (если нет весов, то условно тем вариантам которые идут дальше даем меньше вес, делим на все варианты условные 100%, чтобы у слова у которого только один вариант было 100% веса) создаем все возможные комбинации размеченных слов в фразе (т.е. все варианты разбора фразы) с учетом весов (перемножаем веса входящих слов).
Из полученного набора фраз убираем сами слова, оставляя только наборы морфем.
На этом массиве обучаем сетку.
Далее уже с помощью этой сетки улучшаем разметку морфем у входного текста (по сути снижаем «шум» сигнала, выбирая более вероятный вариант морфологии с учетом контекста).
Это поможет значительно снизить проблему «Песков=>песок».
Что меня явно здесь смущает так это первое слово фразы. У него реально нет контекста (прошлая фраза плохой контекст, его лучше игнорировать), хотя по факту следующие за ним слова тоже могли бы помочь. Единственное что приходит в голову это сделать две сети, обучаемые слева-направо и справа-налево. Ну и складывать/умножать их ответы. Нужен эксперимент.
По словосочетаниям я несколько в сомнениях. С одной стороны это значимая семантическая единица, и их было бы неплохо выделять. С другой стороны выделение здесь банальное — превышение частоты взаимной встречи определенного порога и соответствие некоему шаблону морфологической согласованности. И скорее всего такие вещи сеть сможет отследить сама, без нашего вмешательства.
В идеале было бы скармливать текст сети в виде слова со всеми его морфологическими признаками, и получать на выходе слово плюс морфемы и уже это приводить к согласованной форме, но я не уверен что морфологическая библиотека потянет подобные «кузявые калушата». Отдельная сетка под это дело (на подобии первой, с буквами) была бы самое то, но увеличит сложность разработки.
ПС: Если удастся просто и эффективно решить проблему морфологической омонимии, то это уже будет отличным практическим применением.voice32 Автор
21.12.2017 15:55Спасибо за конструктивный комментарий.
По поводу учета морфологии — отличная идея! Вполне возможно обучить еще одну сеть только на наборах морфем, а затем соединять результаты сети, работающей со словами, с результатами работающей с морфемами, и получать более красивые результаты. Единственное, что сходу приходит в голову — вероятность переобучиться становится выше. Но это решаемо.
Случайный выбор первого слова фразы сделан для простоты. Обычно заголовки очень короткие — 3-7 слов, и если задавать контекст несколькими словами, то заголовки либо будут выходить длинными, либо не останется пространства для фантазии для сети. Более длинная входная строка скорее применима для генерации самой новости по заголовку.
И да, обучение еще одной сети «справа-налево» тоже могло бы дать более интересные результаты.
В общем, простор для дальнейших исследований большой. Одному (тем более с моими ограниченными знаниями в области комп.лингвистики) это не осилить, так что надеюсь, что найдутся желающие и поделятся результатами. :)Mendel
21.12.2017 16:41Я предлагал обучение в обратную сторону для того чтобы иметь возможность по контексту разрешать морфологическую омонимию не только для следующих слов, но и для первого (ну и последующим тоже контекст следующего за ним слова будет полезным). Для генерации проще — можно первому слову задать сразу его морфологические свойства и не заморачиваться.
DanAnastasyev
21.12.2017 17:35Вообще говоря, мы пробовали добавлять морфологию в своем генераторе поэзии: https://habrahabr.ru/post/334046/
Очень даже хороший прирост качества сгенерированного был. Там есть ссылка на репозиторий с сетью — можно попробовать её за основу взять. У нас сеть училась на очень специфичных стихах — даже интересно, что получится при обучении на заголовках :)
KaMax
21.12.2017 16:07Мысли вслух, очень грубыми штрихами… Если абстрагироваться — человеку приходит мысль(образ), после этого он подбирает под нее слова и строит из них фразу. Обратный процесс тоже работает. Близко к этому алгоритму работают алгоритмы перевода у гугла(если не ошибаюсь) и есть упрощенная готовая схема seq2seq…
И согласование слов дать на откуп NN, вопрос только на чем и как учить…Mendel
21.12.2017 16:51Ну размеченных корпусов полно.
Но как-то не особо выходит.
ИМХО одной из причин усложняющих задачу является то, что наши сети детерминированные, а биологические нет. Это лишает возможности сделать хорошую обратную связь между разными уровнями. Например в вашем случае — выбрал слова, но на этапе построения фразы понял что это слово плохо сочетается с другим словом. Заменил его на другое, ведь у нас не просто выбор самого весомого, а сразу все варианты слов идут.
Вообще в вопросе построения фраз мне нравится наблюдать за детьми.
Например у моего младшего (2,5лет) есть устойчивое выражение — «открой мне», которое «по-русски» означает «отпусти меня». Но даже на детском диалекте оно вполне себе понятно… в контексте. Когда у него вырастет словарный запас его сеть будет по прежнему предлагать ему и этот вариант, но более правильный будет перевешивать.
Вместе с тем если не давать человеку контекста то интерпретация фразы будет невозможна:
1) «я взял ребенка на руки, чтобы он не баловался со спичками, и он мне сказал: Открой мне!» — в принципе можно догадаться что имеется ввиду «отпусти меня»
2) «ребенок сказал: открой мне!» — скорее всего мы поймем что ребенок просит открыть что-то что ему дали или он взял. Конфету, сок и т.п.
3) «ребенок 2,5 лет сказал: открой мне!» — наверное просит что-то открыть, но может вообще «молись и кайся»… если что-то похожее встречалось в опыте, то будет два варианта — или открыть что-то, или отпустить. Но без контекста выбрать не удастся.
Ну а контекст уже у другой сети (в другом полушарии, в другой зоне мозга, на другом чипе, в другом слое — не суть). Он даже вполне может быть. Но в другой сети. И мы его потеряли выбрав одну интерпретацию.
hdfan2
21.12.2017 15:07Неплохо, но до истинных шедевров типа «Из читинского цирка сбежал депрессивный хорек с друзьями» ещё далеко.
fatronix
«Дизайнеры превратили людей с рептилоидами»
Жаль, не написано, в кого.
«Тяжеловато колумбии и фбк»
«Источник рассказал о сторонниках россии на повышение производительности труда»
Symphel
Не, до ленты не дотягивает. Только что: 17:27 Жена полковника Захарченко оказалась успешным бухгалтером с конем