形態素解析器Senのセットアップ
さてはて、Javaで楽しく形態素解析の時間がやってきました。
Sen は、Java で実装された形態素解析器で、工藤拓さんによりオープンソース(LGPL)で開発されている形態素解析器MecabをJavaへポーティングしたライブラリです。
Sen - FrontPage
ではでは、インストールして使ってみる。
Wikiにインストールガイドがあるけど、Eclipseでやったほうが楽だと思うので、Eclipse版のセットアップ方法を書いてみる。
ダウンロード
まずはここからSenをダウンロードしてくる。
今回はsen-1.2.2.1.zipを使う。
インポート
sen-1.2.2.1.zipを解凍して、Eclipseのworkspaceに置く。ディレクトリ名はsenにリネームする。
メニューのファイルからインポートを選択して、「既存プロジェクトをワークスペースへ」を選択する。
さっき置いたsenディレクトリを指定して、インポート完了。
辞書作成
↓
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");
ほーい。
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を使ったけど、実行結果しか書いていなくて、最近セットアップにちょっと手間取ったから。
ちゃんと書くのは大変だ。
形態素解析だけできても、実はあまり楽しくない。
「も」が「助詞-係助詞」だといわれても、よくわからない。
というわけで、今度はマルコフ連鎖と組み合わせて楽しくしてみよー。
# いつか書くはず・・・。