- PVSM.RU - https://www.pvsm.ru -
Сейчас в прессе часто встречаются новости вида “AI научился писать в стиле автора Х”, или “ML создает искусство”. Посмотрев на это, мы решили – было бы здорово, если эти громкие заявления можно было бы проверить на деле.
Можно ли устроить борьбу ботов по написанию стихотворений? Можно ли сделать из этого понятную и воспроизводимую соревновательную историю? Теперь можно точно сказать, что это возможно. А о том, как написать свой первый алгоритм по генерации стихотворений, читайте дальше.
По условиям конкурса, участникам необходимо построить модель, генерирующую стихи на заданную тему в стиле одного из русских классиков. Тема и автор подаются модели на вход, а на выходе ожидается стихотворение. Полное описание есть в репозитории [10] конкурса.
С темой условия мягкие: это может быть короткое предложение, фраза или несколько слов. Единственное ограничение — на размер: не более 1000 знаков. Темы, на которых будут тестироваться алгоритмы, будут составлены экспертами. Часть тем будет открыта и общедоступна, но для определения лучшего алгоритма будет использован скрытый набор тем.
Глобальная идея соревнования такая: к любому стихотворению можно составить краткую аннотацию из нескольких слов. Давайте покажем на примере.
Если взять отрывок из «Евгения Онегина» А.С. Пушкина [11]:
«…В тот год осенняя погода
Стояла долго на дворе,
Зимы ждала, ждала природа.
Снег выпал только в январе
На третье в ночь. Проснувшись рано,
В окно увидела Татьяна
Поутру побелевший двор,
Куртины, кровли и забор,
На стеклах легкие узоры,
Деревья в зимнем серебре,
Сорок веселых на дворе
И мягко устланные горы
Зимы блистательным ковром.
Все ярко, все бело кругом...» 1823—1830
То кратко содержание его можно уместить в «Татьяна видит в окно первый снег». И тогда идеальная стихотворная модель по этому входу выдаст что-то очень близкое к оригиналу.
Для обучения в этом соревновании предлагается датасет [12] из более чем 3000 произведений пяти известных русских поэтов:
1. Пушкин
2. Есенин
3. Маяковский
4. Блок
5. Тютчев
Алгоритм нужно написать так, чтобы он производил генерацию достаточно быстро и имел необходимый интерфейс. По скорости можно равняться на мощности средних современных ПК. Интерфейс и ограничения подробно описаны в разделе «Формат решений».
Чтобы иметь возможность отслеживать прогресс своих решений, а также сравнивать их с другими решениями участников, на протяжении соревнования будет проходить разметка решений через чат-бот. Результаты работы алгоритмов будут оцениваться по двум критериям:
По каждому критерию будет предоставлена 5-балльная шкала. Алгоритм должен будет сочинить стихи на каждую тему из тестового набора. Темы, на которых будут тестироваться алгоритмы, будут составлены экспертами. Часть тем будет открыта и общедоступна, но для выявления лучшего алгоритма будет использован скрытый набор тем.
Полученное в результате работы алгоритма стихотворение может быть отклонено по следующим причинам:
В отличие от многих, в этом соревновании только один онлайн этап: с 30.07 по 26.08.
На протяжении этого периода можно ежедневно отправлять решения со следующими ограничениями:
Призовой фонд соответствует сложности задачи: первые три места получат 1 000 000 рублей!
Как уже стало понятно, задача нетривиальная, но и не новая. Попробуем разобраться, как же исследователи подходили к решению это задачи раньше? Давайте посмотрим на наиболее интересные подходы к созданию генераторов стихов последних 30 лет.
Этот генератор был полностью автоматизированным. В основе этого подхода большой словарь, фразы из которого выбираются случайным образом, и из них формируются словосочетания по набору грамматических правил. Каждая строка делится на части предложения, а далее случайно заменяется другими словами.
«Лингвистическое моделирование и искусственный интеллект» — так звучит
название моей темы. «Программа, которая сочиняет стихи» — так отвечаю я на
вопросы друзей. «Но ведь подобные программы уже есть?» — говорят мне. «Да — отвечаю я, — но моя отличается тем, что не использует изначальных шаблонов.»
(с) Каганов Л.А.
К 1996 году уже были написаны такие генераторы как:
«Например, в POET.EXE имеется словарь слов с проставленными ударениями и некоторой другой информацией о них, а также задается ритм и указывается какие строки рифмовать (например, 1 и 4). А все эти программы обладают одним общим свойством — они используют шаблоны и заранее подготовленные словари.»
В качестве основных преимуществ можно выделить то, что программа:
Ученые из Китая генерируют стихотворения на своем языке. У них есть живой репозиторий [17] проекта, который может быть полезен в текущем соревновании.
Если очень коротко, то это работает так (ссылка на источник картинки [16]):

