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番目の設定に適合させるのに問題があります。出力が期待していたものと一致しません。ありがとう!
時の関数の最初のグループは動作しません
はまた、収量はただ一つの文字を生成するために変更する必要があります。あなたは、py3kで消えたifilter(itertools?)と一緒にpy3kで新しいカウンタ(コレクション?)を使用しています。あれは正しいですか ? – joaquin
もちろん、python 2.7で動作します:コレクションからimport counter、defaultdict; iteroolsからの のインポートifilter; ランダムなインポートの選択肢、randrange –