Ruby
mecab
natto

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

More than 5 years have passed since last update.


背景

macでmecab-rubyをビルドせずにインストールするでは、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,*,*,*,*,*,*,*,*