2011-12-30 19 views
0

我用這個代碼來生成隨機文本:導入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) 

但它似乎我有錯,我不知道如何處理。

+2

我們需要描述'錯誤'來幫助你。任何錯誤消息? – 2011-12-30 17:20:47

+0

@ 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

+0

您是否嘗試用「沒有模型的時候curr」替換「if curr not in model:」?腳本中的第30行是「curr = choice(list(model))」的第一次或第二次出現? – jimifiki 2011-12-30 18:19:01

回答

1

您的參數text應該是Moby Dick的全部內容,以字符串形式傳入?嘗試傳遞文本文件的位置,並把它作爲一個手柄從read()

Def makemarcov(fileloc): 
    with open(fileloc, 'r') as f: 
     text = f.read() 
    #proceed... 
我的手機上

林生成你的字符串,否則ID還包括try子句中的open()聲明。

編輯

with關鍵字(如果我不是錯了),使用幕後yield語句,並且使用一臺發電機打開該文件。它使用較少的資源來讀取大文件。

+0

這工作,謝謝! – Julia 2011-12-30 18:29:40

+0

我不明白這與OP所描述的或者它將如何解決他們所看到的錯誤是根本不同的。 – DRH 2011-12-30 18:34:13

+0

如果OP傳入一個python *命令*來打開一個文本文件,則該參數將計算爲一個字符串'open('moby.txt','r +')。read()',而不是一本書。 – Droogans 2011-12-30 19:53:40

1

我試着和它的工作...

Aux = open("c:/Codes/A.txt",'r') 
mystring = [] 
for i in Aux: 
    mystring += i 

model = make_markov(mystring) 

輸出不 「說」 清楚;-)

(你有沒有閱讀喬姆斯基關於馬爾可夫語法?)

但可能你沒有真正處理沒有已知的繼任者的情況!

+0

通過重複添加字符串來創建字符串是不好的樣式(取決於它可以是O(n^2)成本的語言)。如果你真的必須這樣做,那麼'mystring =''.join(Aux)'是可取的,但這裏'mystring = Aux.read()'避免了將文件拆分成行,只是將它們再次加入。 – 2011-12-30 18:25:12

+0

謝謝,我學到了一些重要的東西,隨時可以編輯。 – jimifiki 2011-12-30 18:28:20

2

打開文件,讀入文件,使用它。我會使用with聲明,這將保證文件後來被關閉。

with open(my_file, 'r') as f: 
    text = f.read() 
model = make_markov(text) 

對於快速和骯髒的代碼,你可以一口氣做到這一切。

model = make_markov(open(my_file, 'r').read()) 
+0

這應該是正確的答案。 '與'是一個強大的工具,它應該包含在我的答案中。 – Droogans 2011-12-30 18:22:26