すもももももももものうち

すもももももももものうち」という文章を分解すると
「すもも」「も」「もも」「も」「もも」「の」「うち」となります。

人間が簡単に理解できることもコンピュータにやらせると難しいので
形態素解析という技術が発達しました。

今回は形態素解析ツールであるMeCab(和布蕪)を試してみます。

%which mecab
/usr/local/bin/mecab
%mecab -v
mecab of 0.97

どうやらインストールされているようなのでそのまま使うことにします。

%mecab -D
filename: /usr/local/lib/mecab/dic/ipadic/sys.dic
version: 102
charset: euc-jp
type: 0
size: 392126
left size: 1316
right size: 1316

あららcharsetはeuc-jpですか。自分が作るWebアプリはUTF8で
統一したいので、辞書はこちらで用意するようにします。

%cd ~/work/install
%wget http://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz/downloadtar
%zxvf mecab-ipadic-2.7.0-20070801.tar.gz
%cd mecab-ipadic-2.7.0-20070801
%./configure --with-charset=utf8 --with-dicdir=$HOME/local/lib/mecab/dic/ipadic-utf8
%make
%make install

コマンドラインから試してみます。

%mecab -d ~/local/lib/mecab/dic/ipadic-utf8
すもももももももものうち
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

あっさり動きました。

ではRubyから呼び出すためのruby-mecabが入っているかどうか
見てみます。

%find /usr/local/lib/ruby/ |grep -i mecab
%

無いようなのでインストールします。

%cd ~/work/install
%wget http://sourceforge.net/projects/mecab/files/mecab-ruby/0.98/mecab-ruby-0.98.tar.gz/download
%tar zxvf mecab-ruby-0.98.tar.gz
%cd mecab-ruby-0.98
%ruby extconf.rb --with-opt-lib=$HOME/local/lib
%make

さて、テストしてみます。

%ruby test.rb
0.98
/libexec/ld-elf.so.1: ./MeCab.so: Undefined symbol "_ZN5MeCab12createTaggerEPKc"

あらら、失敗。

googleで検索してみたところ情報が見つかりました。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/38737

extconf.rb に

$LIBS = '-lthr ' + $LIBS
を追加

%ruby extconf.rb --with-opt-lib=$HOME/local/lib
%make
%ruby test.rb

こんどは動いたようです。
インストールします。

%make install

install: /usr/local/lib/ruby/site_ruby/1.8/i386-freebsd7/MeCab.so: Permission denied

Error code 71

インストールに失敗しますので手動でコピーします。

%mkdir ~/local/lib/ruby
%cp MeCab.so ~/local/lib/ruby/

自前のRubyスクリプトを書きます。

%cat mecab_test.rb
#!/usr/bin/ruby -Ku

$: << "/home/username/local/lib/ruby"

require 'MeCab'

m = MeCab::Tagger.new("-d /home/username/local/lib/mecab/dic/ipadic-utf8")
print m.parse("すもももももももものうち")

% ruby mecab_test.rb
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

こでれRubyスクリプト形態素解析が出来るようになりました。
テキストを形態素解析して名詞を伏字化して...みたいなことを考えています。