Генератор текстов на основе патернов, Курочка Ряба и Звездные войны

Можно ли при сегодняшнем уровне развития вычислительной техники решить задачу генерации литературно осмысленного текста? Мне кажется возможно, по крайней мере на уровне алгоритмо-теоретического описания. А при чем тут Курочка ряба и Звездные войны?

Небольшая предистория:


Я не специалист по вопросу машинного интеллекта, просто давно интересуюсь проблемами ИИ. Как то я читал интересный рассказ Азимова, про то, как мальчик пытался перепрограммировать своего робота, и что из этого получилось, и у меня родилась смутная идея. Идея алгоритма росла подробностями, и жила себе где-то в голове, я даже думал получить из нее профит, но потом понял, что для этого одной идеи мало. Потому, решил поделится идеей с умными людьми, если генерация литературного текста возможна, то профит получим все мы, так мне кажется.

Собственно, сама суть:


Наша воображаемая система генерации текста (СИГЕТ) построена по экспертно-модульному принципу:

1. Набор шаблонов для генерации
2. Литературный корпус:
2.1. Словарь синонимов
2.2. База текстов
3. База данных на графах (“дерево знаний”)
4. Модуль оценки длинны пути
5. Генератор предложений
Опишем эти пункты подробнее:

1. Набор шаблонов для генерации

Собственно, все началось с той простой идеи, что раз уж компьютер не умеет думать как человек, то и не надо его заставлять. Даем ему готовый, придуманный и воспринимаемый человеком шаблон, из которого он уже своими компьютерными методами изготовит нам оригинальный текст.
Попробую проиллюстрировать общий принцип создания шаблона, на примере сказки про курочку Рябу:
Исходный текст Паттерн
Жили-были %исходное_состояние
Дед и баба %Мг1(мужчина, гуманоид), %Жг1
И была у них %отношение_к
Курочка Ряба %Жж1(Женщина, животное)
Снесла курочка яичко %Жж1 %производит %П01(предмет 01)
Но не простое, а золотое %П01 отличается от массива произвольных объектов типа %П01 характеристикой %Х01.П01, не присущей объектам %П01
Дед бил бил – не разбил %Мг1 %воздествие_на %П01 методом %М01. Результат %воздествие_на равен 0
Баба била била – не разбила %Жг1 %воздествие_на %П01 методом %М01. Результат %воздествие_на равен 0
Мышка бежала %Жж2 %любой_глагол
хвостиком махнула, яичко упало и разбилось %воздествие_на %П01 методом %М02. Результат %воздествие_на равен %поломка %П01
Дед плачет, баба плачет %конечное_состояние

Оцениваю, что для генерации произвольного объема теста таких шаблонов понадобится не так и много.
Входное и выходное состояние нужны для “склеивания” нескольких шаблонов в один текст.
Естественно, одних только шаблонов для получения текста недостаточно, переходим к пункту два:

2. Литературный корпус

Естественно, нам понадобится база “понятных компьютеру” текстов по многим причинам — для поиска словарных последовательностей, оценки предложений в экспертной системе. Словарь синонимов нужен чтобы разнообразить словарный запас компьютера.

3. База данных на графах (“дерево знаний”)

База данных нужна для построения входных и выходных конструкций из шаблонов.
Она состоит из объектов, которые связаны с различными присущими им состояниями, при этом каждая связь имеет свой вес. Например, связь “яйцо”-”белое” будет иметь вес напр. 1 (т.к. яйца обычно белого или желтоватого цвета) а “яйцо”-”золотое” будет иметь вес напр. 3 (т.к. золотыми яйца бывают как правило только в переносном смысле). Для шаблона нашей сказки как раз ключевыми моментами являются то, что %Жж1 %производит %П01(предмет 01), и что %П01 отличается от массива произвольных объектов типа %П01 характеристикой %Х01.П01, не присущей объектам %П01. (т.е. тут прямо в шаблоне мы указываем, что “яйцо”-”белое” нам не подходит) В нашем случае %Жж1= курица. Список исходящих состояний объекта “курица” может частично выглядеть так: {сбрасывает перо, снесла яйцо, водила цыплят}, из которых тысячи лет назад было выбрано сост. 2, но при генерации текста это может быть не курица, а, например, “рыба” у которой будет совершенно отличный список исходящих состояний, и компьютер может выбирать из них любое.

