Можно ли при сегодняшнем уровне развития вычислительной техники решить задачу генерации литературно осмысленного текста? Мне кажется возможно, по крайней мере на уровне алгоритмо-теоретического описания. А при чем тут Курочка ряба и Звездные войны?
Небольшая предистория:
Я не специалист по вопросу машинного интеллекта, просто давно интересуюсь проблемами ИИ. Как то я читал интересный рассказ Азимова, про то, как мальчик пытался перепрограммировать своего робота, и что из этого получилось, и у меня родилась смутная идея. Идея алгоритма росла подробностями, и жила себе где-то в голове, я даже думал получить из нее профит, но потом понял, что для этого одной идеи мало. Потому, решил поделится идеей с умными людьми, если генерация литературного текста возможна, то профит получим все мы, так мне кажется.
Собственно, сама суть:
Наша воображаемая система генерации текста (СИГЕТ) построена по экспертно-модульному принципу:
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/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9
Пролог
ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%BB%D0%BE%D0%B3_%28%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29
Представление знаний
ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BD%D0%B8%D0%B9
Готовые генераторы:
Номер Раз на основе цепей Маркова: www.manhunter.ru/webmaster/358_generator_teksta_na_osnove_cepey_markova.html
Номер Два на том же принципе: code.google.com/p/pymarkov/
Номер три по шаблону:http://forumseo.org/showthread.php?t=1608 (вообще-то тысячи их)
Автор: AlexPancho