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バインディングをインストールする - 橋本詳解


上記を参考にインストール


まずは、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-rubymacportsのライブラリにリンクするように修正


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できるようにしている人が居た