Ubuntu 10.04 で形態素解析エンジンである MeCab を使用できるようにする。
Ruby と Java/Scala からも扱えるようにしておく。
Table of Contents
Open Table of Contents
MeCab のインストール
まずは、MeCab 本体のインストール。apt のパッケージでインストールする。
$ sudo apt-get install mecab mecab-ipadic-utf8 libmecab-dev
辞書ファイルは mecab-ipadic-utf8
で入れておいてあげれば、MeCab の辞書として、UTF-8 を使用してくれるようだ。手動で UTF-8 へ変換してあげる必要がなく楽。
念の為、辞書を確認してみる。
$ update-alternatives --config mecab-dictionary
There are 4 choices for the alternative mecab-dictionary (providing /var/lib/mecab/dic/debian).
Selection Path 優 Status
------------------------------------------------------------
* 0 /var/lib/mecab/dic/ipadic-utf8 80 auto mode
1 /var/lib/mecab/dic/ipadic 70 manual mode
2 /var/lib/mecab/dic/ipadic-utf8 80 manual mode
3 /var/lib/mecab/dic/juman 30 manual mode
4 /var/lib/mecab/dic/juman-utf8 40 manual mode
ここで一度試しておく。
$ mecab
太郎はこの本を二郎を見た女性に渡した。
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
この 連体詞,*,*,*,*,*,この,コノ,コノ
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二 名詞,数,*,*,*,*,二,ニ,ニ
郎 名詞,一般,*,*,*,*,郎,ロウ,ロー
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見 動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性 名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS
OK だ。
(終了は、Ctrl + d
で。)
Ruby で MeCab を利用する
Ruby 用のバインディングを入れておく。
apt でも libmecab-ruby
があるが、個別に make することにする。
以下のサイトから言語用の実装ライブラリを取得する。
$ wget http://sourceforge.net/projects/mecab/files/mecab-ruby/0.98/mecab-ruby-0.98.tar.gz
$ tar xzvf mecab-ruby-0.98.tar.gz
$ cd mecab-ruby-0.98
README に書いてあるとおりに。
$ 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/usr/local/lib/ruby/1.8/i686-linux -I. -DHAVE_MECAB_H -D_FILE_OFFSET_BITS=64 -fPIC -g -O2 -c MeCab_wrap.cpp
gcc -shared -o MeCab.so MeCab_wrap.o -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L. -rdynamic -Wl,-export-dynamic -lstdc++ -lmecab -lrt -ldl -lcrypt -lm -lc
$ sudo make install
/usr/bin/install -c -m 0755 MeCab.so /usr/local/lib/ruby/site_ruby/1.8/i686-linux
試してみる。
$ irb
>> require 'MeCab'
true
>> MeCab::VERSION
"0.98"
>> $KCODE = 'u'
"u"
>> mecab = MeCab::Tagger.new("-Ochasen")
#<MeCab::Tagger:0xa2bc5a0>
>> sentence = "太郎はこの本を二郎を見た女性に渡した。"
"太郎はこの本を二郎を見た女性に渡した\343\200\202"
>> mecab.parse(sentence)
"太郎\tタロウ\t太郎\t名詞-固有名詞-人名-名\t\t\nは\tハ\tは\t助詞-係助詞\t\t\nこの\tコノ\tこの\t連体詞\t\t\n本\tホン\t本\t名詞-一般\t\t\nを\tヲ\tを\t助詞-格助詞-一般\t\t\n二\tニ\t二\t名詞-数\t\t\n郎\tロウ\t郎\t名詞-一般\t\t\nを\tヲ\tを\t助詞-格助詞-一般\t\t\n見\tミ\t見る\t動詞-自立\t一段\t連用形\nた\tタ\tた\t助動詞\t特殊・タ\t基本形\n女性\tジョセイ\t女性\t名詞-一般\t\t\nに\tニ\tに\t助詞-格助詞-一般\t\t\n渡し\tワタシ\t渡す\t動詞-自立\t五段・サ行\t連用形\nた\tタ\tた\t助動詞\t特殊・タ\t基本形\n。\t。\t。\t記号-句点\t\t\nEOS\n"
>> node = mecab.parseToNode(sentence)
#<MeCab::Node:0xa27ac40>
>> while node do
?> puts [node.surface, node.feature, node.cost].join("\t")
>> node = node.next
>> end
BOS/EOS,*,*,*,*,*,*,*,* 0
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー 8614
は 助詞,係助詞,*,*,*,*,は,ハ,ワ 9699
この 連体詞,*,*,*,*,*,この,コノ,コノ 9755
本 名詞,一般,*,*,*,*,本,ホン,ホン 14548
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 13738
二 名詞,数,*,*,*,*,二,ニ,ニ 16665
郎 名詞,一般,*,*,*,*,郎,ロウ,ロー 21808
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 20998
見 動詞,自立,*,*,一段,連用形,見る,ミ,ミ 25194
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 22795
女性 名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ 25091
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ 24938
渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ 28035
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 27158
。 記号,句点,*,*,*,*,。,。,。 23724
BOS/EOS,*,*,*,*,*,*,*,* 22188
nil
>> dic_info = mecab.dictionary_info
#<MeCab::DictionaryInfo:0x9333e44>
>> dic_info.charset
"UTF-8"
>> dic_info.filename
"/var/lib/mecab/dic/debian/sys.dic"
OK だ。
Java/Scala で MeCab を利用する
Java のバインディングも
にあるものを使用することができるのだが、jni でのバインディングになる。
Pure Java の方がうれしいのだが・・・と探していたら、MeCab の Java での実装である Sen/GoSen があるようだ。
- Sen - 日本語形態素解析システム
- GoSen - Itadaki
GoSen is a comprehensive rewrite and upgrade of Sen, a pure Java LGPL morphological analysis library for Japanese which in turn was based on MeCab.
Java/Scala は GoSen を使う
Java/Scala に関しては、こちらを使うことにし、GoSen の方で試してみる。
GoSen のレポジトリからソースを取ってくる。
ここでは、git-svn
を使って取ってくることにしているので、インストールしていない場合には、Ubuntu の場合は事前に、
$ sudo apt-get install git-svn
しておく。
$ git svn clone https://itadaki.svn.sourceforge.net/svnroot/itadaki/GoSen GoSen
ant を使って build していく。
$ cd GoSen/
$ ant
Buildfile: build.xml
prepare-directories:
compile:
[javac] Compiling 48 source files to /home/taka/Tools/GoSen/bin
jar:
[jar] Building jar: /home/taka/Tools/GoSen/gosen-1.0beta.jar
BUILD SUCCESSFUL
Total time: 3 seconds
辞書を取得する。
$ cd testdata/dictionary/
$ ant
Buildfile: build.xml
prepare-proxy:
check-build-status:
download:
[get] Getting: http://chasen.aist-nara.ac.jp/stable/ipadic/ipadic-2.6.0.tar.gz
[get] To: /home/taka/Tools/GoSen/testdata/dictionary/ipadic-2.6.0.tar.gz
unpack:
[gunzip] Expanding /home/taka/Tools/GoSen/testdata/dictionary/ipadic-2.6.0.tar.gz to /home/taka/Tools/GoSen/testdata/dictionary/ipadic-2.6.0.tar
[untar] Expanding: /home/taka/Tools/GoSen/testdata/dictionary/ipadic-2.6.0.tar into /home/taka/Tools/GoSen/testdata/dictionary
[delete] Deleting: /home/taka/Tools/GoSen/testdata/dictionary/ipadic-2.6.0.tar
preprocess:
compile:
BUILD SUCCESSFUL
Total time: 59 seconds
同封されている Java のサンプルで試してみる。一旦、プロジェクトのルートに移り、
$ cd ../../
$ java -cp bin examples.StringTaggerDemo testdata/dictionary/dictionary.xml
Please input Japanese sentence:
太郎はこの本を二郎を見た女性に渡した。
太郎 (太郎) 名詞-固有名詞-人名-名(0,2,2) タロウ タロー
は (は) 助詞-係助詞(2,3,1) ハ ワ
この (この) 連体詞(3,5,2) コノ コノ
本 (本) 名詞-一般(5,6,1) ホン ホン
を (を) 助詞-格助詞-一般(6,7,1) ヲ ヲ
二郎 (二郎) 名詞-固有名詞-一般(7,9,2) ニロウ ニロー
を (を) 助詞-格助詞-一般(9,10,1) ヲ ヲ
見 (見る) 動詞-自立(10,11,1) ミ ミ
た (た) 助動詞(11,12,1) タ タ
女性 (女性) 名詞-一般(12,14,2) ジョセイ ジョセイ
に (に) 助詞-格助詞-一般(14,15,1) ニ ニ
渡し (渡す) 動詞-自立(15,17,2) ワタシ ワタシ
た (た) 助動詞(17,18,1) タ タ
。 (。) 記号-句点(18,19,1) 。 。
OK だ。
では、Scala でも試す。
$ scala -cp gosen-1.0beta.jar
Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.
scala> import net.java.sen.{StringTagger, SenFactory}
import net.java.sen.{StringTagger, SenFactory}
scala> import net.java.sen.dictionary.Token
import net.java.sen.dictionary.Token
scala> val tagger = SenFactory.getStringTagger("testdata/dictionary/dictionary.xml")
tagger: net.java.sen.StringTagger = net.java.sen.StringTagger@9bfee2
scala> val sentence = "太郎はこの本を二郎を見た女性に渡した。"
sentence: java.lang.String = 太郎はこの本を二郎を見た女性に渡した。
scala> val tokens = tagger.analyze(sentence)
tokens: java.util.List[net.java.sen.dictionary.Token] = [太郎, は, この, 本, を, 二郎, を, 見, た, 女性, に, 渡し, た, 。]
scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._
scala> for (token <- tokens)
| println(List(token.getSurface, token.getMorpheme.getPartOfSpeech, token.getCost.toString).mkString("\t"))
太郎 名詞-固有名詞-人名-名 3901
は 助詞-係助詞 5324
この 連体詞 7016
本 名詞-一般 9440
を 助詞-格助詞-一般 10218
二郎 名詞-固有名詞-一般 15541
を 助詞-格助詞-一般 16709
見 動詞-自立 18303
た 助動詞 18645
女性 名詞-一般 21066
に 助詞-格助詞-一般 21917
渡し 動詞-自立 24515
た 助動詞 24830
。 記号-句点 25287
OK だ。
ちなみに、jni 版である、Browse MeCab Files on SourceForge.net のものを使う場合も試しておく。
$ wget http://sourceforge.net/projects/mecab/files/mecab-win32/0.98/mecab-java-0.98.tar.gz
$ tar xzvf mecab-java-0.98.tar.gz
$ cd mecab-java-0.98
環境によって、make file の編集が必要となる。
Ubuntu 10.04 のデフォルトの Java は Open JDK になっており、自身は、Sun Java の方を利用している。
ここでは、Sun Java の環境を入れていることを前提に記述する。
$ java -version
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Server VM (build 17.1-b03, mixed mode)
$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path 優 Status
------------------------------------------------------------
0 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 auto mode
1 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 manual mode
* 2 /usr/lib/jvm/java-6-sun/jre/bin/java 63 manual mode
Makefile
の INCLUDE
の部分のみ編集を行う。
$ diff -u Makefile{.org,}
--- Makefile.org 2009-09-27 17:40:18.000000000 +0900
+++ Makefile 2010-11-13 17:42:53.969887753 +0900
@@ -3,7 +3,7 @@
JAVA=java
JAR=jar
CXX=c++
-INCLUDE=/usr/local/jdk/include
+INCLUDE=/usr/lib/jvm/java-6-sun/include
PACKAGE=org/chasen/mecab
make する
$ make
c++ -O3 -c -fpic MeCab_wrap.cxx `mecab-config --cflags` -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux
c++ -shared MeCab_wrap.o -o libMeCab.so `mecab-config --libs`
javac org/chasen/mecab/*.java
javac test.java
jar cfv MeCab.jar org/chasen/mecab/*.class
マニフェストが追加されました。
org/chasen/mecab/DictionaryInfo.class を追加中です。(入 = 1809) (出 = 822)(54% 収縮されました)
org/chasen/mecab/MeCab.class を追加中です。(入 = 240) (出 = 186)(22% 収縮されました)
org/chasen/mecab/MeCabConstants.class を追加中です。(入 = 952) (出 = 495)(48% 収縮されました)
org/chasen/mecab/MeCabJNI.class を追加中です。(入 = 3865) (出 = 1209)(68% 収縮されました)
org/chasen/mecab/Node.class を追加中です。(入 = 3880) (出 = 1474)(62% 収縮されました)
org/chasen/mecab/Path.class を追加中です。(入 = 1685) (出 = 838)(50% 収縮されました)
org/chasen/mecab/SWIGTYPE_p_p_char.class を追加中です。(入 = 465) (出 = 308)(33% 収縮されました)
org/chasen/mecab/Tagger.class を追加中です。(入 = 4446) (出 = 1601)(63% 収縮されました)
org/chasen/mecab/Token.class を追加中です。(入 = 1331) (出 = 704)(47% 収縮されました)
Java からの MeCab へのバインディングである
libMeCab.so
MeCab.jar
が作成されている。
まずは、test 用のソースもコンパイルされているので、確認してみる。
$ env LD_LIBRARY_PATH=. java test
0.98
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
二郎 名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
この 連体詞,*,*,*,*,*,この,コノ,コノ
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS
BOS/EOS,*,*,*,*,*,*,*,*
EOS
OK だ・・・いや、Node がうまく扱えていない。何故だ?
GoSen を使うことにしたので、追求なしで、とりあえずここまで。。