Создание большого объема текста на основе цепи Маркова

Автор работы: Пользователь скрыл имя, 06 Мая 2013 в 16:34, курсовая работа

Описание работы

Отметим, что в настоящее время не существует полной теории, описывающей законы порождения связных осмысленных текстов. Как следствие отсутствуют в общем случае методы порождения текстов, не отличимых от созданных человеком. Тем не менее, известны многие закономерности, характерные естественным текстам:
- единство стиля;
- следование законом жанра;
- локальная связность;
- глобальная тематическая связность и т.п.
Цепи Маркова позволяют моделировать лишь локальную связность текста и общие тематические характеристики.
Основная идея настоящей работы состоит в том, чтобы с учетом статистических характеристик стилистических и жанровых особенностей естественных текстов порождать неестественные тексты, обладающие локальной связностью.

Содержание работы

Введение 5
Задание и исходные данные в соответсвии с номером варианта………… 6
1) Обобщённая структурная схема системы связи для передачи дискретных сообщений …………………………………………………………………………….7
2) Расчёт информационных характеристик источник .……………………..9
3) Построение кода для сообщений источника……………………………..11
4) Статистические характеристики закодированных сообщени……… ….13
5) Оптимальное по минимуму средней ошибки правило восстановления символа при приёме в условиях сильно зашумленного сигнала…………………15
6) Ошибки в передаче сообщений и вероятность правильного приема последовательности сообщений по слабо зашумленному сигналу………………17
Заключение…………………………………………………………………….19
Список использованных источников………………………………………

Файлы: 1 файл

Kursovaya_rabota_Informatika.docx

— 153.61 Кб (Скачать файл)

Егор сам на телятках внуки на лошадке жена на коровке дети на коровке.

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

3 Тестирование программы

Программа имеет следующий интерфейс, как показано на рисунке 1.

 

Рисунок 1 – Интерфейс программы

 

Перед запуском генерации текста нужно выполнит следующие шаги:

  1. Выбрать исходный файл-словарь.
  2. Выбрать файл в который будет сохранен сгенерированный текст.
  3. Выбрать кодировку входного файла utf8 или cp1251.
  4. Указать что делать с повторами, удалять или игнорировать.
  5. Необходимо указать количество слов выходного файла.

Обработка ошибок:

Если  начать генерацию текста не указав исходный файл, то программа оповестит пользователя сообщением об ошибке первого рода, как показано на рисунке 2.

 

Рисунок 2 – Сообщение об ошибке первого рода

 

 

Если  начать генерацию текста не указав выходной файл, то программа оповестит пользователя сообщением об ошибке второго рода, как показано на рисунке 3.

Рисунок 3 – Сообщение об ошибке второго рода

 

Если  не правильно указать кодировку входного файла, то программа оповестит пользователя следующим сообщением, как показано на рисунке 4.

 

Рисунок 4 – Ошибка кодировки

 

Если  указать количество слов равное нулю, то программа оповестит пользователя следующим сообщением, как показано на рисунке 5.

 

Рисунок 5 – Неверный подсчет слов

 

На входе  был указал файл с текстом Приложение Б

На выходе получился текст Приложение В

Заключение

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

Список использованных источников

1)   Веб коллекция BY.Web, http://romip.ru/ru/collections/by.web-2007.html.

2)   Генератор дорвеев Doorway.Su, http://doorway.su/.

3) Ю.Г.Зеленков, И.В.Сегалович, Сравнительный анализ методов определения нечетких дубликатов для Web-документов // Труды 9-ой Всероссийской научной конференции «Электронные библиотеки: перспективные методы и технологии, электронные коллекции» - RCDL’2007, Переславль, Россия, 2007. – Том 1, С. 166-174. 

4) Парсер mystem http://company.yandex.ru/technology/mystem/.

5) Серверный генератор дорвеев от rusadult.com,

http://doorways.rusadult.com/ru/.

