2011-12-30 8 views
0

私はランダムなテキストを生成するためにこのコードを使用しています:しかし、私はキツネがフェンスを飛び越えた代わりに」の入力として、txtファイルを使用したいインポート.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)) 

を「 は私がしようとしている:

text=open('moby.txt','r+').read() 

、その後:

model = make_markov(text) 

しかし、それは思えます私は何かが間違っている、私はどのようにこれを処理するか分からない。

+2

「間違っている」という説明が必要です。エラーメッセージはありますか?電子サティス@ –

+0

: 'トレースバック(最新の呼び出しの最後): プリント 'で ファイル "/Users/python/Documents/markov.py"、45行、' はい、これはエラーメッセージです。 ファイル "/Users/python/Documents/markov.py"、行30、genrandom curr = choice(list(model)) ファイル "/Library/Frameworks/Python.framework /versions/2.7/lib/python2.7/random.py "、line 274、select return seq [int(self.random()* len(seq))] seqが空の場合にIndexErrorを発生させます。 IndexError:listインデックスが範囲外にある " – Julia

+0

" curr not in model: "を" model in curr not "と置き換えようとしましたか?あなたのスクリプトの30行目は、 "curr = choice(list(model))"の最初か2番目の出現ですか? – jimifiki

答えて

1

パラメータtextは、Moby Dickの全内容を文字列として渡すことになっていますか?そうでない場合は、IDもtry句内open()文を含め、テキストファイルの場所を渡して試してみて、自分の携帯電話にread()

Def makemarcov(fileloc): 
    with open(fileloc, 'r') as f: 
     text = f.read() 
    #proceed... 

イムから、あなたの文字列を生成するためのハンドルとして使用することができます。

EDIT

withキーワード(Imが間違っていない場合)、発電機を使用してファイルを開く、舞台裏yieldステートメントを使用しています。大量のファイルを読み込むために使用するリソースが少なくなります。

+0

これは、うまくいった! – Julia

+0

私はこれが基本的にOPの説明とは根本的にどのように異なっているのか、見ているエラーにどう対処するのか分かりません。 – DRH

+0

OPがテキストファイルを開くためにpython *コマンド*で渡された場合、引数はブックの代わりに 'open( 'moby.txt'、 'r +')。read()'という文字列に評価されます。 – Droogans

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()'はファイルを再び行に分割することを避けます。 –

+0

ありがとう、私は何か重要なことを学び、自由に編集できるようにしました。 – jimifiki

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

関連する問題