4

我想使用 .txt 文件中书中的字母频率生成随机文本,以便每个新字符 ( string.lowercase + ' ') 依赖于前一个字符。

我如何使用马尔可夫链来做到这一点?或者对每个字母使用 27 个具有条件频率的数组是否更简单?

4

2 回答 2

8

我想使用 txt 文件中书中的字母频率生成随机文本

考虑在一次循环两个字母的文本文件时使用collections.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))
于 2011-12-28T19:02:08.287 回答
1

如果每个字符只依赖于前一个字符,您可以计算所有 27^2 对字符的概率。

于 2011-12-28T19:01:55.950 回答