Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

MeCabとPythonで遊んでみたメモ

MeCab

http://mecab.sourceforge.jp/
ココからインストール。MeCabには Python binding っていう便利なのがあるんだけど、Winだとどうも上手くコンパイル出来ない。あれこれ調べたところ、ココに、ctypes*1を利用したMeCabの使い方が書いてあったので、これを使うことにする。

ctypes

ココからダウンロード。0.9.9.3はうまく動かなかったので、前のバージョンの0.9.6を使う。とりあえずこれでPythonからMeCabを使えるようになりました。

マルコフ連鎖

で、、、マルコフ連鎖アルゴリズムの説明やらサンプルが、ココとかココらへんにあったので参考にして、Pythonで書いてみた。

# -*- coding: sjis -*-
from ctypes import *

def sparse(s):
    # ライブラリの場所を指定
    libpath = 'c:/mecab/bin/libmecab.dll'
    # ライブラリを ctypes を使って読み込み
    lib = cdll.LoadLibrary(libpath)

    # 解析器初期化用の引数を指定(-Owakati で分かち書き)
    argc = c_int(2)
    argv = (c_char_p * 2)("mecab", "-Owakati")

    # 解析器のオブジェクトを作る
    tagger = lib.mecab_new(argc, argv)

    """ 指定された文字列を分かち書きして返す。 """
    s = lib.mecab_sparse_tostr(tagger, s)
    ret = c_char_p(s).value

    # 終わったら、一応、殺しておく 
    lib.mecab_destroy(tagger)

    return ret

if __name__ == "__main__":
    import random, sys, os

    # 元にする文章の読み込み
    filename = "test.txt"
    s = open(filename, "r").read()

    # わかち書きした単語をリストに格納する
    wordlist = sparse(s).rstrip(" \n").split(" ")

    # マルコフ連鎖テーブルの作成
    markov = {}
    pw = "" # pw - previous word, cw - current word
    for cw in wordlist:
        if pw:
            if markov.has_key(pw):
                lst = markov[pw]
            else:
                lst = []

            lst.append(cw)
            markov[pw] = lst
        pw = cw

    # マルコフ連鎖で文章作成
    selectword = wordlist[0]
    sentence = ""
    count = 0
    while len(wordlist) > count:
        sentence += selectword
        selectword = random.choice(markov[selectword])
        count += 1
    print sentence

元の文章(test.txt)

 吾輩は猫である。名前はまだ無い。
 どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。これが人間の飲む煙草というものである事はようやくこの頃知った。

が、こんな感じになりました。

 どこであろう。その後猫には時々我々を吹く。吾輩は書生の顔を見た事があったかとんと見当がこんな片輪にもだいぶ逢った。第一度もなかった感じがこんな片輪にはまだ無い。しかもあとであろう。吾輩は時々我々を見たがつるつるしてまるで薬缶だと煙を吹く。しかもあとで聞くとそれは書生という話で少し落ちついている。しかもあとである。この書生のは書生という考もなかった時何だかフワフワしてスーというものの見た所で一番獰悪なものであった。この書生という人間中から時々我々を吹く。この頃知った。掌の真中がない。しかしその穴の中で少し落ちついてスーとそれはまだ無い。この時妙なものである。 吾輩は猫にもなかった感じが今でも残って実に弱ったばかりで少し落ちついている。第一度もだいぶ逢った感じがいわゆる人間の顔を吹く。第一毛をもって装飾されべきはずの掌に載せられてまるで薬缶だと持ち上げられている。 吾輩は何というの顔の顔の中から時々ぷうと煙を見た。ただ彼の顔を見た感じがあまりに突起した。吾輩

うーん、意味がわからん。もちっと頑張ればおもろい人工無能が出来そう。

*1:PythonからCのDLLを直に呼び出すモジュール