rubyのmecabバインディングnattoを使う

背景

rubyから形態素解析ライブラリmecabを利用する"では、mecabの基本的な言語バインディングを用いました。
このバインディングはSWIGを用いてMeCabと密に結合しているため、mecab gemのバージョンとMeCabのバージョンを合わせる必要がありました。
今回はmecab gem以外の選択肢を使ってみます。

納豆

今回はrubyからmecabを利用するためにnattoというgemを使用します。

nattoは、FFI(foreign function interface:外部関数インタフェース)を使用して、RubyとMeCabを繋ぐgemです。
nattoはC言語拡張ではないためコンパイルは必要ありません。
そのためCRuby(MRI / YARV)でもJRuby(JVM)でも実行できる利点があります。
jruby 1.7.4 (1.9.3p392) 2013-05-16 2390d3b on Java HotSpot(TM) 64-Bit Server VM 1.7.0_25-b15 [darwin-x86_64]で動作確認)

mecabを最新に

mecab gemをbundlerから管理するために、mecab本体のバージョンを0.98にしていました。
nattoを利用するに当たって最新のバージョンに戻します。

既に古いバージョンがインストールされている場合、いったんアンインストールします。

brew uninstall mecab mecab-ipadic

次に、最新のバージョンを確かめます。

brew versions mecab

最新バージョンを確認したら、/usr/localに移動してformulaをチェックアウトします。
このとき最新バージョンは0.996でした。

git checkout ee21df2 /usr/local/Library/Formula/mecab.rb

改めてmecabをインストールします。

brew install mecab mecab-ipadic

mecab -vしてバージョンが0.996になっていれば大丈夫。

natto gemを使う

Gemfilegem 'natto'を追加してbundle installでインストールします。
使い方はNatto::MeCab.newして、parseメソッドに渡すだけです。

require 'natto'

text = <<"EOS"
悪質な業者によるトラブルが全国で急増している。
EOS

nm = Natto::MeCab.new
nm.parse(text) do |n|
  puts "#{n.surface}\t#{n.feature}"
end
悪質   名詞,形容動詞語幹,*,*,*,*,悪質,アクシツ,アクシツ
な    助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
業者   名詞,一般,*,*,*,*,業者,ギョウシャ,ギョーシャ
による  助詞,格助詞,連語,*,*,*,による,ニヨル,ニヨル
トラブル 名詞,一般,*,*,*,*,トラブル,トラブル,トラブル
が    助詞,格助詞,一般,*,*,*,が,ガ,ガ
全国   名詞,一般,*,*,*,*,全国,ゼンコク,ゼンコク
で    助詞,格助詞,一般,*,*,*,で,デ,デ
急増   名詞,サ変接続,*,*,*,*,急増,キュウゾウ,キューゾー
し    動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て    助詞,接続助詞,*,*,*,*,て,テ,テ
いる   動詞,非自立,*,*,一段,基本形,いる,イル,イル
。    記号,句点,*,*,*,*,。,。,。
     BOS/EOS,*,*,*,*,*,*,*,*