Rubyからdoc2vecやscikit-learnを扱う
2016/10/05
RubyからPythonやJuliaのパッケージを呼び出せるvirtual_moduleっていうgemを最近作っています。下記の例では、いくつかのコマンドのmanpageをドキュメントとして読み込むところまでをRubyで書いて、doc2vecの処理にかける部分はPythonを呼び出してgensimに任せるということをやっています。
個人的には文字列処理や汎用的なプログラミングをRubyで済ませられるととてもラクで助かるので、このvirtual_moduleに限らずこのような仕組みが普及するといいなと思っています。
virtual_moduleはPythonだけではなくJuliaも呼び出すことができます。Juliaを呼ぶときの例はこんな感じです。下記ではK-meansクラスタリングを呼び出しています(下記コードはClustering.jlの公式ドキュメントから移植したもの).
Rubyで大規模なループ処理を書くとループ数の増加に伴って実行時間が飛躍的に伸びてつらい経験をしたので、RubyからJuliaを動かせるように作っていたのがVirtualModuleの開発の最大の目的なので、このJuliaで動かす部分はもう少し便利にできないか考えています。(現在はmsgpackでデフォルトで変換可能な型しか相互変換できないため、Juliaの特徴の一つである多次元配列や第一級オブジェクトであるFunctionを扱いづらい状態)
ちなみに、scikit-learnも試しに動かしてみました。交差検定も一応動きます。
sklearnが動くところまでは嬉しいのですが、メソッド呼び出しの時に :_
シンボルを渡さないといけないところが見苦しいところです。Rubyではカッコなしでメソッド呼び出しをできますが、呼び出されたメソッド側でカッコが省略されて呼び出されたかどうかを判断する方法がない(少なくとも僕は知らない)ので、引数を取らないメソッド呼び出しの時にそれがメソッド呼び出しなのか関数であれば関数オブジェクト自体を呼び出してるのかという違いを明示的に記述する羽目になっているというのが、シンボルを渡している理由です。
もう少し詳細なVirtualModuleの説明をQiitaの方にも書いてみたので興味がある人はそちらもどうぞ。
Related Posts
about me
@remore is a software engineer, weekend contrabassist, and occasional public speaker. Read more