形態素解析器Senのセットアップ

さてはて、Javaで楽しく形態素解析の時間がやってきました。

Sen は、Java で実装された形態素解析器で、工藤拓さんによりオープンソース(LGPL)で開発されている形態素解析MecabJavaへポーティングしたライブラリです。
Sen - FrontPage

ではでは、インストールして使ってみる。
Wikiにインストールガイドがあるけど、Eclipseでやったほうが楽だと思うので、Eclipse版のセットアップ方法を書いてみる。

前提条件

  • JDKがインストールされていること
  • ActivePerlがインストールされていること
  • Eclipseがインストールされていること

ダウンロード

まずはここからSenをダウンロードしてくる。
今回はsen-1.2.2.1.zipを使う。

インポート

sen-1.2.2.1.zipを解凍して、Eclipseのworkspaceに置く。ディレクトリ名はsenにリネームする。
メニューのファイルからインポートを選択して、「既存プロジェクトをワークスペースへ」を選択する。
さっき置いたsenディレクトリを指定して、インポート完了。

辞書作成

build.xmlにあるPerlのパスを変更する。


 ↓

sen
 └dic
  └build.xml

dic配下のbuild.xmlを右クリックして、Antビルドを選択する。
# Antビルドが2つあると思うけど、どっちでもいい。
# ウィザードが出てきたら、デフォルトのまま完了でOK。
ちょっと長いけど、コンソールにこんな感じのメッセージが出てくれば辞書の出来上がり。

Buildfile: E:\workspace\sen\dic\build.xml
prepare-proxy:
prepare-archive:
prepare-dics0:
prepare-dics:
download:
      [get] Getting: http://chasen.aist-nara.ac.jp/stable/ipadic/ipadic-2.6.0.tar.gz
      [get] To: E:\workspace\sen\dic\ipadic-2.6.0.tar.gz
melt:
   [gunzip] Expanding E:\workspace\sen\dic\ipadic-2.6.0.tar.gz to E:\workspace\sen\dic\ipadic-2.6.0.tar
    [untar] Expanding: E:\workspace\sen\dic\ipadic-2.6.0.tar into E:\workspace\sen\dic
   [delete] Deleting: E:\workspace\sen\dic\ipadic-2.6.0.tar
prepare:
dics0:
     [exec] ipadic-2.6.0/Adj.dic ...
     [exec] ipadic-2.6.0/Adnominal.dic ...
     [exec] ipadic-2.6.0/Adverb.dic ...
     [exec] ipadic-2.6.0/Auxil.dic ...
     [exec] ipadic-2.6.0/Conjunction.dic ...
     [exec] ipadic-2.6.0/Filler.dic ...
     [exec] ipadic-2.6.0/Interjection.dic ...
     [exec] ipadic-2.6.0/Noun.adjv.dic ...
     [exec] ipadic-2.6.0/Noun.adverbal.dic ...
     [exec] ipadic-2.6.0/Noun.demonst.dic ...
     [exec] ipadic-2.6.0/Noun.dic ...
     [exec] ipadic-2.6.0/Noun.nai.dic ...
     [exec] ipadic-2.6.0/Noun.name.dic ...
     [exec] ipadic-2.6.0/Noun.number.dic ...
     [exec] ipadic-2.6.0/Noun.org.dic ...
     [exec] ipadic-2.6.0/Noun.others.dic ...
     [exec] ipadic-2.6.0/Noun.place.dic ...
     [exec] ipadic-2.6.0/Noun.proper.dic ...
     [exec] ipadic-2.6.0/Noun.verbal.dic ...
     [exec] ipadic-2.6.0/Others.dic ...
     [exec] ipadic-2.6.0/Postp-col.dic ...
     [exec] ipadic-2.6.0/Postp.dic ...
     [exec] ipadic-2.6.0/Prefix.dic ...
     [exec] ipadic-2.6.0/Suffix.dic ...
     [exec] ipadic-2.6.0/Symbol.dic ...
     [exec] ipadic-2.6.0/Verb.dic ...
create:
     [java] [INFO] MkSenDic - (1/7): reading connection matrix ...
     [java] [INFO] MkSenDic - connection file = connect.csv
     [java] [INFO] MkSenDic - charset = EUC_JP
     [java] [INFO] MkSenDic - (2/7): building type dictionary ...
     [java] [INFO] MkSenDic - (3/7): writing conection matrix (5 x 1281 x 701 = 4489905) ...
     [java] [INFO] MkSenDic - (4/7): reading morpheme information ...
     [java] [INFO] MkSenDic - load dic: dic.csv
     [java] [INFO] MkSenDic - 50000...
     [java] [INFO] MkSenDic - 100000...
     [java] [INFO] MkSenDic - 150000...
     [java] [INFO] MkSenDic - 200000...
     [java] [INFO] MkSenDic - 250000...
     [java] [INFO] MkSenDic - 300000...
     [java] [INFO] MkSenDic - 350000...
     [java] [INFO] MkSenDic - (5/7): sorting lex...
     [java] [INFO] MkSenDic - (6/7): writing token...
     [java] [INFO] MkSenDic - key size = 378227
     [java] [INFO] MkSenDic - (7/7): building Double-Array (size = 325254) ...
     [java] [INFO] DoubleArrayTrie - save time = 0.953[s]
     [java] [INFO] MkSenDic - total time = 155[ms]
BUILD SUCCESSFUL
Total time: 3 minutes 21 seconds

無理やりJavaプロジェクト化

sen配下にあるproject.xmlは以下のようになっている。

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>sen</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
	</buildSpec>
	<natures>
	</natures>
