マルコフ連鎖プログラム

プログラミング作法に載っていたマルコフ連鎖プログラムを作ってみました。

プログラミング作法

プログラミング作法

import sys, random

MAXGEN = 1000
nonword = "\n"
w1 = w2 = nonword
statetab = {}

while 1:
    line = sys.stdin.readline()
    if line == "":
        break
    for word in line.split():
        if not statetab.has_key((w1, w2)):
            statetab[(w1, w2)] = []
        statetab[(w1, w2)].append(word)
        w1, w2 = w2, word

if not statetab.has_key((w1, w2)):
    statetab[(w1, w2)] = []
statetab[(w1, w2)].append(nonword)

w1 = w2 = nonword
for i in range(MAXGEN):
    suf = statetab[(w1, w2)]
    r = random.randint(0, len(suf) - 1)
    t = suf[r]
    if t == nonword:
        break
    print t,
    w1, w2 = w2, t

マップのキーがタプルで、要素がリストになってるんですが、キーが存在しない場合は初期化してやらなきゃいけないところが、もうちょい綺麗に書けないのかなぁ(if not statetab.has_key...のあたり)

実行例。英語だとよくわからないので、日本語のテキストをkakasiでわかち書きしてます。

C:\Python24>python.exe markov.py < yow.txt
そんな 事 より 1 よ 、 ボケ が 。 得意 げな 顔 して 何 が 、 つゆだくで 、 とか
 言って るんです 。 そこでまたぶち 切れ ですよ 。 あのな 、 つゆだくなんてきょう
び 流行 んね ー んだよ 。 ボケ が 。 得意 げな 顔 して 何 が 、 大盛 つゆだくで
、 だ 。 お 前 は 本当 につゆだく を 食い たいのかと 問い たい 。 問い 詰め たい
 。 お 前 らな 、150 円 引き 、 とか 言って るんです 。 そこでまたぶち 切れ
ですよ 。 あのな 、 つゆだくなんてきょうび 流行 んね ー んだよ 。 ボケ が 。 1
50 円 だよ 、150 円 引き 如き で 普段 来て ない 吉野家 に 来て んじゃね ー
よ 、 ちょいと 聞い てくれよ 。 スレ とあんま 関係 ないけどさ 。 このあいだ 、
近所 の 吉野家 行った んです 。 吉野家 。 そしたらなんか 人 がめちゃくちゃいっぱ
いで 座れ ないんです 。 で 、 よく 見た らなんか 垂れ 幕下 がってて 、150 円
。 なんか 親子 連れ とかもいるし 。 一家 4 人 で 吉野家 か 。 おめでて ー な 。
 よ ー し パパ 特盛 頼ん じゃうぞ ー 、 とか 言って るの 。 もう 見て らんない
。 お 前 は 本当 につゆだく を 食い たいのかと 問い たい 。 問い 詰め たい 。 問
い 詰め たい 。 小 1 時間 問い 詰め たい 。 お 前 らな 、150 円 。 なんか 親
子 連れ とかもいるし 。 一家 4 人 で 吉野家 か 。 おめでて ー な 。 よ ー し パ
パ 特盛 頼ん じゃうぞ ー 、 とか 言って るんです 。 そこでまたぶち 切れ ですよ
。 あのな 、 つゆだくなんてきょうび 流行 んね ー んだよ 。 ボケ が 。 得意 げな
顔 して 何 が 、 大盛 つゆだくで 、 だ 。 お 前 、 つゆだくって 言い たいだけち
ゃうんかと 。 吉野家 。 そしたらなんか 人 がめちゃくちゃいっぱいで 座れ ないんで
す 。 で 、 よく 見た らなんか 垂れ 幕下 がってて 、150 円 やるからその 席 空
け ろと 。 吉野家 通 の 俺 から 言わ せてもらえば 今 、 吉野家 通 の 頼み 方 。
ねぎだくってのはねぎが 多め に 入って る 。 そん 代わり 肉 が 少な め 。 これ 。
 で 、 よく 見た らなんか 垂れ 幕下 がってて 、150 円 引き 如き で 普段 来て
ない 吉野家 に 来て んじゃね ー よ 、 ちょいと 聞い てくれよ 。 スレ とあんま 関
係 ないけどさ 。 このあいだ 、 近所 の 吉野家 行った んです 。 吉野家 。 そした
らなんか 人 がめちゃくちゃいっぱいで 座れ ないんです 。 で 、 それに 大盛り ギョ
ク ( 玉子 )。 これ 最強 。 しかしこれ を 頼む と 次 から 店員 に マーク される
という 危険 も 伴う 、 諸 刃 の 剣 。 素人 にはお 薦め 出来な い 。 まあお 前 、
1 は 、 牛 鮭 定食 でも 食って なさいってこった 。