MeCabとPythonでマルコフ連鎖を書いてみる(改)

Python界でも自分で書いたプログラムを晒すとえらい人が添削してくれます、という仕組みはまだないですが、ちょうど時を同じくしてマルコフ連鎖のプログラムを書いている人がいました。

マルコフ連鎖プログラム - pyletの日記


なるほど、マルコフ辞書のキーはタプルにしたほうがスッキリしますね。こういうサンプルソースを公開してくれる人がいると勉強になるなぁ。ありがとうございます。> pyletさん
というわけで、 こないだのプログラム に手を入れてみました。だいぶスッキリしたみたい。これなら、連鎖数3にも5秒でできるよ。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
import MeCab

def wakati(text):
    t = MeCab.Tagger("-Owakati")
    m = t.parse(text)
    result = m.rstrip(" \n").split(" ")
    return result

if __name__ == "__main__":
    filename = "test.txt"
    src = open(filename, "r").read()
    wordlist = wakati(src)

    # Create table of Markov Chain
    markov = {}
    w1 = ""
    w2 = ""
    for word in wordlist:
        if w1 and w2:
            if (w1, w2) not in markov:
                markov[(w1, w2)] = []
            markov[(w1, w2)].append(word)
        w1, w2 = w2, word

    # Generate Sentence
    count = 0
    sentence = ""
    w1, w2  = random.choice(markov.keys())
    while count < len(wordlist):
        tmp = random.choice(markov[(w1, w2)])
        sentence += tmp
        w1, w2 = w2, tmp
        count += 1

    print sentence

『プログラムは、人々がそれを読むために書かれるべきである。
たまたま、それが計算機で実行されるにすぎない。』 - Gerald Sussman


このエントリーのはてなブックマーク (-)