ИНФОРМАЦИОННАЯ ТЕОРИЯ: пытаясь создавать новые тексты, используя стохастические свойства других текстов PYTHON - PullRequest
0 голосов
/ 24 сентября 2018

Недавно я нашел книгу Шеннона и увидел интересную главу: http://math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf

enter image description here

Я хотел бы создатьФункция в Python такая, что, учитывая текст и заданный порядок, создайте другой текст длиной N с аппроксимацией k-порядка стохастических свойств текста:

def create_text(text, N, n)

Однако я не знаю алгоритмреализовать такую ​​функцию.Я полагаю, что я должен посчитать частоту букв, но как соотнести некоторые буквы с другими в соответствии с заданным порядком?

МОЯ ПОПЫТКА:

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

# Input: text, letter, (recursive argument), dictionary for bigrams
def find_next (txt, x, index_txt, dic):
    total = txt.count(x)
    current = txt.find(x, index_txt)
    if current == -1: return
    print (current, txt[current+1])
    # Set dictionary
    keys = dic.keys()
    index_dic = x+txt[current+1]
    if index_dic in keys:
        dic[index_dic] += 1/total
    else:
        dic[index_dic] = 1/total
    find_next(txt, x, current+1, dic)

Эта функция считает частоту появления буквы x + еще одну.Однако, когда текст заканчивается на x, функция завершается ошибкой из-за выхода за пределы диапазона.Я вижу, что в строке txt [current + 1] ошибка, но я не могу понять, как вернуться назад.Я имею в виду, когда я доберусь до последней буквы, вернитесь к первой и окончите.

Пример:

f = "this is amazing"

Если я не смог найти find_next (f, 'g', 0, {}) функция завершается сбоем в конце, потому что я не знаю, как подключить g к первой букве t.

Я полагаю, это можно решить.Но затем, когда я вычисляю частоты уникальных букв (a, b, c, ...) и затем биграмм (ae, ar, at, bg, bj, ...), что дальше ..?Триграммы и тд?Я не могу понять алгоритм.

Заранее спасибо

1 Ответ

0 голосов
/ 24 сентября 2018

Типичный подход к этой проблеме заключается в следующем:

Часть анализа

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

Часть генерации

  • Для каждой новой буквы, которая будет сгенерирована, создайте простую вероятностьтаблица для следующего символа с учетом последних n-1 букв, которые уже были сгенерированы.
  • Создание случайного числа для выбора одного из возможных следующих символов.
...