Tuesday, February 07, 2012

MacにMeCab + Rubyバインディングインストール

以下の環境にMeCab 0.992 と ruby-mecab 0.992をインストールする。

環境

  • MacOSX 10.6
  • ruby 1.9.2p312 (2011-08-11 revision 32926) [x86_64-darwin10.8.0]

参考

MeCabインストール

MeCab本体は公式サイトに乗っている通りにソースからインストール。ちなみに僕は~/localにインストールした。

$ tar zxfv mecab-0.992.tar.gz
$ cd mecab-0.992
# MeCabインストール
$ ./configure --prefix=/Users/your_home/local
$ make
$ make check
$ make install
辞書はUTF-8で作成するようにした。
# IPAの辞書インストール
$ tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
$ mecab-ipadic-2.7.0-20070801
$ ./configure --prefix=/Users/your_home/local --with-charset=utf8
$ make
$ make install
これでインストールで来たので、コマンドラインで確認。
$ mecab # これでREPLとして起動する
すもももももももものうち # <= ターミナルに打ち込む
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

Rubyバインディングインストール

ダウンロードページからRubyバインディングをダウンロードする。

$tar xzvf mecab-ruby-0.992.tar.gz
$ cd mecab-ruby-0.992
ここで、僕はMeCabを~/localにインストールしているので、以下のパッチをextconf.rbにあててライブラリの参照先を修正した。/usr/localにインストールしている場合は不要(たぶん)。 (参考)
--- extconf.rb.org 2012-02-08 14:10:41.000000000 +0900
+++ extconf.rb 2012-02-08 14:13:08.000000000 +0900
@@ -8,5 +8,6 @@
 }
 
 $CFLAGS += ' ' + `#{mecab_config} --cflags`.chomp
+$LDFLAGS = '-L/Users/your_home/local/lib'
 
 have_header('mecab.h') && create_makefile('MeCab')
で、コンパイルしてインストール。
$ ruby extconf.rb
$ make
$ make install
付属のtest.rbがそれらしく動けばOK。
$ ruby test.rb 
0.992
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
この 連体詞,*,*,*,*,*,この,コノ,コノ
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
# (略)

mecab-rubyのエンコーディング

mecab-rubyをRuby 1.9で使うと、結果の文字列のエンコーディングがascii-8bitになっている。

# coding: utf-8
require 'MeCab'

t = MeCab::Tagger.new
node = t.parseToNode('日本語のテスト')
surface = node.next.surface
p [:surface, surface.encoding, surface]
# => [:surface, #<Encoding:ASCII-8BIT>, "\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E"]
仕方がないのでString#force_encodingで強制的にUTF-8に変換する。 http://d.hatena.ne.jp/miyapong/20100706/1278419260
surface = node.next.surface.force_encoding("UTF-8")
p [:surface, surface.encoding, surface]
# => [:surface, #<Encoding:UTF-8>, "日本語"]

No comments: