我用這個代碼來生成隨機文本:導入txt文件,並在馬爾可夫模型使用
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)) #i.e. letter appears for first time at end of text
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 fox jumped over the fence'**)
print ''.join(genrandom(model, 280))
不過,我想用一個txt文件作爲輸入,而不是「狐狸跳過了籬笆「 我一直在試圖用:
text=open('moby.txt','r+').read()
然後:
model = make_markov(text)
但它似乎我有錯,我不知道如何處理。
我們需要描述'錯誤'來幫助你。任何錯誤消息? – 2011-12-30 17:20:47
@ E-SATIS:是的,這是錯誤消息: '回溯(最近通話最後一個): 文件 「/Users/python/Documents/markov.py」 45行,在 打印'。加入(genrandom(model,280)) 文件「/Users/python/Documents/markov.py」,第30行,在genrandom curr = choice(list(model)) File「/Library/Frameworks/Python.framework /Versions/2.7/lib/python2.7/random.py「,第274行,選擇 return seq [int(self.random()* len(seq))]#如果seq爲空則引發IndexError IndexError:list索引超出範圍' –
Julia
2011-12-30 18:12:42
您是否嘗試用「沒有模型的時候curr」替換「if curr not in model:」?腳本中的第30行是「curr = choice(list(model))」的第一次或第二次出現? – jimifiki 2011-12-30 18:19:01