2009-08-15

送る

18で帰るらしいので,木津駅まで送る. 楽しかった.

tomocha - 2-gramデータベースで,マルコフ生成

とりあえずマルコフ生成*1をしようということで,やっているのだが, 粗造りながらも,なんとか骨組みはできた. 2ちゃんねるから300件ほどスレッドを取ってきて *2, それらを形態素で分かち書きして,2-gramデータベース*3を作った.そして,それをもとに文章生成してみた.

しかし,実際に文章を生成してくれると, 意味のない文章でも楽しいものだなあ.

たとえば,"山"から文章を生成してみたら以下のものができた.

getNext(<20)
山ほどのは、「けいおんです。「けいおんです。「けいお
getRandom
山ほどセレブもの見られるとやる気満々。男っぷりを贈呈し違法複製ししたくて今から消えまくり

getNextは共起確率が最も高いものを単純につなげただけ. getRandomは2-gram*4データベースにおいて,1度でも共起しているの中からランダムにつなげていったもの.

何度か遊んでみて分かるのは,単純に 案外ランダムで選択してみても文章ができちゃうということ. ただし,上で挙げたのは,割とうまくいった例.

秘密もチェックしなかったときほどおという恋愛に忠実さ

などという,意味不明な文章の中でも,より意味不明な文章を生成することもままある.

あとは,単純に頻度が高いものを選択していくやり方だと, 上記のような

「 → けいおん → です → 。 → 「

といった,無限ループが発生すること. 句読点などの記号は除外することや,頻度で重み付けしたランダム生成を試してみるのもよいかもしれない.

ちょっとはPythonにも慣れてきて, NAIST入ってからやっとこさNLPっぽいことやって(やっとか!), (内容はともかく)目で分かる結果が出て, 今日は大満足である.

*1 次に出現する頻度の高いものを選択していく手法

*2 ここらへんの言語資源選定は,まずは適当.リソースの選び方次第でも,おもしろいものができると思う

*3 直前の(n-1)個の単語から,次の単語を予測するモデルをn-gram言語モデルといいます (Google Japan Blogより引用)

*4 参考にするのは直前の1単語だけということ