</projectDescription>

これではJavaプロジェクトにならない。無理やりJavaプロジェクトにしてしまう。

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>sen</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.jdt.core.javanature</nature>
	</natures>
</projectDescription>

すると、わけのわからないプロジェクトが出来上がる。

ソースフォルダ修正

senを右クリックして、プロパティを選択する。Javaのビルド・パスを選択して、ソースタブを選択する。
なんとsenがソースフォルダに指定されている。これではだめなので修正する。
まずはsenを除去する。
次にフォルダーの追加ボタンを押す。
sen/src配下のjavaとtestのチェックボックスを選択する。
デフォルト出力フォルダーの参照ボタンを押して、sen/binを選択する。
そしたらOKを押す。これでできたぁと思いきや、エラーがいっぱいでてくる。残念。

ビルド・パス修正

sen/lib/commons-logging.jarを右クリックして、ビルド・パス→ビルド・パスに追加を選択する。
sen/lib/sen.jarを右クリックして、ビルド・パス→ビルド・パスに追加を選択する。
これでプロジェクトの設定は完了。
Eclipseを使ったほうが面倒?いやいや、後々生産性が上がって、便利さに感動するのだと自分に言い聞かせる。

サンプルプログラム実行

これでやっとセットアップ完了。
それではサンプルプログラムを実行してみる。
デフォルト・パッケージにあるStringTaggerDemo.javaを実行してみる。
StringTaggerDemo.javaを右クリックして、実行→Javaアプリケーション。

done.
Please input Japanese sentence:
java.lang.IllegalArgumentException: E:\workspace\sen\null\conf\sen.xml (指定されたパスが見つかりません。)
at net.java.sen.StringTagger.readConfig(StringTagger.java:304)
at net.java.sen.StringTagger.init(StringTagger.java:145)
at net.java.sen.StringTagger.(StringTagger.java:95)
at net.java.sen.StringTagger.getInstance(StringTagger.java:133)
at net.java.sen.StringTagger.getInstance(StringTagger.java:100)
at StringTaggerDemo.main(StringTaggerDemo.java:33)

はい。エラーですね。

Taggerを取得する際には、senをインストールしたディレクトリをsen.homeプロパティに設定して下さい。JVM起動時に次のオプションをつけるか

> java -Dsen.home=/usr/local/sen

コード内で次のように設定して下さい。

System.setProperty("sen.home", "/usr/local/sen");

Sen - FrontPage

ほーい。
StringTaggerDemo.javaを開く。とりあえずCtl+Shift+fでコード整形する。
29行目にsetPropertyを追加する。

	public static void main(String args[]) {
		System.setProperty("sen.home", "./");
		try {

相対パスで指定したけど

		System.setProperty("sen.home", "E:/workspace/sen/");

でも

		System.setProperty("sen.home", "E:\\workspace\\sen\\");

でもOK。僕のワークスペースはE:\workspace。プロジェクト名はsen。
これで本当に準備完了。
StringTaggerDemo.javaを右クリックして、実行→Javaアプリケーション。

done.
Please input Japanese sentence:
2007/12/11 0:15:48 net.java.sen.Dictionary
情報: token file = E:\workspace\sen\dic/token.sen
2007/12/11 0:15:48 net.java.sen.Dictionary
情報: time to load posInfo file = 16[ms]
2007/12/11 0:15:48 net.java.sen.Dictionary
情報: double array trie dictionary = E:\workspace\sen\dic/da.sen
2007/12/11 0:15:48 net.java.sen.util.DoubleArrayTrie load
情報: loading double array trie dict = E:\workspace\sen\dic/da.sen
2007/12/11 0:15:50 net.java.sen.util.DoubleArrayTrie load
情報: loaded time = 1.25[ms]
2007/12/11 0:15:50 net.java.sen.Dictionary
情報: pos info file = E:\workspace\sen\dic/posInfo.sen
2007/12/11 0:15:50 net.java.sen.Dictionary
情報: time to load pos info file = 0[ms]
2007/12/11 0:15:50 net.java.sen.Tokenizer loadConnectCost
情報: connection file = E:\workspace\sen\dic\matrix.sen
2007/12/11 0:15:50 net.java.sen.Tokenizer loadConnectCost
情報: time to load connect cost file = 328[ms]

こんなのがでてくるので、コンソールに日本語を打ち込んでみる。
# 半角/全角で日本語入力ができなければ、Alt+半角/全角で日本語入力できるはず。
すもももももももものうち」を入力してみる。

すもももももももものうち
すもも (すもも) 名詞-一般(0,3,3) スモモ スモモ
も (も) 助詞-係助詞(3,4,1) モ モ
もも (もも) 名詞-一般(4,6,2) モモ モモ
も (も) 助詞-係助詞(6,7,1) モ モ
もも (もも) 名詞-一般(7,9,2) モモ モモ
の (の) 助詞-連体化(9,10,1) ノ ノ
うち (うち) 名詞-非自立-副詞可能(10,12,2) ウチ ウチ

できたぁ。大変といえば大変。Eclipseに慣れてれば、けっこう簡単。


けっこうちゃんと書いてみたのは、以前Senを使ったけど、実行結果しか書いていなくて、最近セットアップにちょっと手間取ったから。
ちゃんと書くのは大変だ。
形態素解析だけできても、実はあまり楽しくない。
「も」が「助詞-係助詞」だといわれても、よくわからない。
というわけで、今度はマルコフ連鎖と組み合わせて楽しくしてみよー。
# いつか書くはず・・・。