我使用下面的代码来生成随机文本:
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文件作为输入,而不是我一直尝试使用的'the fox over the fence‘:
text=open('moby.txt','r+').read()然后:
model = make_markov(text)但是我好像有些地方不对劲,我不知道该怎么处理。
发布于 2011-12-31 02:05:30
您的参数text应该是Moby Dick的全部内容,并以字符串的形式传入?尝试传递文本文件的位置,并将其用作从read()生成字符串的句柄
Def makemarcov(fileloc):
with open(fileloc, 'r') as f:
text = f.read()
#proceed...即时消息在我的手机上,否则id也会在try子句中包含open()语句。
编辑
with关键字(如果我没弄错的话)在幕后使用yield语句,使用生成器打开文件。它使用较少的资源来读取大文件。
发布于 2011-12-31 02:20:19
打开文件,读入,使用它。我将使用with语句,该语句将确保文件随后被关闭。
with open(my_file, 'r') as f:
text = f.read()
model = make_markov(text)对于又快又脏的代码,你可以一次完成所有的工作。
model = make_markov(open(my_file, 'r').read())发布于 2011-12-31 02:14:37
我试过了,它起作用了。
Aux = open("c:/Codes/A.txt",'r')
mystring = []
for i in Aux:
mystring += i
model = make_markov(mystring)输出不是“那么”清楚;-)
(你读过乔姆斯基关于马尔可夫语法的书吗?)
但是,您可能并没有真正处理没有已知继任者的情况!
https://stackoverflow.com/questions/8682077
复制相似问题