Цепь Маркова по буквенной шкале и случайному тексту - PullRequest
4 голосов
/ 28 декабря 2011

Я хотел бы сгенерировать случайный текст с использованием буквенных частот из книги в файле .txt, чтобы каждый новый символ (string.lowercase + ' ') зависел от предыдущего.

Как использовать Марковцепочки для этого?Или проще использовать 27 массивов с условными частотами для каждой буквы?

Ответы [ 2 ]

8 голосов
/ 28 декабря 2011

Я хотел бы сгенерировать случайный текст, используя буквенные частоты из книги в текстовом файле

Рассмотрите возможность использования collection.Counter чтобы увеличить частоты при циклическом перемещении по текстовому файлу по две буквы за раз.

Как использовать цепочки Маркова для этого?Или проще использовать 27 массивов с условными частотами для каждой буквы?

Два утверждения эквивалентны.Цепь Маркова - это то, что вы делаете.27 массивов с условными частотами: как вы делаете это.

Вот некоторый кодовый словарь, с которого можно начать:

from collections import defaultdict, Counter
from itertools import ifilter
from random import choice, randrange

def pairwise(iterable):
    it = iter(iterable)
    last = next(it)
    for curr in it:
        yield last, curr
        last = curr

valid = set('abcdefghijklmnopqrstuvwxyz ')

def valid_pair((last, curr)):
    return last in valid and curr in valid

def make_markov(text):
    markov = defaultdict(Counter)
    lowercased = (c.lower() for c in text)
    for p, q in ifilter(valid_pair, pairwise(lowercased)):
        markov[p][q] += 1
    return markov

def genrandom(model, n):
    curr = choice(list(model))
    for i in xrange(n):
        yield curr
        if curr not in model:   # handle case where there is no known successor
            curr = choice(list(model))
        d = model[curr]
        target = randrange(sum(d.values()))
        cumulative = 0
        for curr, cnt in d.items():
            cumulative += cnt
            if cumulative > target:
                break

model = make_markov('The qui_.ck brown fox')
print ''.join(genrandom(model, 20))
1 голос
/ 28 декабря 2011

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

...