SSブログ

一週間に一回Rubyプログラミングねた4ー人工無脳 [プログラミング]

まだまだ続くよ、人工無脳。

前までは茶筅をMacにインストールする所までやりました。実際に動かすのはこれから先です。とりあえずRubyからchasenを呼んでいるところを見て動かしてみましょうかね。

そもそもの動作がわからない所が面倒だけど、本と同じ感じだったらいいことにします。結局、挙動を一緒にすること自体が最終的な目的じゃなくて、人工無脳が動かせることが問題だから、細かいことは気にしない(それ、わかちこわかちこ)。


恋するプログラム―Rubyでつくる人工無脳

恋するプログラム―Rubyでつくる人工無脳

  • 作者: 秋山 智俊
  • 出版社/メーカー: 毎日コミュニケーションズ
  • 発売日: 2005/04
  • メディア: 単行本(ソフトカバー)


にしても、この書籍の名前は恥ずかしいなぁ。恐らくどの書店にももう置いてないので、Amazonがあって良かった。書名を本屋で言って恥ずかしい思いをしなくて済むw。ISBN言っても題名を復唱されそうだしw。

 
前回、MeCabはどうでもいいと言ってスルーしていましたが、一応見てみました。

 http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html

あ、googlecodeはsubversionなんだ〜。gitは使えるのかな? GitHubしか使っとらんからよくわからないけど、サポートしているのは今時としては普通だろうね。そういやcodebreak;使ってないな。

それはともかく、mecabは基本、chasenと同じようなカテゴリのソフトらしい。「オープンソース 形態素解析エンジン」で、「パラメータの推定にConditional Random Fields (CRF)を用いており, ChaSenが採用している隠れマルコフモデルに比べ性能が向上して」いるらしい。なんかよく分からんが、Chasenは開発が止まっているみたいなので、無理に使い続ける訳は特にない事になる。そのうちChasenからの移行も考えてみよう。

$ mecab
いずれショウ君に話させたいなぁ
いずれ	副詞,助詞類接続,*,*,*,*,いずれ,イズレ,イズレ
ショウ	名詞,一般,*,*,*,*,ショウ,ショウ,ショー
君	名詞,接尾,人名,*,*,*,君,クン,クン
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
話さ	動詞,自立,*,*,五段・サ行,未然形,話す,ハナサ,ハナサ
せ	動詞,接尾,*,*,一段,連用形,せる,セ,セ
たい	助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
なぁ	助詞,終助詞,*,*,*,*,なぁ,ナァ,ナー
EOS

こんな感じで使えた。文を細切れにしてくれるらしい。それを元に返す言葉を処理すればいいわけだ。人間らしい言葉を組み立てられたら、そこでひとつのゴールとなるだろう。

内容はいくらか問題があっても、日本語の文法的に問題がなければ、あとはここが変だよって人間が教えて矯正してあげるしかない。そこいらの学習ってのは、その時代の常識などによるので、人間がある程度の人格形成をマニュアル的に作ってあげないといけないだろう。




と、初めに脱線してしまいましたが、Chasenを使うソースを見てみたい。

結局、具体的にはWindows環境ではどうしているのかってことだけど、本を読むかインストールして実際に動かしてみるか、という事になると思う。本質的にわかるのは、やっぱりソースから行った方が早いので、chasenで引っ掛けてspotlightで探してみる。

ん〜一番初めのはstudy2のところですね。あとはstudy3, google, markovの所。あ〜、Chaptor 7-3のソースなのでかなり最後の方ですね。流れとして前提となる挙動が分かりづらいね。だけど、一応study2のソースを見てみる。morph.rbはchasen.rbをrequireしているので、まず初めはchasen.rbをザックリ見ていく。



chasen.rbには、Win32APIをrequireしている。どうもincludeって言いたくなっちゃうな。C/C++を使っている期間が長かったので、Rubyでも慣れない。あとimportってのもあったっけ? Obj-Cだっけ? いろいろ言語を渡り歩いていると、そこいらの常識が交錯してくる。それも少しずつ役割が違ったりして面倒くさい事この上ない。書いているうちに思いだしてしっくりくるけど、使い始めはなんか気持ち悪い。

