MacPortsで、mecabと、mecab-rubyのインストール
色々手間だったので記録
mecab のインストール
$ sudo port install mecab
入った
$ port installed | grep mecab mecab @0.994_0+ipadic (active) mecab-base @0.994_0 (active) mecab-ipadic @2.7.0-20070801_0 (active)
$ mecab -v
mecab of 0.994
mecab-ruby のインストール
mecab-rubyは、ruby にバインドする必要があるらしいので、
gem install だとできないし、rvmなので、macportsからも
インストールできない
参考 → rvmで入れた各rubyにmecab rubyバインディングをインストールする - 橋本詳解
上記を参考にインストール
$ wget http://mecab.googlecode.com/files/mecab-ruby-0.994.tar.gz .
解凍
$ tar -zxvf mecab-ruby-0.994.tar.gz $ cd mecab-ruby-0.994/ $ rvm list rvm rubies => ruby-1.8.7-p174 [ x86_64 ] ruby-1.9.2-p180 [ x86_64 ]
とりあえず、1.8.7 に入れる
READMEにやり方が書いてあったので、続きはそちらを参照
$ cat README MeCab ruby module $Id: README,v 1.1.1.1 2005/12/03 14:18:52 taku-ku Exp $; 1. Installation % ruby extconf.rb % make % su # make install 2. How to use? See 'test.rb' as a sample program.
$ ruby extconf.rb checking for main() in -lmecab... yes checking for main() in -lstdc++... yes checking for mecab.h... yes creating Makefile $ make g++ -I. -I. -I/Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib/ruby/1.8/i686-darwin10.7.0 -I. -DHAVE_MECAB_H -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -fno-common -g -O2 -fno-common -pipe -fno-common -I/opt/local/include -c MeCab_wrap.cpp cc -dynamic -bundle -undefined suppress -flat_namespace -o MeCab.bundle MeCab_wrap.o -L. -L/Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib -L. -lruby -lstdc++ -lmecab -ldl -lobjc $ sudo make install Password: /usr/bin/install -c -m 0755 MeCab.bundle /Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib/ruby/site_ruby/1.8/i686-darwin10.7.0
なんかあっさり終わった。
できたのかね?
サンプルコード動かしてみる
$KCODE = 'u' require 'MeCab' m = MeCab::Tagger.new("-Ochasen") print m.parse("今日もしないとね")
dyld: lazy symbol binding failed: Symbol not found: __ZN5MeCab12getLastErrorEv Referenced from: /Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib/ruby/site_ruby/1.8/i686-darwin10.7.0/MeCab.bundle Expected in: flat namespace dyld: Symbol not found: __ZN5MeCab12getLastErrorEv Referenced from: /Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib/ruby/site_ruby/1.8/i686-darwin10.7.0/MeCab.bundle Expected in: flat namespace
んー???
mecab-rubyをmacportsのライブラリにリンクするように修正
otool -L でリンクしているライブラリを調査できるらしい
otool -L MeCab.bundle MeCab.bundle: /Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib/libruby.dylib (compatibility version 1.8.0, current version 1.8.7) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0) /usr/lib/libmecab.1.dylib (compatibility version 2.0.0, current version 2.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
MacPortsで入れたなら、/opt/local/lib/libmecab.2.dylib とかになるはず…
元々あるライブラリにリンクされてる??
事例があった → mecab-rubyをMacにインストールするメモ | インサイドフラッギング
extconf.rb をいじるらしい
require 'mkmf' mecab_config = with_config('mecab-config', 'mecab-config') use_mecab_config = enable_config('mecab-config') `mecab-config --libs-only-l`.chomp.split.each { | lib | have_library(lib) } $CFLAGS += ' ' + `#{mecab_config} --cflags`.chomp have_header('mecab.h') && create_makefile('MeCab')
使用するライブラリのディレクトリを指定するために、$LDFLAGSを追加
require 'mkmf' mecab_config = with_config('mecab-config', 'mecab-config') use_mecab_config = enable_config('mecab-config') $LDFLAGS += ' -L' + `#{mecab_config} --libs-only-L`.chomp `mecab-config --libs-only-l`.chomp.split.each { | lib | have_library(lib) } $CFLAGS += ' ' + `#{mecab_config} --cflags`.chomp have_header('mecab.h') && create_makefile('MeCab')
もっかいインストール
$ make clean $ ruby extconf.rb checking for main() in -lmecab... yes checking for main() in -lstdc++... yes checking for mecab.h... yes creating Makefile $ make g++ -I. -I. -I/Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib/ruby/1.8/i686-darwin10.7.0 -I. -DHAVE_MECAB_H -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -fno-common -g -O2 -fno-common -pipe -fno-common -I/opt/local/include -c MeCab_wrap.cpp cc -dynamic -bundle -undefined suppress -flat_namespace -o MeCab.bundle MeCab_wrap.o -L. -L/Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib -L. -L/opt/local/lib -lruby -lstdc++ -lmecab -ldl -lobjc $ sudo make install Password: /usr/bin/install -c -m 0755 MeCab.bundle /Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib/ruby/site_ruby/1.8/i686-darwin10.7.0
もっかいサンプルコード実行したところ、激しく文字化け
ä» \¿\«\à\é ä» Ì¾»ì-°ìÈÌ Šæ—\もしだŠæ—\もしだŠæ—\もしだµ­¹æ-°ìÈÌ ªã ªã ªã ̾»ì-¸Çͭ̾»ì-ÁÈ¿\ „とね „とね „とね µ­¹æ-°ìÈÌ EOS
辞書ライブラリをutf-8のものを参照するように修正
辞書ライブラリが原因らしい
/opt/local/etc/mecabrc
; ; Configuration file of MeCab ; ; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $; ; dicdir = /opt/local/lib/mecab/dic/sysdic ; userdic = /home/foo/bar/user.dic ; output-format-type = wakati ; input-buffer-size = 8192 ; node-format = %m\n ; bos-format = %S\n ; eos-format = EOS\n
/opt/local/lib/mecab/dic/sysdic なる辞書を使っているらしいので見てみると…
$ ll /opt/local/lib/mecab/dic total 8 drwxr-xr-x 11 root admin 374 12 12 12:10 ipadic-eucjp/ lrwxr-xr-x 1 root admin 12 6 9 2012 sysdic@ -> ipadic-eucjp
なんかeucとか言ってる
そら化ける
本当は、mecabのvariantsにutf-8があるから、それを入れるのが正解だったっぽい
仕方ないので以下を参考に、utf-8の辞書を別途インストール
$ sudo port install mecab-ipadic-utf8
入った
port installed | grep mecab mecab @0.994_0+ipadic (active) mecab-base @0.994_0 (active) mecab-ipadic @2.7.0-20070801_0 (active) mecab-ipadic-utf8 @2.7.0-20070801_0 (active)
辞書が追加されたことを確認
ll /opt/local/lib/mecab/dic total 8 drwxr-xr-x 11 root admin 374 12 12 12:10 ipadic-eucjp/ drwxr-xr-x 11 root admin 374 12 12 13:38 ipadic-utf8/ lrwxr-xr-x 1 root admin 12 6 9 2012 sysdic@ -> ipadic-eucjp
シンボリックリンクを貼り直す
$ sudo rm sysdic $ sudo ln -s ipadic-utf8/ sysdic $ ll total 8 drwxr-xr-x 11 root admin 374 12 12 12:10 ipadic-eucjp/ drwxr-xr-x 11 root admin 374 12 12 13:38 ipadic-utf8/ lrwxr-xr-x 1 root admin 12 12 12 13:44 sysdic@ -> ipadic-utf8/
もう一度サンプルコード実行
今日 キョウ 今日 名詞-副詞可能 も モ も 助詞-係助詞 し シ する 動詞-自立 サ変・スル 未然形 ない ナイ ない 助動詞 特殊・ナイ 基本形 と ト と 助詞-接続助詞 ね ネ ね 助詞-終助詞 EOS
おおお、動いた!
形態素解析結果の取得方法
$KCODE = 'u' require 'MeCab' m = MeCab::Tagger.new("-Ochasen") node = m.parseToNode("今日もしないとね") while node do puts "#{node.surface} : #{node.feature}" node = node.next end
インクリメントに取得していくのには、parseToNode で取得して、nextで次を取得
surfaceで、分割された単語を返して、featureで情報を取得
あと、最初と最後にヘッダとフッタみたいのが付く
こんな感じ
: BOS/EOS,*,*,*,*,*,*,*,* 今日 : 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー も : 助詞,係助詞,*,*,*,*,も,モ,モ し : 動詞,自立,*,*,サ変・スル,未然形,する,シ,シ ない : 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ と : 助詞,接続助詞,*,*,*,*,と,ト,ト ね : 助詞,終助詞,*,*,*,*,ね,ネ,ネ : BOS/EOS,*,*,*,*,*,*,*,*
eachとかできないのに違和感があるので、eachできるようにしている人が居た