6) В.П.Фоменко, Т.Г.Фоменко, Авторский инвариант русских литературных текстов, 1981.  312 с.

7) Чжун Кай-лай, Однородные цепи Маркова.  Перев. с англ. — М.: Мир, 1964. 425 с

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение А

(обязательное)

Код программы

 

Logic.py

 

# -*- coding: utf-8 -*-

import re, random

 

class ExitLoop(Exception):

    pass

 

class Stemmer:

    cacheLevel = 1

    cache = {}

   

    vovel = u"аеиоуыэюя"

    perfectiveground = u"((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))$"

    reflexive = u"(с[яь])$"

    adjective = u'(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|ему|ому|их|ых|ую|юю|ая|яя|ою|ею)$';

    participle = u'((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)))$';

    verb = u'((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ен|ило|ыло|ено|ят|ует|уют|ит|ыт|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$';

    noun = u'(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|иям|ям|ием|ем|ам|ом|о|у|ах|иях|ях|ы|ь|ию|ью|ю|ия|ья|я)$';

    rvre = u'^(.*?[аеиоуыэюя])(.*)$';

    derivational = u'[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?$';

   

    def __init__(self, cache = 1):

        pass

   

    def s(self, pattern, repl,  str):

        return re.sub(pattern, repl, str) == str

   

    def stemWord(self,  word):

        word = word.lower().replace(u'ё', u'е')

       

        if self.cacheLevel and word in self.cache:

            return self.cache[word]

       

        stem = word

       

        try:

            matches = re.match(self.rvre, word)

            if not matches:

                raise ExitLoop()

           

            start,  RV = matches.groups()

           

            if not RV:

                raise ExitLoop()

           

            # Step 1

            if self.s(self.perfectiveground, '', RV):

                RV = re.sub(self.reflexive, '', RV)

               

                if not self.s(self.adjective, '', RV):

                    RV = re.sub(self.adjective, '', RV)

                    RV = re.sub(self.participle, '', RV)

                else:

                    if self.s(self.verb, '', RV):

                        RV = re.sub(self.noun, '', RV)

                    else:

                        RV = re.sub(self.verb, '', RV)

            else:

                RV = re.sub(self.perfectiveground, '', RV)

           

            # Step 2

            RV = re.sub(u'и$', '', RV)

           

            # Step 3

            if re.search(self.derivational, RV):

                RV = re.sub(u'ость?$', '', RV)

           

            # Step 4

            if self.s(u'ь$', '', RV):

                RV = re.sub(u'ейше?', '', RV)

                RV = re.sub(u'нн$', u'н', RV)

            else:

                RV = re.sub(u'ь$', '', RV)

           

            stem = start + RV

        except ExitLoop:

            pass

       

        if self.cacheLevel:

            self.cache[word] = stem

       

        return stem

 

class Markov:

    links = {}

    stemmer = Stemmer()

    useStemmer = True

    pair = 'Remove'

   

    def __init__(self):

        self.links[''] = []

   

    def normalize(self, word):

        word = word.strip(u',<>/:;"\'[]{}=+_)(*&^%$#@~`').lstrip(u'!?.')

        word = re.sub('[.?!]+$', '.', word)

       

        return word

   

    def load(self, text):

        sentences = re.split(u'\s*[\.\?!]+\s*', text)

       

        for sentence in sentences:

            if sentence == '':

                continue

           

            words = re.split(u'\s+', sentence+'.')

            wordsCount = len(words)

           

            self.links[''].append(words[0])

           

            for i in range(len(words)):

                stem = self.normalize(words[i])

                if self.useStemmer:

                    stem = self.stemmer.stemWord(stem)

               

                if stem not in self.links:

                    self.links[stem] = []

               

                if i+1 < wordsCount:

                    self.links[stem].append(words[i+1])

                else:

                    self.links[stem] = []

       

    def printLinks(self):

        for i in self.links:

            print '"'+i+'": [',

            for j in self.links[i]:

                print '"'+j+'"',

            print ']'

   

    def generate(self, num):

        word = random.choice(self.links[''])

        text = word

       

        for i in range(num-1):

            stem = self.normalize(word)

            if self.useStemmer:

                stem = self.stemmer.stemWord(stem)

           

            if stem in self.links and len(self.links[stem]) > 0:

                word = random.choice(self.links[stem])

            else:

                word = random.choice(self.links[''])

           

            text += " " + word

       

        if self.pair == 'Remove':

            text = re.sub('[\[\]{}"\'<>()]', '', text)

        return text;

 

