Untitled
Содержание
Введение
Сказка — это один из основных жанров устного народнопоэтического творчества и является наиболее известным для самого широкого круга читателей (детского и взрослого возраста). Это эпическое, преимущественно прозаическое художественное произведение авантюрного, волшебного или бытового характера в большинстве своем с установкой на вымысел.
Много лет авторы доносили свои произведения до читателей посредством книги, печатной продукции. Но с появлением новых технологий способов представления информации стало намного больше. Телевидение, радио, интернет — основные источники, где люди могут найти себе то, что нужно. Появились аудиокниги, позволяющие читателю не читать произведение, а прослушать его.
Актуальность работы в том, что настоящее время существует мало различных программ генерации сказок самим пользователем. С помощью компьютерной лингвистики и применения математических методов и компьютерных технологий, можно создать приложение, позволяющее пользователю самому создать собственный рассказ. С помощью такого приложения можно легко генерировать различные сценарии и вводить в них собственных героев, а также время и место происходящих событий.
Цель нашей работы — создать программу генерации сказок средствами Delphi.
Задачи работы:
Изучить алгоритм создания сказки.
Выявить потребности компьютерной лингвистики в реализации обработки текста.
Определить возможности среды Delphi для автоматизированной генерации сказок.
Разработать программу генерации сказок.
Глава I. «Теоретические основы генерации сказок программными средствами»
1.1. Алгоритм создания сказки
Алгоритм создания сказок на основе Морфологического анализа
>
Строится и заполняется морфологическая таблица: элементы сказки — варианты их исполнения. Строк и столбцов может быть сколько угодно. Обычно 6-10. Например, как в данной таблице.
Задается по одному слову из каждой строки таблицы. Это герои и условия будущей сказки. Для большей таинственности можно составить нотацию таблицы по типу шахматной доски и выбрать «код сказки», например, такой: 1Г-2Г-3В-4Б-5Б-6Г-7Б. На основании этих условий сочиняется собственная сказка. Если в таблицу помещать известных сказочных героев, то получится «салат» из известных сказок, если помещать любые объекты, получится «самостоятельная» сказка.
Сюжет сказки создается «по ходу дела. Например, по указанной выше нотации может получиться следующее: „Красивая Царевна Несмеяна в дремучем лесу попала в руки к свирепому разбойнику, который сделал Несмеяну безопасной. Ее выручил мудрый волшебник. Он дал Несмеяне Машину Времени, на которой она умчалась в прошлое, стала опять красивой и больше никогда одна не ходила в дремучие леса“.
Алгоритм создания сказок на основе метода контрольных вопросов
Метод контрольных вопросов для сочинения сказок:
Придумываются вопросы. Вопросы записываются.
Отвечая на вопросы, создается сюжет.
И черновой вариант сказки готов! Качество сказки зависит от вопросов, от их последовательности и от оригинальности ответов. Сказка получается как „езда в неизвестное“. Чем менее связаны между собой вопросы, тем интересней получается сказка, но тем безграничнее и необузданней требуется фантазия. Например, такие вопросы:
Сколько было участников сказки?
Кто они?
Где они жили?
Где и почему они учились?
Какие у них были характеры?
Что хотел каждый? Кого они любили?
Почему они не могли выполнить своих желаний?
Какая беда произошла с одним из них? Что он сделал?
Если сказка „пошла“, можно добавлять сколько угодно вопросов, персонажей и событий, повторять отдельные вопросы. Вообще говоря, создание хорошей сказки — процесс творческий, с повторениями, переделками и улучшениями. Успех или неуспех сказки является своего рода индикатором уровня развития воображения у детей и взрослых.
Сказка запускается вопросами, например:
Что бы ты сделал, если бы нашел „родник смелости“? (Попил бы сам и стал смелым).
Кому бы ты дал напиться в первую очередь и почему? (Своему приятелю Сашке, он все время врет от трусости).
Не забудь, в твоем распоряжении целый родник…
Волшебник разрешил тебе в течение одного часа побывать там, где ты захочешь.
Куда бы ты отправился? Зачем? Что бы ты там сделал?
Как найти самого мудрого человека в королевстве?
Какие бы ты задал ему вопросы?
Запустите сказку первой фразой.
Жил был старый мудрый мамонт…
Тебе подарили сонный порошок, и ты…
Методика и формы работы над сказкой
Сказка — специфический жанр, любая сказка — это „особый замкнутый мир, в котором действуют законы, непримиримые в реальном мире“.
Законы „сказочного мира“ аналогичны с точки зрения здравого смысла, но совершенно естественны внутри сказки. Хочется обратить особое внимание на пять законов:
1. Одушевление предметов и явлений природы;
2. Очеловечивание предметов, явлений, представление в реальные или фантастические образы;
3. Синтез ряда обыкновенных явлений, предметов, существ в образы, наделенные необыкновенными свойствами, народный результат воображения, как выражения мечты, идеи;
4. Чудесные превращения и обращения;
5. Гиперболизация.
Благодаря этим законам в действие сказки, в ее эмоциональную сферу включаются все явления объективно существующего мира, все предметы воображения, как реально действующие силы. Именно поэтому сказка — благодатный материал для развития воссоздающего и творческого воображения ребенка как важных сторон его эмоциональной сферы и необходимых для полноценного восприятия произведений читателем.
Сказки сохраняют свою национальную индивидуальность, а каждая народная сказка своеобычно и по-своему неповторима.
Благодарнейшим способом изучения сказки является ее инсценирование. Этому способствует насыщенность сказки диалогами.
Формы работы со сказкой могут быть самыми разнообразными. Укажем еще на некоторые смысловые акценты, которые представляются значимыми. Они могут реализовываться в ходе беседы о сказке, в виде вопросов, обращенных к детям, в качестве заданий, предлагаемых ребенку после знакомства со сказкой.
Пример вопросов и заданий:
1. Дать характеристику персонажа (каков тот или иной из них).
2. Объяснить, почему произошло то или иное событие.
3. Показать, что становится объектом насмешки народа.
4. Прочитать в лицах сказочные диалоги и полилоги, выделяя голосом характерные особенности персонажа.
5. Указать на текстовые различия в традиционных для сказки повторах. Объяснить их значение.
6. Установить различие между словами и поступками персонажей. Дать нравственную оценку этому расхождению.
7. Отметить использование в сказке поговорок, пословиц и другое.
8. Выяснить, каким представился ребенку тот или иной герой, на чем основаны его предпочтения.
9. Объяснить, почему в сказке возникают значимые имена. Всегда ли они определяют главное в персонажах?
10. Охарактеризовать тональность речи того или иного персонажа, соответствие интонации его мыслям и поступкам.
11. Вопросы, утверждающие связь человека с природой, миром, „прославляющие“ чувства дружбы, благодарности и т.п., вытекающие из конкретно-сказочных событий.
12. Вопросы, активизирующие память ребенка, заставляющие его обратиться к известным ему аналогиям.
13. Просьба подобрать к какому-то слову или выражению близкие по значению слова и выражения.
14. Объяснить, как описывается в сказке прекрасное и безобразное.
15. Расскажите, как и почему изменился характер героя.
16. Сравнение, аналогия, сопоставление (чем сказки одного народа напоминают сказки другого народа).
17. Каковы коренные ценности народа, его понятие о справедливости, награде и неизбежном позоре?
1.2. Способы генерации текстовых произведений программными средствами
Цепи Маркова
Одним из способов генерации текста является способ Цепей Мркова — это некая последовательность, каждый следующий элемент которой не зависит от предыдущих. Это для цепи первого порядка. Для цепи второго порядка — зависит только от одного предыдущего, третьего — от двух предыдущих, и так далее.
Что это дает нам на практике? Мы можем взять текст на любом языке и разобрать его статистически. Записать, какова вероятность появления любого слова после какого-нибудь другого. После чего, выбирая первое слово наугад, можно выбрать второе, зависящее от первого. По второму — третье, и так далее. В результате получим текст, который выглядит как достаточно правильно построенные предложения, но без всякого смысла.
Приведем пример текста, сгенерированого из фрагмента художественного произведения при помощи цепей Маркова:
порядок цепи = 3 (каждое слово зависит от двух предыдущих):
В самом центре этой зоны реял флаг „Windows“. В центре зоны притяжения был, как мне сначала показалось, секс — но, приглядевшись, я понял, что главным наслаждением в этой стране — работать клоуном у пидарасов. — Мне не очень понятно, о чем не думай. Стать вампиром можно только тогда, когда Бальдр и Иегова стали приходить поодиночке. Они были одинакового размера (сорок сантиметров в ширину, пятьдесят в высоту — первое, что служит им пищей. Но сейчас, я повторяю, об этом говорить рано. У тебя на шее мокро. Вытри. Я ничего не сказать. Я был бы не „Microsoft“, а „Netscape“.
порядок цепи = 2 (каждое слово зависит только от предыдущего):
— Спишь? — комбинация нескольких букв и повыше. Я знал, что из комнаты, — в это слово, — Ты, по-моему, должен был еще несколько раз слышал это связано с последующей магистратурой и дверь черного хода большой квартиры. Она даже страшная летающая собака, которая называлась „Лолита“. Вторая картина называлась „закрепителем“. В этой зоны — Англосаксонские вампиры могли быть хорошим человеком, за водкой стоишь в этом рано говорить. — А приклеил ты можешь пользоваться словом на хард-диск, на стене висел веер над столбцом текста приветливо глядел лысый лоб. — Ромочка, моя душа стерегла твой вопрос.
Видно, что чем больше порядок цепи, тем выше вероятность неизменности больших фрагментов.
Тот же принцип работает не только со словами, но и с буквами. В естественном языке существует не только вероятность появления какой-либо буквы, но и вероятность появления какой-то буквы после какой-то конкретной. Так можно генерировать простой набор букв и знаков, например (порядок 2):
стойный выбща я. нт инстро номалещет Каза со очазаза ятогло немосетеланопи инашема вамнырое, У но — све рил ия — А м ох поксть улава Валосатот мий некостсчнью каз сстобуденаком… — м во сть их з чатонал. каз зды ктилицвржачниснышвезалнем Наетрощега у, пыше спрю тиматовне ден ов b? по мазьк и Кродние. торк сль ковать, меналекалирето ткое милюще ня очтаз тобыпробне ном эт св заражи»Wisml. звсерь к… ино тв, я, иза суд нотромма бо сиршьног днотеезаль сесо нал о м норилкой м — киломитра Кожиных омн, быничуде це ряера. кучусмии — овизве, — мале то ня, вустрор к, зучтопотьни, ажеруз я я Номамо Ви? — жерно преногдаоро лючтнылодогоназа поми страро веныл -мпиеня. в ую ниек сь, по помыко имаск этвонелиестя гл вовез наемяроливерне Махотрит ска, тирыля з Я, прая — ме их ине, пана -трна ожноб Мыго на, тьдненя та былыбусн. обучткам смучисо у, му вдромогро cren, икимел ицетькудембще нгостистоско чтафогл, немели ДРа мовы. буматьнакилеровила во.
Далее приведен код, при помощи которого это было получено (PHP).
/*
* class for Markov's chains realization
* (c) Andrey, somemilk.org@gmail.com, 2006
*
* Typical usage:
* $m = new Markov(2); // 2 — markov chain length, depends on source
* // file size, 2 for small files, 3-4 for large ones
* $m->initFromFile(«somefile.txt») or die(«shit happens.»);
* $bullshit = $m->generate(2000); // generates bullshit 2000 chars long.
* $m->initFromString(file_get_contents(«somefile.txt»)) or die(«shit happens.»);
* $bullshit = $m->generate(100, MARKOV_OPT_WORDS); // generates bullshit 100 words long.
*/
define(«MARKOV_OPT_CHARACTERS», 1); // option: character limit for generate()
define(«MARKOV_OPT_WORDS», 2); // option: word limit for generate()
define(«MARKOV_DEFAULT_K», 3); // default Markov chain length
define(«MARKOV_TIME_LIMIT», 120); // time limit for initFromFile()
define(«MARKOV_MAX_RECURSION_LEVEL», 20);
class Markov
/*
* inits class' Markov k-sets with a text from a string.
*
* returns true on success, false on failure
*/
function initFromString($str)
{
if(strlen($str) k) return false;
$this->k_sets = array();
$set = array();
if($this->split_method == MARKOV_OPT_WORDS)
{
$words = preg_split('/s+/', trim($str));
if(count($words) k) return false;
foreach($words as $w)
{
$this->_addToSets($set, $w);
}
}
else
{
for($i=0; $i
{
$this->_addToSets($set, substr($str, $i, 1));
}
}
return true;
}
function _addToSets(&$set, $w)
{
$set[] = $w;
if(count($set) == $this->k)
{
$key = "";