Автор работы: Пользователь скрыл имя, 06 Мая 2013 в 16:34, курсовая работа
Отметим, что в настоящее время не существует полной теории, описывающей законы порождения связных осмысленных текстов. Как следствие отсутствуют в общем случае методы порождения текстов, не отличимых от созданных человеком. Тем не менее, известны многие закономерности, характерные естественным текстам:
- единство стиля;
- следование законом жанра;
- локальная связность;
- глобальная тематическая связность и т.п.
Цепи Маркова позволяют моделировать лишь локальную связность текста и общие тематические характеристики.
Основная идея настоящей работы состоит в том, чтобы с учетом статистических характеристик стилистических и жанровых особенностей естественных текстов порождать неестественные тексты, обладающие локальной связностью.
Введение 5
Задание и исходные данные в соответсвии с номером варианта………… 6
1) Обобщённая структурная схема системы связи для передачи дискретных сообщений …………………………………………………………………………….7
2) Расчёт информационных характеристик источник .……………………..9
3) Построение кода для сообщений источника……………………………..11
4) Статистические характеристики закодированных сообщени……… ….13
5) Оптимальное по минимуму средней ошибки правило восстановления символа при приёме в условиях сильно зашумленного сигнала…………………15
6) Ошибки в передаче сообщений и вероятность правильного приема последовательности сообщений по слабо зашумленному сигналу………………17
Заключение…………………………………………………………………….19
Список использованных источников………………………………………
Егор сам на телятках внуки на лошадке жена на коровке дети на коровке.
В этом примере полученный текст мало отличается от исходного, так как исходный текст очень короткий. Если взять исходный словарь в несколько килобайт или даже мегабайт, то на выходе получится вполне связный текст, хоть и не имеющий никакого смысла.
3 Тестирование программы
Программа имеет следующий интерфейс, как показано на рисунке 1.
Рисунок 1 – Интерфейс программы
Перед запуском генерации текста нужно выполнит следующие шаги:
Обработка ошибок:
Если начать генерацию текста не указав исходный файл, то программа оповестит пользователя сообщением об ошибке первого рода, как показано на рисунке 2.
Рисунок 2 – Сообщение об ошибке первого рода
Если начать генерацию текста не указав выходной файл, то программа оповестит пользователя сообщением об ошибке второго рода, как показано на рисунке 3.
Рисунок 3 – Сообщение об ошибке второго рода
Если не правильно указать кодировку входного файла, то программа оповестит пользователя следующим сообщением, как показано на рисунке 4.
Рисунок 4 – Ошибка кодировки
Если указать количество слов равное нулю, то программа оповестит пользователя следующим сообщением, как показано на рисунке 5.
Рисунок 5 – Неверный подсчет слов
На входе был указал файл с текстом Приложение Б
На выходе получился текст Приложение В
Заключение
В данной работе было разработан генератор текста, для порождения поискового спама, на основе цепи Маркова. Теоретически и численно обоснована применимость разработанного алгоритма для порождения неестественных текстов. Порожденные тексты на основе цепей Маркова, широко используемых для создания веб-спама.
Список использованных источников
1) Веб коллекция BY.Web, http://romip.ru/ru/
2) Генератор дорвеев Doorway.Su, http://doorway.su/.
3) Ю.Г.Зеленков, И.В.Сегалович, Сравнительный анализ методов определения нечетких дубликатов для Web-документов // Труды 9-ой Всероссийской научной конференции «Электронные библиотеки: перспективные методы и технологии, электронные коллекции» - RCDL’2007, Переславль, Россия, 2007. – Том 1, С. 166-174.
4) Парсер mystem http://company.yandex.ru/
5) Серверный генератор дорвеев от rusadult.com,
http://doorways.rusadult.com/
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',<>/:;"\'[]{}=+_)
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[
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);
Информация о работе Создание большого объема текста на основе цепи Маркова