NaNoGenMo: як комп'ютери пишуть новели

Листопад вважається місяцем літературної творчості. Щороку в інтернеті проходить захід NaNoWriMo (National Novel Writing Month). Учасники повинні до кінця місяця написати новелу завдовжки не менше 50000 слів. За 17 років у ньому взяли участь більше 20000 чоловік.
У 2013 році у програмістів з'явилося аналогічне змагання — NaNoGenMo (National Novel Generation Month). Завдання NaNoGenMo — написати програму, яка згенерує новелу довжиною 50000 слів або більше. При цьому вимоги до новелі досить слабкі — підійде будь-який текст достатньої довжини. Як ви побачите, це може бути збірка оповідань, п'єса, кулінарна книга, словник або туристичний путівник. Насправді, твір не зобов'язане навіть бути текстовим.
image
Графічна новела «Згенерований детектив»
Сама по собі завдання написати програму, яка згенерує текст з 50000 слів, проста. Для цього достатньо ось такого коду:
print 'няв' * 50000

З іншого боку, читати таку новелу буде нудно вже починаючи з третього слова. Учасники NaNoGenMo намагаються вирішити цю проблему. Вони придумують літературні та технічні ходи, які дозволили б утримати увагу читача. Це вже набагато складніше. На практиці, якщо можна з цікавістю прочитати хоча б кілька сторінок новели — це можна вважати успіхом.
У цьому пості я хочу розповісти, які прийоми використовують для алгоритмічної генерації літератури, і поділитися найцікавішими роботами за три роки.
Марковські ланцюги
Ланцюга Маркова — класичний спосіб генерації тексту. Він добре описаний тут. У ланцюгів Маркова є проблема: якщо вибрати для N-грам велике значення N (зазвичай 5 і більше), то в тексті виявляються великі шматки вихідного корпусу, якщо взяти N менше, то він виходить відверто безглуздим.
Але ця проблема вирішувана: деякі жанри творів можуть успішно приховувати від читача свою безглуздість. Наприклад, репліки з діалогів Сократа і Аристотеля yourpalal з першого погляду важко відрізнити від філософських роздумів. Точно так само я б не роздумуючи взяв згенероване ліцензійна угода greg-kennedy, якби побачив його в інсталяторі потрібної мені програми.
Інші твори, засновані на ланцюгах Маркова: еротичні розповіді Agrajag-Petunia, мови Рейгана (з домішкою робіт Шопенгауера) від VincentToups автобіографії англійською 19 століття lizrush.
Розширення шаблонів
Найчастіше осмислені фрагменти тексту генерують за допомогою шаблонів. Уявімо, що у нас є така граматика:
sentence = '<greeting> <world_phrase>!'
greeting = ['Привіт', 'Привіт', 'Привіт', 'Добрий день']
world_phrase = ['<happy_adj> світ', '<sad_adj> світ', 'світ']
happy_adj = ['прекрасний', 'світлий', 'добрий']
sad_adj = ['сірий', 'жорстокий', 'похмурий']

