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を使う
Gemfile
にgem '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,*,*,*,*,*,*,*,*