4. Модуль оценки длинны пути

Так как связи объектов с состояниями имею вес, то алгоритм поиска кратчайшего пути поможет строить более-менее адекватные нашему восприятию предложения, без фраз типа “жабы по небу летают”

5. Генератор предложений

Цепи Маркова эффективны при хорошо рассчитанных узлах. К этому моменту мы имеем жестко
заданные ключевые узлы, к которым можно генерировать всякие вспомогательные слова. Можно использовать цепи Маркова, можно что либо другое, главное чтобы это опиралось на наш “скелет”.

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

Литературная фантазия, на тему того, как это может выглядеть:


СИГЕТ версия 0.х.х. запущена.
Укажите желаемую тематику в выпадающем списке:
Фантастика — Звездные войны
условный объем (от 1 до 10): 1

подождите, генерирую…

ИТОГ:
Давным давно в далекой-далекой галактике жили Люк Скайвокер и принцесса Лея, и был у них робот Ситрипио. Как то раз Ситрипио добыл источник силы, но не простой а непонятный. Люк Скайвокер пытался разобраться в нем — не разобрался, Принцесса Лея пыталась разобраться в нем — не разобралась. Мимо проходил Йода, ухом повел и источник силы исчез.
Люк Скайвокер расстроился и принцесса Лея расстроилась, а Йода говорит:
огорчайся не, падаван молодой, силу в тебе я вижу
КОНЕЦ.


Ну и в конце — ссылки на всякие- разные интересности, обнаруженные в процессе написания:


Генератор “Пушкинист”: pers.narod.ru/php/php_vartext.html
интересен тем, что генерирует стихи на базе строк “Я помню чудное мгновенье”, иногда очень интересные.
Генератор синтаксически правильного русского текста Geniot pers.narod.ru/php/geniot.html
демки прямо на сайте нет, но есть фрагмент генерации — не хуже, чем “Яндекс. Рефераты”, а может даже лучше

Список рекомендованной литературы:

Теория:

Был сподвижен на написание статьей “Автописатель” habrahabr.ru/post/161311 и чтением книги Айзека Азимова “Когда нибудь” lib.ru/FOUNDATION/r_kogda_nibud_.txt_with-big-pictures.html
Грамматика зависимостей
ru.wikipedia.org/wiki/Грамматика_зависимостей
Пролог
ru.wikipedia.org/wiki/Пролог_(язык_программирования)
Представление знаний
ru.wikipedia.org/wiki/Представление_знаний

Готовые генераторы:

Номер Раз на основе цепей Маркова: www.manhunter.ru/webmaster/358_generator_teksta_na_osnove_cepey_markova.html
Номер Два на том же принципе: code.google.com/p/pymarkov
Номер три по шаблону:http://forumseo.org/showthread.php?t=1608 (вообще-то тысячи их)
Метки:
Поделиться публикацией
Комментарии 27
  • 0
    А есть ли какое-нибудь практическое применение этому? Или это just for fun?
    • +6
      Black SEO, например. В генерации текстов для дорвеев это очень популярная тема. А для остальных людей это just for fun.
    • +3
      Главная книжка по теории генерации сказок — классический труд Проппа «Морфология волшебной сказки». Там описаны все известные (на начало XX века) паттерны сюжетов сказок.
      • НЛО прилетело и опубликовало эту надпись здесь
        • +1
          Да, а что?
          • НЛО прилетело и опубликовало эту надпись здесь
            • +2
              «Весь известный на начало XX века паттерн» :D
              • +1
                а что ещё есть почитать полезного по предмету? кто-то ещё паттерны других жанров/сущностей исследовал и систематизировал после Проппа?
                • НЛО прилетело и опубликовало эту надпись здесь
      • +2
        Для игры нужно составить достаточно большое кол-во диалогов на заданную тему.
        Есть ли шанс с помощью этих технологий автоматизировать хотя бы часть этой трудоемкой работы?
        • +1
          Всё просто и сложно одновременно, очень много в русском языке неоднозначности, а руками составлять шаблоны которых бесконечное множество — недостижимая цель. Я шаблоны на основе корпуса + словаря Даля генерирую, для поиска текстов осмысленно связанных с запросом хватает, для автоматического рерайта пока шаблонов немного маловато.
          • +1
            т.е. не удается из ограниченного количества шаблонов получить бесконечное количество текстов?
            А если комбинировать шаблоны?
            • +1
              Не у меня задача была рерайт любого текста, похожие по шаблону строить несложно.
          • +2
            Очень мало подробностей в статье, ожидал увидеть больше практики и теории по тем же цепям Маркова, а не литературную фантазию…
            • +1
              «Пять лет назад в России была впервые в мире опубликована книга, написанная компьютерной программой: любовный роман в стиле Мураками, но с персонажами из «Анны Карениной». Специально созданная для этих целей усилиями восьми программистов компьютерная программа PC Writer 1.0 трудилась три дня, а потом текст прошёл через тщательную литературную обработку усилиями, опять же, восьми редакторов. В целом, в произведение было вложено больше человеческого труда, чем в обычную «человеческую» книгу, и обошлась она дороже, чем гонорар автору, сказал директор издательства «Астрель-СПб», так что эксперимент оказался не совсем честным.»

              www.xakep.ru/post/59860/default.asp

              Уж что удалось найти навскидку…
              • +1
                Вспомнилось бессмертное
                www.elsewhere.org/pomo/

                Ну и как-то писал клон вот этого dev.null.org/dadaengine/

                А студентом написал генератор матюков произвольной этажности, боюсь в интернет выкладывать, загадят им все…
                :-)

                Интересно на самом деле, запускать в социалки такое и пусть роботы с роботами разговаривают, флиртуют и троллят друг друга.
                :-)
                • 0
                  Я нечто похожее делал. Правда называл это: генерация текста по скелетам. Собирал скелеты ( шаблоны ) предложений и потом заменял в них слова.
                  Вот пример на одном скелете:
                  Отказ, это пардон на полемику поликлиники в заклинаем кипарисе прецедентов. 
                  Развал, это моль на лату бляшки в перелистываем коридоре мышеев. 
                  Стетоскоп, это телевизор на подворотню коже в ограничиваем квартале чесноков. 
                  Обыск, это трус на корку явке в моем автомате лендроверов. 
                  Котик, это рукомойник на рознь переписки в формируем формате просторов. 
                  Дивизион, это легион на требу параллели в переворачиваем ультразвуке хлоридов. 
                  

                  и второй скелет:
                  Невдалеке буду на волшебстве усиливать. 
                  Итого буду на главном плести. 
                  Шустро буду на хладнокровии стоить. 
                  Озабоченно буду на неразглашеньи процеживать. 
                  Дотошно буду на восстановлении запоминать. 
                  Страшно буду на должном ведать. 
                  Внимательно буду на преобладаньи укреплять. 
                  Сторицей буду на мочеиспусканье растить. 
                  Круто буду на благоразумьи селить. 
                  


                  Но мой вариант был очень простой, без весов, соединений предложений итд… Так как нужны была скорость.
                  • 0
                    Да, вот это, кстати, похоже на правду! Следует отталкиваться от теории языка, а не математики. От схем предложений, частей речи и типов словосочетаний.
                    Единственная проблема в том, что у Вас своеобразные паттерны — я не могу придумать никакого нормального предложения с такой структурой, или из этого набора слов. А как размечали, если не секрет?
                    • 0
                      В первом случае проблема, скорее всего, была в том, что 8-е слово ошибочно приняли за глагол (возможно, в оригинале это было «моём», которое превратилось в «мОем»). Но где программа взяла «мышеев», объяснить трудно.
                  • 0
                    В школе в свое время было задание написать генератор предложений по заданному шаблону, который потом тоже развился у некоторых в генератор сказок.
                    Генераторы текстов сейчас пишут все, кому не лень. Пора продвигаться потихоньку дальше. Самое время поработать, например, над генератором коротких мультфильмов.
                    • 0
                      По аналогичной схеме реализовывал свой аналог системы Wpoison.
                      Скрипт (доступный по невидимой ссылке на главной странице) при обращении генерировал 50 поддельных почтовых адресов, которые укладывал в MySQL-базу и отображал на странице.

                      Каждый почтовый адрес на генерируемой странице, в свою очередь, отображался как ссылка на этот же скрипт (на самого себя). Т.е. бот-коллектор, зашедший на эту страничку, уже не мог с не уйти по содержащимся в ней ссылкам. Адреса каждый раз генерировались новые.

                      Эту же базу читал почтовый агент (MTA Exim) и, в случае прихода письма на такой поддельный почтовый адрес, отдавал «550 Spamtrap hit» со сбросом (drop) SMTP-сессии и занесением IP в локальный блеклист (не перманентно, лишь на некоторое время).
                      • 0
                        Это хорошо.
                        А чего Вам на данный момент не хватает для реализации? Скажем, у меня есть платформа и генератор тестов из крупных блоков: жанр-тема-номер блока-начальное и конечное состояние. Разметить внутри структурных блоков смысловые, а в них — состав предложений — это вопрос времени.
                        С другой стороны, если у Вас есть наработки по последнему уровню, можно объединить усилия.
                        • 0
                          — Пусть он напишет рассказ о солнце с лирико-меланхолическим уклоном, и пусть все слова в этом рассказе начинаются с «с», — сказал я. Тотчас же мой спутник дал АТИЛЛе творческую программу, и тот заурчал и замигал своими зенками.
                          — Ну, друг АТИЛЛА, на этот раз не подведи, — ласково сказал Писатель-Ихтиолог в рупор. — Подушевнее, полиричнее сотвори. Вскоре АТИЛЛА выполнил задание. Листок этот, ровно как и два предыдущих, и поныне хранится в моем архиве.

                          СОЛНЕЧНЫЙ САБАНТУЙ

                          Светозарное солнышко справляло свой сабантуй, светило сказочно светло, сияло самозабвенно. Самоцветно синела садовая сирень, старались сладкогласные соловьи, стрекотали стрекозы, струилось ситро, сахарился сладкий сливовый сироп. Серебристым симпатичным смехом синхронно смеялись совершенно счастливые супруги. Седовласая стерлядь скандировала стройные строфы сонета.
                          Солнце стало склоняться севернее, сгущались сизые сумерки. Смеркалось.
                          — Сукин сын! Слюнтяй! Солдафон! Стервец! — сказала сому строгая соленая святейшая селедка, сиротливо скучавшая среди салаки, скумбрии, семги.
                          — Сама скотина, склочница, симулянтка! Свинские слова слышу! — смачно сплюнув, свирепо сказала сумасбродной соседке седоусая сметливая свежепросоленная сардинка, спокойно спавшая среди сетей.
                          — Собаки! Стрекулисты! Спекулянты! Сплетники! Сычи сонные! Сидни сидячие! Самодуры сиволапые! Скандалисты! Святотатцы! Скобари! Скопидомы! Скряги! Саботажники! Сутяги! — степенно сказала совершеннолетняя
                          самостоятельная севрюга, слушавшая спор.
                          Солнышко село, скапутилось, смылось, съежилось. Стало совсем сумрачно.
                          Скоропостижно скончался сиг.
                          Сотворил АТИЛЛА
                          • 0
                            Любопытно, возможно ли сотворить подобное на английском, или наш язык всё таки величавее и мощнее?
                            • 0
                              На английском проще, за счет большей простоты языка.
                          • 0
                            >Оцениваю, что для генерации произвольного объема теста таких шаблонов понадобится не так и много.
                            и на чем эта оценка базируется?

                            Имхо шаблон — самое сложное. Навесить на него украшательства с весами можно, а вот хороший шаблон дорого стоит.

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