Также в 2016 еще одна группа представила свою разработку Hafez [19] (репозиторий тут [20]).
Этот генератор “сочиняет” стихи на заданную тему, используя:
Их алгоритм (ссылка на источник картинки [18]):

Они обучили алгоритм не только на английском, но и на испанском. Обещают, что все должно работать почти везде. Заявление довольно громкое, так что рекомендуем относиться с осторожностью.
Например, вот так слову добавляется морфологическая разметка (ссылка на источник картинки [21]):

Та статья была написана совместно с Ильей Гусевым, у которого есть библиотека для анализа и генерации стихов на русском языке [22] и поэтический корпус русского языка [23].
Соревнование с одной стороны может показаться достаточно сложным, однако для него вполне можно сделать простой, но рабочий бейзлайн [24].
По условию, на вход этой программы поступает идентификатор автора (author_id) и текст темы (seed), в ответ на это модель должна вернуть стихотворение.
Давайте попробуем формализовать тему так, чтобы с ней можно было спокойно оперировать в рамках некоторого векторного семантического пространства. Самый простой выход из этого — получить семантический вектор каждого слова (например, Word2Vec) после чего усреднить их.
Таким образом, мы получаем своеобразный “seed2vec”, который позволяет нам переводить тему в вектор.
На самом деле здесь открывается широкая тема для исследований, т.к. задача выделения темы стоит перед учеными достаточно давно, вот только несколько примеров:
— Выделение топиков через LDA [25]
— lda2vec [26]
— sent2vec [27]
— WMD [28]
Теперь, нужно понять, как использовать author_id для генерации стихотворения именно в стилистике этого автора.
Здесь идея не менее простая: давайте возьмем случайное стихотворение автора из корпуса стихов, после чего будем заменять каждое слово на другое, которое максимально созвучно с оригиналом (имеет одинаковое количество слогов, одинаковое ударение и последние три буквы максимально схожи с оригиналом по расстоянию Левенштейна) и при этом имеет максимально схожий вектор с вектором темы. Например, для темы «Футбол» и строки «И светился как янтарь», выходной строкой может быть «А игрался как вратарь». Таким образом, мы получаем своеобразную стилизацию текста.
В качестве базы слов для замены был использован датасет, который содержит небольшие параграфы текстов из Википедии (описание его использования можно найти в коде бейзлайна на GitHub).
После такой обработки получатся тексты, которые внешне будут напоминать стихи автора, но при этом содержать некоторую тему, которую автор не закладывал.
Результат работы бейзлайна:
Тема: Физика
Стилистика: Блокприведут и висмут единицы
буйвол древних нелинейных сред
я в доске кельвину на частице
свой явлений свой научный вслед
фарадей севилье тараканья
свой тверской теперь изобретшим
среда фонон грань тяготения
позитронный призрак школьный дым
Тема: Математика
Стилистика: Блоккак кружке лейбницу среди идей
кривым и школьным обучаться
но стадо стадо в творчество учиться
кривая для примеры детей
кривые взят пловец знает из гоба
и в планк пройдет и в суд пройдет в сенат
чем дочь колее тем древнее гоба
и сурья исчезающе терпят
пловец весь тень учится над евклидом
заглавие издается и квот
осваивает он скрепляя трудом
профессору учебный анекдот
Очевидно, что бейзлайн не идеален, на то он и бейзлайн.
Можно легко добавить несколько фичей, которые помогут неплохо улучшить генерацию и поднять вас в топе:
Тут можно добавлять еще множество пунктов, на ваше усмотрение.
После того, как модель обучена, в проверяющую систему необходимо отправить код алгоритма, запакованный в ZIP-архив.
Решения запускаются в изолированном окружении при помощи Docker, время и ресурсы для тестирования ограничены. Решение должно отвечать следующим техническим требованиям:
Оно должно быть выполнено в виде HTTP-сервера, доступного по порту 8000, который отвечает на два вида запросов:
GET /ready
На запрос необходимо ответить кодом 200 OK в случае, если решение готово к работе. Любой другой код означает, что решение еще не готово. У алгоритма есть ограниченное время на подготовку к работе, за которое можно прочитать данные с диска, создать в оперативной памяти необходимые структуры данных.
POST /generate/<poet_id>
Запрос на генерацию стихотворения. Идентификатор поэта, в стиле которого необходимо сочинить, указан в URL. Содержимое запроса — JSON с единственным полем seed, содержащим тему сочинения:
{"seed": "регрессия глубокими нейронными сетями"}
В качестве ответа необходимо в отведенное время дать JSON со сгенерированным сочинением в поле poem:
{"poem": "Ведь были сети боевыеnДа говорят еще какиеn..."}
Запрос и ответ должны иметь Content-Type: application/json. Рекомендуется использовать кодировку UTF-8.
Сгенерированное стихотворение (poem) должно удовлетворять формату:
— размер стиха — от 3 до 8 строк
— каждая строка содержит не более 120 символов
— строки разделяются символом n
— пустые строки игнорируются
Тема сочинения (seed) по длине не превышает 1000 символов.
При тестировании используются стили только 5 перечисленных выше избранных поэтов.
Подробная информация по отправке решения в систему с разбором наиболее частых ошибок доступна здесь [30].
Платформа со всей необходимой информацией по этому контесту находится на classic.sberbank.ai [31]. Подробные правила вы найдете здесь [32]. Hа форуме можно получить ответ как по задаче, так и по техническим вопросам, если что-то пойдет не так.

