2012-01-07 8 views
0

これを使用して、前のペアに対する文字のカウンタを作成するのに成功しました。文字のペアのランダムなテキストとカウンタ

def pairwise(iterable): 
    it = iter(iterable) 
    last = next(it) + next(it) 
    for curr in it: 
     yield last, curr 
     last = last[1]+curr 


valid = set('abcdefghijklmnopqrstuvwxyz ') 

def valid_pair((last, curr)): 
    return last[0] in valid and last[1] 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: 
      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 

この2番目の設定に適合させるのに問題があります。出力が期待していたものと一致しません。ありがとう!

+0

時の関数の最初のグループは動作しません

for newcurr, cnt in d.items(): cumulative += cnt if cumulative > target: break curr = curr[1] + newcurr 

はまた、収量はただ一つの文字を生成するために変更する必要があります。あなたは、py3kで消えたifilter(itertools?)と一緒にpy3kで新しいカウンタ(コレクション?)を使用しています。あれは正しいですか ? – joaquin

+0

もちろん、python 2.7で動作します:コレクションからimport counter、defaultdict; iteroolsからの のインポートifilter; ランダムなインポートの選択肢、randrange –

答えて

1

私は、currが2文字の組み合わせであることを忘れていたと思います。最後のループは変更されるべきであるとCURRはそれの後に構築:

関連する問題