形態素解析エンジン MeCab を Rub/Java/Scala で利用する(on Ubuntu)

Written by @dr_taka_n at 2010/11/14 19:40 [, , , ]

Ubuntu 10.04 で形態素解析エンジンである MeCab を使用できるようにする。

Ruby と Java/Scala からも扱えるようにしておく。

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")
#
>> 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)
#
>> 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
#
>> dic_info.charset
"UTF-8"
>> dic_info.filename
"/var/lib/mecab/dic/debian/sys.dic"

OK だ。

### Java/Scala で MeCab を利用する###

Java のバインディングも

- [Browse MeCab Files on SourceForge.net](http://sourceforge.net/projects/mecab/files/)

にあるものを使用することができるのだが、jni でのバインディングになる。

Pure Java の方がうれしいのだが・・・と探していたら、MeCab の Java での実装である Sen/GoSen があるようだ。

- [Sen - 日本語形態素解析システム](http://www.mlab.im.dendai.ac.jp/~yamada/ir/MorphologicalAnalyzer/Sen.html)
- [GoSen - Itadaki](http://web.archive.org/web/20071224025014/http://itadaki.org/wiki/index.php/GoSen)
    > 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](http://sourceforge.net/projects/mecab/files/) のものを使う場合も試しておく。
$ 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 を使うことにしたので、追求なしで、とりあえずここまで。。 ### 参考 ### - [MeCab: Yet Another Japanese Dependency Structure Analyzer](http://mecab.sourceforge.net/bindings.html) - [UbuntuにMecabをインストールする :: 開発ブログ](http://www.oasob.com/blog/detail/21/) - [Java、Sen/GoSenを試す。(Javaで形態素解析) - hata'daizu](http://stbr.no-ip.org/daizu/2009/10/javasenjava.html) - [Javaで実装された形態素解析器 GoSen - mtbrの日記](http://d.hatena.ne.jp/mtbr/20090319/nlpmimaJavaGoSen) - [Sen - 日本語形態素解析システム](http://www.mlab.im.dendai.ac.jp/~yamada/ir/MorphologicalAnalyzer/Sen.html) - [GoSen - Itadaki](http://web.archive.org/web/20071224025014/http://itadaki.org/wiki/index.php/GoSen)
blog comments powered by Disqus