Win32APIは大体、MS Officeのマクロを叩く時に使ったりしたと思ったが、結局DLLを使うのと同じなのかな。本来的にはWin32のためのものなんだろうけど、多くはCOM系のライブラリを利用する仕組みを利用する事になるんだと思う。まぁ結局、中身のオブジェクトまで使おうとすると、Win32のようなオブジェクトがほとんど関係しない使い方だけではダメなんだろうけど。

ともあれ、exeを直接叩いて標準出力で結果を得るとかいう話では無いようだ。まぁWindows的なお作法としてはそれで間違っていない。しかし、汎用性があるかと言われればほぼないと言われても仕方がない。そんな訳でMacでそのままソースを使える状態にはなっていないという事だ。Macでも何かCOM的な仕組みがあった気がするけど、今回やりたい事は人工無脳を扱う事なので、互換性を作るパイプを作りたいわけじゃない。そもそも、UNIX系にWindowsベッタリのRubyのソースを動かす事なんて、他にあまり思いつかないし、それほどの能力も労力もないわけで。後々役立ちそうにないしね。そんな事をしている前にやる事あるだろうと。


さて、どうしようかな。標準入出力経由でやるのがUNIX的ではあるので、普通にsystem()でいいかな。ってか、それしか知らんとです。

 http://qiita.com/tyabe/items/56c9fa81ca89088c5627

おーいろいろあるんですねぇ。system以外はRubyで使った事ないな、たぶん。そんな込み入った事した事ないし。ここできっちり勉強しとけってことですね、はい。


その前にmodule Chasenで具体的に何をやっているのかを確認。
  DLL = 'chasen.dll'
  Setarg  = Win32API.new(DLL, 'set_argument_parameters', 'ip', 'i')
  Analyze = Win32API.new(DLL, 'analyze','p', 'p')

chasen.dllってのに、set_argument_parametersって関数にipとiっていうパラメータを渡しているっぽい。dllの仕様知らないと何とも言えんので、chasenの資料を読まないとなぁ。ん〜dllの仕様とか書いてあるもの無さそうだな。makeファイル見たところで何ともならないし。

RubyのWin32APIの仕様の方が先か。ん〜公式リファレンスを見たら、chasen.dllのset_argument_parameters()に数字とポインタ渡して、数字をもらってくるって事らしい。

 http://docs.ruby-lang.org/ja/2.0.0/method/Win32API/s/new.html

初期段階でset_argument_parameters()と、analyze()を使えるようにしてるだけ。なんだけど、chasen側のソースにはどちらも見つからないんだよなぁ。特にDLLにそういう関数をエクスポートする記述のあるファイルがないっぽい。何だろう…。もう面倒なので深くはつっこまない。

NKFを使っている所は、基本Shift-JISを使うようだ。これもUTF-8仕様に持ってきた方がいいかな。まぁそこいらは解析するChasen側のサポートいかんなのだろうと思われ。


少なくともchasen.rbについては大改造と言うか、かなりの書き直しが必要になってくる。そこまでして、Mac上で動かすかどうかは他のソースを見てからにしようと思う。茶筌よりも和布蕪の方がいいらしいので、いきなりそっちの方に移行してしまうかもしれない。とにかく、ちょこっと変えただけで何とかなるレベルではないけど、十数行くらい書けば同じような挙動には出来そうだ。そもそもの動き方がどうなってるのかが分かんないんだけどねw。結局、Windowsで動かす事になりそうな雰囲気ではある。

幸いな事にchasenを使っているソースはmorph.rbしかないので、茶筌から関数経由ではなく、標準入出力で変えても全体を変える必要はないらしい。そこいらはある程度粗結合にはなっているのね。Rubyではそういうプラグイン的な扱いってのはどうするのかなぁ。何かそういう仕組みがあるんだろうか。今まで間に合わせ的にしか使っていないので、本気で言語仕様から見つめ直さないといけないのかも。面倒いなぁ。

さっぱりRubyに辿り着かない感じのこのエントリー。もうちっと実用的なものかネタ的なものにしようと思っていたけど、あまり汎用性のない話になりつつある。Rubyはともかく人工無脳ってのも今特に盛り上がっているってわけじゃないだろうし。思ったより面倒なことになっているので、今度もコーディングなしですw。

タグ:Ruby
コメント(0) 
共通テーマ:資格・学び

コメント 0