rubyによるマルコフ連鎖とvimのデバッグ操作

中西研の北原です。前回はrubyのライブラリであるnokogiri, mechanize, ruby-growlを使いました。今回はnokogiriを使いさらに形態素解析エンジンであるMeCabを利用して簡単なマルコフ連鎖による文章の再構築を行ってみることにします。また僕はvimを使っているのでそのあたりにも触れる予定です。

まずはMeCabの環境をMacに整えます。

sudo port install mecab +utf8
sudo port install mecab-ipadic-utf8
sudo port install rb-mecab

を行いMeCabのインストールとrubyのバインディングを用意します。

次にマルコフ連鎖についてですが、難しい本質についてはよくわからないのでWikipediaを参照していただけると助かります。ここではある文章を「今日は雨だ。しかし、私は明日学校へ行く」としたとき「今日、は、雨、だ。しかし、私、は、明日、学校、へ、行く」という文に分けることが出来た時に前後の繋がりを利用して再構築を行います。例えば「今日→は」という繋がりと「は→学校」などという流れが沢山出来ます。これを繋げることで「今日は学校…」という新しい文章が出来ます。しかし「私は雨..」という文も作られてしまいます。ここではこのように意味が通りにくい文章を作りにくくするために「(今日→は)→雨」というように2語+1語で文章の再構築を行います。

では実際のソースはこちらです。

今回は解析する文章の対象をAsahi.comのヘッドラインの一番最初としました。ヘッドラインの中から一番最初の項目を取得しそのurlをopenで開き、その中の記事だと思われるタグの中の文章を取得します。前回はhttps通信をするためにmechanizeを使いましたが、今回はhttpなのでopen-uriで簡単に開けます。

Mecabではnewする際に”-Owakati”とすることで”今日 は 雨 だ。”のようにスペース区切りで文章を返してくれるのでそれをsplitします。今回はeach_consを使っていますが、これは配列に対してeach_consに渡した数字分のサイズの配列で区切ってくれるというものです。例えば”1, 2, 3, 4,5″という配列でeach_cons(3)とすると、”1,2,3″, “2,3,4”, “3,4,5”のように返してくれます。

後はEOSを見つけるまで文章の繋ぎ込みをします。今回はループの限度を決めていませんが実際に使う際はループの限度を決めないと同じフレーズを繰り返してしまう場合があります。また文章を繋ぎ込む際に確立を用いればより自然な文章を生成することが出来ると思います。今回試してみた所このような文章が生成されました。意味があるようでまったく意味不明な文章になりました。

 スペイン・セビリアで開かれている国連教育科学文化機関(ユネスコ)の世界遺産候補の「落選」は昨年の「情報照会」の結論が出た。再度の審議は早くて来年。ユネスコは新規登録を抑える傾向にあり、2年連続の落選は、22の資産を結ぶのが『ル・コルビュジエの代表的な都市計画「チャンディガールの建築物群」を抱えるインドが参加を見送ったことも不利に働いた。 08年2月の推薦手続きの直前に、ル・コルビュジエの作品。(小川雪)

またこのようなプログラムを書く際、エディターで編集->コンソールでruby hogehogeと実行という流れはとてもめんどくさいものです。そこでvimを使っている場合はQuickRun.vimというujihisa氏が開発しているプラグインが便利です。

[quickrun] ruby (~) - VIM
Uploaded with plasq‘s Skitch!
このようにウィンドウの下にコンソールで出力されているものが表示されます。これによってエディターとコンソールの往復がなくなり素早い開発が行えます。詳しい操作については控えますが出力する際は<Leader>rにマッピングされています。<Leader>はデフォルトですと””になっています。
カテゴリー: diary, programming パーマリンク

コメントを残す