2012-01-01 7 views
0

コードの説明:のpython私はランダムなテキストを生成するには、このコードを研究してきた

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)) 

しかし、私はトラブル最後のビットを理解し、ターゲットから= randrangeを持っています(合計(d.values()))以降。 説明をいただければ幸いです!ありがとう!

答えて

2

target = randrange(sum(d.values()))

d.values()モデルが対象に対抗するための辞書マッピングの手紙で、カウンターオブジェクトが辞書であるので、d.values()は、辞書内の各キーのすべてのカウントのリストである(ただし、返しませんキー)。つまり、sum(d.values())はすべてのカウントの合計を返します。 randrange() [0、result]内の値を選択します。結果はsum(d.values())の値でした。

d.items()は、指定されたカウント辞書の各項目のキー、値のペアを返します。コードは、各文字に確率を割り当て、文字を選択しようとしています。カウントが( 'a'、5)、( 'b'、7)、( 'c'、2)の場合、合計カウント数は14です。コードは0から13までの乱数を選択します)。結果が[0、5]であれば 'a'、結果が[5,12]ならば 'b'、結果が[12,14]ならば'c'を返します。相対確率は、これらの範囲の幅によって決定され、範囲の幅は、make_markovで決定されたカウントによって決定されます。

+0

ありがとうございました。しかし、最後のビットはどうですか?累積ではありません>目標は常に真ですか?この声明の目的は何ですか?ご協力いただきありがとうございます! – Julia

+0

"currがモデルではない場合:curr = choice(list(model))"を "model:curr = choice(list(model))"のcurrに置き換えなければならないかどうかを知りたいですか? (私はすでにこのコードを1回発言しましたが、私は答えがありました) – jimifiki

+0

@jimifikiおそらくmlefavorはわかりません。 – Julia

関連する問題