/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

mecabをRubyから使おうとしたらエラーが・・・・

前回、cloud9環境にmecabのインストールをしたと思います。今回はそれをRubyから使ってみようと思います。

mecabのインストールはこちらの記事を参考に。

yatta47.hateblo.jp

Rubyから使う場合にはnattoというのを使います。

nattoのインストール

$ sudo gem install natto
Fetching: ffi-1.9.10.gem (100%)
Building native extensions.  This could take a while...
Successfully installed ffi-1.9.10
Fetching: natto-1.0.1.gem (100%)
Successfully installed natto-1.0.1
2 gems installed

特に問題なくインストール環境。

サンプルコードで実行してみたが・・・・

以下はサンプルコード。

require 'natto'

text = 'すもももももももものうち'
nm = Natto::MeCab.new
nm.parse(text) do |n|
  puts "#{n.surface}\t#{n.feature}"
end

これを実行してみたら、エラーがorz

$ ruby mecab.rb 
/usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/binding.rb:58:in `rescue in find_library': Please set MECAB_PATH to the full path to libmecab.so (LoadError)
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/binding.rb:48:in `find_library'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/binding.rb:64:in `<module:Binding>'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/binding.rb:6:in `<module:Natto>'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/binding.rb:2:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/natto.rb:2:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto.rb:2:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:128:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:128:in `rescue in require'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:39:in `require'
        from mecab.rb:1:in `<main>'

MECAB_PATHというのが設定してなくて、mecabのライブラリが読み込めなくて失敗している様子。Githubの公式を読んでみるとPATHを設定しろとか書いてあったね。

github.com

ってことで改めてMECAB_PATHを設定してやってみたところまたエラーが。

$ export MECAB_PATH=/usr/local/lib/libmecab.so
$ 
$ ruby mecab.rb 
/usr/local/rvm/gems/ruby-2.2.1/gems/ffi-1.9.10/lib/ffi/library.rb:133:in `block in ffi_lib': Could not open library '/usr/local/lib/libmecab.so': /usr/local/lib/libmecab.so: cannot open shared object file: No such file or directory (LoadError)
        from /usr/local/rvm/gems/ruby-2.2.1/gems/ffi-1.9.10/lib/ffi/library.rb:100:in `map'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/ffi-1.9.10/lib/ffi/library.rb:100:in `ffi_lib'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/binding.rb:64:in `<module:Binding>'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/binding.rb:6:in `<module:Natto>'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/binding.rb:2:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto/natto.rb:2:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/rvm/gems/ruby-2.2.1@global/gems/natto-1.0.1/lib/natto.rb:2:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:128:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:128:in `rescue in require'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:39:in `require'
        from mecab.rb:1:in `<main>'

今度はファイルがないというメッセージ。cloud9環境だからデフォルトで設定される場所とは違う場所に設定されてるのかな?
libmecab.soというのが見つからないとどうにも処理できない様子だから、libmecab.soがどこにあるかfindで直接探してみました。

$ find /usr/ -name "*mecab*"
/usr/bin/mecab
/usr/share/man/man1/mecab.1.gz
/usr/share/mecab
/usr/share/doc/libmecab2
/usr/share/doc/mecab-ipadic-utf8
/usr/share/doc/mecab-ipadic
/usr/share/doc/mecab-utils
/usr/share/doc/mecab
/usr/share/doc/mecab/mecab.css
/usr/share/doc/mecab/mecab.html
/usr/share/doc/mecab/libmecab.html
/usr/share/doc/mecab-jumandic
/usr/lib/mecab
/usr/lib/mecab/mecab-cost-train
/usr/lib/mecab/mecab-dict-index
/usr/lib/mecab/mecab-system-eval
/usr/lib/mecab/mecab-dict-gen
/usr/lib/mecab/mecab-test-gen
/usr/lib/libmecab.so.2.0.0
/usr/lib/libmecab.so.2

ちょっとファイルの名前が違うけど、とりあえず/usr/lib配下にライブラリがあったので、MECAB_PATHを設定しなおして再度実行したら動きました。

$ export MECAB_PATH=/usr/lib/libmecab.so.2      
$
$ ruby mecab.rb 
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
        BOS/EOS,*,*,*,*,*,*,*,*
$ 

ようやくこれでRubyからmecabが使うことが出来ました。

まとめ

cloud9環境でnattoを使うためには以下の設定が必要。

$ gem install natto
$ export MECAB_PATH=/usr/lib/libmecab.so.2

これで環境も整ってきたので、これから形態素解析エンジンを使って色々なことをやってみようと思います。