Генератор.py

hon

# -*- coding: cp1251 -*-

from Tkinter import *

from logic import *

import tkFileDialog, tkMessageBox, os.path, codecs

 

class GUI():

    input = None

    output = None

    stem = None

    charset = None

    pair = None

   

    oldInput = ''

    oldStem = -1

   

    Markov = Markov()

   

    def __init__(self):

        self.mainWindow = Tk()

        self.mainWindow.title(u"Генератор текста на основе Марковской цепи")

       

        self.input = StringVar()

        self.output = StringVar()

        self.words = IntVar()

        self.stem = IntVar()

        self.charset = StringVar()

        self.pair = StringVar()

       

        self.words.set(5000)

        self.stem.set(1)

       

        inputLabel = Label(self.mainWindow, text=u"Открыть файл")

        inputLabel.grid(row=0, column=0, sticky=E+W+N)

        self.inputEntry = Entry(self.mainWindow, width=25, textvariable=self.input)

        self.inputEntry.grid(row=0, column=1)

        self.inputButton = Button(self.mainWindow, text=u"Выбрать...", command=self.setInFile)

        self.inputButton.grid(row=0, column=2, sticky=E+W)

       

        outputLabel = Label(self.mainWindow, text=u"Сохранить файл")

        outputLabel.grid(row=1, column=0, sticky=E+W+N)

        self.outputEntry = Entry(self.mainWindow, width=25, textvariable=self.output)

        self.outputEntry.grid(row=1, column=1)

        self.outputButton = Button(self.mainWindow, text=u"Выбрать...", command=self.setOutFile)

        self.outputButton.grid(row=1, column=2, sticky=E+W)

       

       

        charsetLabel = Label(self.mainWindow, text=u"Кодировка")

        charsetLabel.grid(row=2, column=0, sticky=E+W+N)

        self.charsetEntry = OptionMenu(self.mainWindow, self.charset, 'utf8', 'cp1251')

        self.charsetEntry.grid(row=2, column=1, sticky=W)

        self.charset.set('utf8')

 

 

       

        pairLabel = Label(self.mainWindow, text=u"Повторы")

        pairLabel.grid(row=3, column=0, sticky=E+W+N)

        self.pairEntry = OptionMenu(self.mainWindow, self.pair, u'Удалить', u'Игнорировать')

        self.pairEntry.grid(row=3, column=1, sticky=W)

        self.pair.set(u'Игнорировать')

       

        wordsLabel = Label(self.mainWindow, text=u"Количество слов")

        wordsLabel.grid(row=4, column=0, sticky=E+W+N)

        self.wordsEntry = Spinbox(self.mainWindow, width=10, textvariable=self.words, from_=0, to=999999999999)

        self.wordsEntry.grid(row=4, column=1, sticky=W)

       

        stemLabel = Label(self.mainWindow, text=u"Использовать настройки")

        stemLabel.grid(row=5, column=0, sticky=E+W+N)

        self.stemButton = Checkbutton(self.mainWindow, variable=self.stem)

        self.stemButton.grid(row=5, column=1, sticky=W, columnspan=2)

       

        frame = Frame(self.mainWindow);

        frame.grid(row=6, column=0, columnspan=3);

       

Информация о работе Создание большого объема текста на основе цепи Маркова