Творческие соревнования ML моделям не даются легко. К задаче генерации стихов подступались многие, но значимого прорыва пока еще нет. Уже сейчас на нашей платформе classic.sberbank.ai участники со всей России соревнуются в решении этой сложной задачи. Надеемся, что решения победителей превзойдут все решения, созданные ранее!
Автор: achertok
Источник [40]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/288837
Ссылки в тексте:
[1] Классик AI: #classic
[2] — Задача участников: #task
[3] — Программа соревнования: #program
[4] Подходы к созданию генераторов стихов: #overview
[5] Программирование искусственного поэта: #AIpoet
[6] — Пример простого поэтического генератора: #example
[7] — Подготовка решения к отправке: #submit
[8] Платформа хакатона: #platform
[9] Ссылки: #links
[10] репозитории: https://github.com/sberbank-ai/classic-ai
[11] «Евгения Онегина» А.С. Пушкина: https://www.ozon.ru/context/detail/id/1344209/
[12] датасет: https://github.com/sberbank-ai/classic-ai/tree/master/data
[13] Scientific American N08, 1989: http://publ.lib.ru/ARCHIVES/V/%27%27V_mire_nauki%27%27/
[14] Леонид Каганов: http://lleo.aha.ru
[15] ссылка : https://lleo.me/soft/text_dip.htm
[16] «Chinese Poetry Generation with Planning based Neural Network»: https://www.researchgate.net/publication/309572681_Chinese_Poetry_Generation_with_Planning_based_Neural_Network
[17] репозиторий: https://github.com/Disiok/poetry-seq2seq
[18] Generating Topical Poetry: https://homes.cs.washington.edu/~yejin/Papers/emnlp16_sonnet.pdf
[19] Hafez: http://xingshi.me/data/pdf/ACL2017demo.pdf
[20] тут: https://github.com/shixing/poem
[21] «Как научить свою нейросеть генерировать стихи»: https://habr.com/post/334046/
[22] библиотека для анализа и генерации стихов на русском языке: https://github.com/IlyaGusev/rupo
[23] поэтический корпус русского языка: https://github.com/IlyaGusev/PoetryCorpus
[24] бейзлайн: https://github.com/sberbank-ai/classic-ai/tree/master/examples/phonetic-baseline
[25] Выделение топиков через LDA: https://arxiv.org/pdf/1711.04305.pdf
[26] lda2vec: https://github.com/cemoody/lda2vec
[27] sent2vec: https://github.com/epfml/sent2vec
[28] WMD: http://proceedings.mlr.press/v37/kusnerb15.pdf
[29] мозг: http://www.braintools.ru
[30] здесь: https://github.com/sberbank-ai/classic-ai#%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0-%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%83
[31] classic.sberbank.ai: https://classic.sberbank.ai
[32] здесь: https://classic.sberbank.ai/static/classic-ai-rules.pdf
[33] Платформа хакатона Классик AI: https://classic.sberbank.ai/
[34] Hafez — Poetry Generation: http://52.24.230.241/poem/
[35] NS+1 «Искусственный Пушкин»: https://nplus1.ru/blog/2017/07/10/poems-by-ai
[36] Generating Poetry with PoetRNN: http://sballas8.github.io/2015/08/11/Poet-RNN.html
[37] Подросток написал искусственный интеллект, который пишет стихи: http://neuronus.com/news-tech/1299-podrostok-napisal-iskusstvennyj-intellekt-kotoryj-pishet-stikhi.html
[38] «Стихи» искусственного интеллекта Google попали в сеть: https://korrespondent.net/lifestyle/3682288-stykhy-yskusstvennoho-yntellekta-Google-popaly-v-set
[39] Кибер-поэзия и кибер-проза: совсем чуть-чуть искусственного интеллекта: https://xakep.ru/2008/06/03/43893/
[40] Источник: https://habr.com/post/419745/?utm_campaign=419745
Нажмите здесь для печати.