Python 字母尺度上的马尔可夫链与随机文本

Python 字母尺度上的马尔可夫链与随机文本,python,markov-chains,Python,Markov Chains,我想使用.txt文件中的一本书中的字母频率生成一个随机文本,这样每个新字符(string.lowercase+')都取决于前一个字符 我如何使用马尔可夫链来做到这一点?或者对每个字母使用27个带条件频率的数组更简单吗?如果每个字符仅依赖于前一个字符,则可以计算所有27^2对字符的概率 我想生成一个随机文本使用字母频率从一个 以txt文件保存的书籍 当在文本文件上一次循环两个字母时,请考虑使用以增加频率 我如何使用马尔可夫链来做到这一点?还是使用27个阵列更简单 每个字母的条件频率 这两种说法是等

我想使用.txt文件中的一本书中的字母频率生成一个随机文本,这样每个新字符(
string.lowercase+'
)都取决于前一个字符


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

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

我想生成一个随机文本使用字母频率从一个 以txt文件保存的书籍

当在文本文件上一次循环两个字母时,请考虑使用以增加频率

我如何使用马尔可夫链来做到这一点?还是使用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))

随机文本还是随机单词?如果只是随机文本,则不需要使用马尔可夫链。@jknupp它只是随机字母和空格,而不是单词。如果你不在乎字母频率是否相同,你可以使用一个随机数生成器生成一个随机字符,它的范围包括你感兴趣的编码类型。如果您需要相同的频率,那么根据前一个字母计算字母频率将是最简单的方法。@jknupp我已经完成了一个简单的随机文本生成,我想使用基于前一个字母的频率。您知道如何从原始文件中获取这些条件频率,以及如何实现它们以生成随机文本吗?谢谢我编辑您的答案是为了不需要滚动文本另一个不错的配方,它看起来函数genrandom不需要语句“last=curr”。@RaymondHettinger非常感谢您的帮助,尽管我对
d=model[curr]
和下面的代码块的作用感到困惑。你能解释一下吗?非常感谢。