Skip to content

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

Posted on:2010年11月14日 at 19:40

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 があるようだ。

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

MakefileINCLUDE の部分のみ編集を行う。

$ 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 へのバインディングである

が作成されている。

まずは、test 用のソースもコンパイルされているので、確認してみる。

$ env LD_LIBRARY_PATH=. java test
0.98
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
二郎    名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
この    連体詞,*,*,*,*,*,この,コノ,コノ
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

        BOS/EOS,*,*,*,*,*,*,*,*
EOS

OK だ・・・いや、Node がうまく扱えていない。何故だ?

GoSen を使うことにしたので、追求なしで、とりあえずここまで。。

参考