На основі неї ми можемо створити багато різних пропозицій — «Привіт, нудний світ!» або «Добрий день, прекрасний світ!». Чим багатше граматика, тим більш цікаві тексти вона видає.
«The Gamebook of Dungeon Tropes» maetl з допомогою шаблонів генеруються опису підземель.
«Атеистах, які вірять в Бога» tra38 використовуються дані якийсь перепису населення США. Герої новели — люди, які сказали, що вони атеїсти, а вірять в Бога. Вони один за іншим читають шаблонні лекції, які підставлені відповіді на питання з перепису.
Шаблони використовуються в новелі «Де-то что-то» BenKybartas, збірнику «5000 оповідань» tinyworlds еротичної новели «Оргазмотрон» enkiv2 (вибачте, більше еротики не буде) і спортивному коментарі «Федерація лжеамериканского футболу» creade.
Рекурсія
Шаблони дозволяють отримати невеликий фрагмент читабельного тексту. Але за правилами змагання новела повинна бути не коротше 50000 символів. Витончено наростити обсяг допомагає рекурсія.
Простий варіант: «The transorbital anaphase provine biforn the pure-bred synostosis» samcoppini береться одна пропозиція (воно винесене в заголовок). А потім з допомогою словника дається визначення деяких слів. Для слів з визначень теж даються визначення. І так поки не набереться п'ятдесят тисяч.
«Гігант без серця» MichaelPaulukonis розповідає варіації норвезької казки про принца, який врятував своїх братів від злого гіганта. Але врешті цей принц сам стає гігантом і викрадає дітей іншого короля. І вся історія повторюється, але вже трохи по-іншому.
Новела «Надії і спогади» cpressey складається з кількох подій і діалогу двох персонажів. По ходу новели вони зустрічають вампіри, зомбі, дракона та інших чудовиськ. А весь інший час вони згадують свої зустрічі і припускають, кого вони побачать в майбутньому. А потім згадують, як згадували якусь зустріч, припускають, чи вони будуть згадувати, як припускали іншу зустріч і так далі.
Схожа за структурою «Redwreath and Goldstar Have Traveled to Deathsgate» erkyrath. Там теж два персонажі ведуть розмову. Вони дуже чемні — запитують: «чи Можу я поставити питання?» і «чи Правильно я розумію, що...». І так поки в якийсь момент не доходить до такої репліки:
«You want to know whether I am asking whether you are asking whether you shall tell me whether you want to know whether I believe I can answer that?»
«Сто шістдесят п'ять днів Різдва» hugovk — це продовження англійської народної пісні «Дванадцять днів Різдва», де продовжують дарувати нові і нові подарунки (і їх кількість зростає).
Переробка існуючих творів
Якщо літературний твір перебуває в громадському надбанні, його можна використовувати будь-яким способом. В тому числі і для генерації нового твору на його основі. Найцікавіші приклади:
Мобі Дік на котячому мові hugovk. Це одна з найвідоміших робіт NaNoGenMo про яку писали The Guardian, Vox The Atlanctic. Просто наведу цитату:
Meow me Meeeeow. Meow meeow mew--meoow meow mew meow meeeeooow--meeeow meeeow me me meeow me me meoow, mew meeeoow meeeooooow me meooooow me me meeow, M meeooow M meoow meow meoow m meooow mew mew mew meooow meow me mew meeow.
Порівняйте з оригіналом:
Call me Ishmael. Some years ago--never mind how long precisely--having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the водянисті part of the world.
«Пригоди Шарлотти Холмс» emdaniels. Автор змінила стать всіх персонажів в оповіданнях про Шерлока Холмса. Звучить не дуже серйозно, але насправді це непроста лінгвістична задача. З якою автор впоралася не до кінця (тому довелося придумати займенник herr).
To Charlotte Holmes he is always THE man. I have seldom heard her mention him under any other name. In herr eyes he затемнень and predominates the whole of him sex. It was not that she felt any emotion akin to love for Ivan Adler.
«Гомерическое ультранасилие» lilinx. З тексту Іліади вибрали всі пропозиції, в яких є слово «вдарити» в одній з форм. Вийшло опис довгої і жорстокої бійні, в якій вже навіть незрозуміло, хто з ким б'ється.
«Мобі Дік, або image» pteichman — ще один варіант Мобі Діка, в якому деякі слова замінили відповідними емодзі.
Інші твори: «Пригоди Тома Сойєра» з героями роману про Конана від MrDrews, «Гамлет» dkurth, пропущений через кілька етапів машинного перекладу, «Гордість і упередження» з лексикою з Твіттера від michelleful, «Перетворення» Кафки, в якому кожне слово замінене більш абстрактним, від jonkagstrom.
Не обов'язково використовувати тільки один твір. Наприклад, збірка коротких оповідань, складаються з шести слів, від hugovk.
в «Нашому прибутті» (PDF) aparrish з корпусу «Проекту Гутенберг» обрані пропозиції, в яких описуються якісь природні об'єкти або явища. Зібрані разом, вони складають щоденник якоїсь експедиції. Вийшло дуже красиво, ця новела посідає одне з місць в моєму особистому топі новел з NaNoGenMo.
Переробка інших даних
Не обов'язково брати в якості основи літературний твір. moonmilk становив новелу з твітів учасників NaNoWriMo (PDF) (це те змагання, де люди самі пишуть новели), а jimkinseyпитань, які вчені ставлять в анотаціях статей (PDF):
In what sense is this a novel situation? Should conflicts in the private domain be exempted from public scrutiny in cases where are individual being deprived of their basic legal rights? How many students study abroad and where do they go? Furthermore if the existing policies are found to be ineffective, what all policy measures can be suggested to the Government to put an end to this evil practice? Who are user entrepreneurs?
Згенеровані новинні звіти про NaNoGenMo enkiv2 важко відрізнити від справжніх статей.
«Словника мови ' skuban» samcoppini словами з вигаданого комп'ютером мови дано визначення термінів з реального словника.
Новела «Шукач» (PDF) thricedotted розповідає про те, як комп'ютер вчиться робити все, що роблять люди, з допомогою сайту wikiHow.
Симуляція
Хорошою новелі потрібні сюжет і розвиток подій. Один із способів добитися цього — симуляція. Автор програми створює певний світ і описує правила, за якими він функціонує. А потім просто перераховує події, які в цьому світі відбуваються. Якщо ці події цікаві, сюжет теж виходить цікавим. Схоже на комп'ютерну гру, але ви не граєте в неї, а читаєте лог.
Герої серії фентезі-новел mattfister ходять по різних місцях. Якщо у них закінчується їжа, вони йдуть полювати або рибалити, а втомившись, вони розбивають табір. Іноді їм зустрічаються вороги, з якими доводиться боротися.
Схожим чином герої новини flexo бродять по арені і б'ються при зустрічі.
Крім битв, є й інші симуляції. «Вечорі дощового дня» cpressey Аліса і Боб грають в карти. У новелі nothings Ханна вирішує задачу про Ханойський вежі (для 50000 слів вистачило дванадцяти дисків). У «Флорі і фауні» amarriner ботанік шукає вихід з лабіринту, зустрічаючи на шляху тварин і рослини.
Іноді автори симулюють переміщення з реального світу. «Навколо світу за X статей Вікіпедії» kevandotorg Філеас Фогг і Паспарту здійснюють кругосвітню подорож, розповідаючи факти про місця, які вони відвідують. «Книга Елізи» greg-kennedy приводить докладний маршрут сорокарічного подорожі Мойсея по пустелі (навіть є карта!).
Високорівнева генерація сюжету
Інший підхід до побудови сюжету — сформувати основні сюжетні точки, а потім вже їх розгорнути в докладний текст. cpressey реалізував це у «Часу долі» і описав пості, як працює його побудова сюжету. Компілятор історії починає з простої послідовності:
[ПредставлениеГероев, *, Розв'язка]

Замість зірочки компілятор може вставляти будь-які події зі своїм початком і кінцем:
[ПредставлениеГероев, [СокровищаУкрадены, *, СокровищаНайдены, *], Розв'язка] 

Коли подій досить, що з послідовності можна видалити усі зірочки, а самі події розбити на більш дрібні:
ПредставлениеГероев = [ПредставлениеДетектива, ПредставлениеГрабителя]
СокровищаУкрадены = [ГрабительБеретСокровища, ГрабительСбегает]
СокровищаНайдены = [ДетективЛовитГрабителя, ДетективЗабираетСокровища]
Розв'язка = [ДетективИдетДомой, ГрабительСбегает]

Після цього залишається перетворити кожна подія в його підсумкове опис в новелі.
Інші формати
Іноді автори відходять від формату новели. Я вже згадував кілька подібних, але от ще:
  • «Пустелі Заходу» (PDF) mewo2 — путівник по вигаданим світом, для якого спеціально генеруються карта і мову. для карти, мови докладно описано, як саме вони генеруються.
  • «Велика книга трансмутаций» (PDF) TobiasWehrum — збірник алхімічних рецептів. Щоб підбирати інгредієнти, використовується якийсь корпус пов'язаних понять.
  • «Обкладинки „І сходить сонце“» adregan взяв зображення, а потім написав назва кольори для кожного пікселя. До речі, картинку потім змогли відновити назад.
  • «Відправте по телефону» hugovk наведений діалог двох людей, один з яких диктує іншому програму. «Ес як долар», тільки ще гірше. Трохи красивою рекурсії: програма, яку диктують, і згенерувала цей діалог.
Графічні твори
Не завжди автори обмежуються текстовими новелами. doldrumorchids «Людей немає» бере картинки з гугл-панорам, розпізнає об'єкти на них, а потім вставляє опису подібних об'єктів з творів з «Проекту Гутенберг».
«Серафими» lizadaly — це загадковий манускрипт з картинками, написаний на невідомому мовою (з символами з рукопису Войнича).
«Що-то, дяка і нічого» zachwhalen і «Згенерований детектив» atduskgreg — графічні новели (комікси). У першій тексту немає, у другій він є. Але обидва автори постаралися над стилізацією картинок, і вийшло атмосферно.
Нейронні мережі
Трохи про погане. Нейронні мережі останнім часом навчилися багато чому: перемагати в го, накладати фільтри на фотографії, сортувати огірки. Але з генерацією текстів у них, схоже, якось не клеїться. У 2015 було кілька творів, написаних нейронками (переосмислення Лавкрафта R-Gerard переосмислення Жуля Верна estayton і що-то графічне spikelynch). Всі вони мене не вразили. Думаю, це означає, що у нейронних мереж все попереду, і в майбутньому ми ще побачимо щось більш осмислене від них.
далі
До початку нового NaNoGenMo залишилося кілька днів. Ось репозиторій для нього. Якщо ви хочете взяти в ньому участь — створіть у ньому issue із заголовком на кшталт «intent to participate». У самому issue ви зможете обговорити свої ідеї з іншими учасниками, а після завершення роботи туди треба буде викласти посилання на код і згенеровану новелу. Бажаю успіху всім, хто зважиться!
Мені хотілося б спробувати зробити щось подібне російською мовою. Але в рамках NaNoGenMo, де говорять англійською, мені це здається не дуже доречним. Якщо у вас теж є таке бажання — напишіть в коментарі до цього посту або мені в лічку. Думаю, ми могли б зібратися і створити окрему гілку змагання для російської мови.
Посилання
  1. Репозиторії минулих років: 2013, 2014, 2015.
  2. Серія статей, з якої я дізнався про NaNoGenMo: 1, 2, 3, 4. У цьому пості я використав деякі приклади звідти.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.