Sen - 日本語形態素解析システムをAndroid上で動かしたので手順をメモ。
Senのjarを持ってくればいけるかと思いましたが設定ファイル読み込みなどで環境変数使ったりなんやらしていたのでソースを持ってきて若干改造して動かしました。(なんだかんだいじったつもりが実際は1行直すだけでした)
※HTC-Desireでのみ実行できました。各バージョンのエミュレータ、HT-03AではOutOfMemoryErrorで死にました。

準備


色々モノを用意します。
とりあえず必要なのはSenのソースと辞書データです。
Senのソース取得

基本的にこのページSen - 日本語形態素解析システムを見てもらうのが早いですが、
ココからsen-1.2.2.1.zipを落として解凍します。

辞書データを構築

Senのページにある通りantで辞書データをビルドします。
環境としてLinuxが必要ですが自分はVMWareServer上のUbuntuでやりました。
以下のファイルが出来上がります。
posInfo.sen 20.78MB
token.sen 5.77MB
da.sen 7.25MB
matrix.sen 8.56MB

これで必要なものが揃いました。

・改造


Androidプロジェクトにソースを持ってくる

SenのソースをそのまんまAndroidプロジェクトに持っていきます。
sen-1.2.2.1/src/java/net
スパッとコピーしてビルドするとなんとビルドが通ります。
もちろんこのままでは動きません。

SDカードにsen.xmlを*.senファイルを持ってくる

Senの操作はとても簡単でStringTaggerかStreamTaggerをgetInstance()して
analyze(String text)するだけです。
解析結果をToken配列にして返してくれます。
Tokenの中には品詞とか読みとかが入っています。
SenはgetInstance()を読んだ時に初期化を行います。
環境変数から設定ファイルsen.xmlを読み込み、中に書かれているTokenizerの種類や各種辞書ファイルのパスを取得します。
辞書ファイルは合計で40MB近くあるので当然assetsには入れられません。
定義ファイル、辞書ファイルはsdcardに入れました。
今回は/srcard/sen配下に各種ファイルを置きました。
また、sen.xmlの内容は以下の様にしました。
<?xml version='1.0' encoding='utf-8'?>
<configuration>
 <dictionary>
  <connection-cost>/sdcard/sen/matrix.sen</connection-cost>
  <double-array-trie>/sdcard/sen/da.sen</double-array-trie>
  <token>/sdcard/sen/token.sen</token>
  <pos-info>/sdcard/sen/posInfo.sen</pos-info>
 </dictionary>
 <tokenizer>net.java.sen.ja.JapaneseTokenizer</tokenizer>
  <charset>euc-jp</charset>
  <unknown-pos>未知語</unknown-pos>
</configuration>


ソースを改造する

準備完了かと思いきや、実行すると速攻で死にます。
まずsen.xmlが読めないエラーになります。
StringTagger#getInstance(String path)をいう感じでパス指定出来るので
StringTagger#getInstance("/sdcard/sen/sen.xml");
と指定します。が、死にます。
StringTaggerの251行目辺りでファイルを開くのにInputSourceを利用している為何故か死にます。
仕方ないので修正
Document doc = builder.parse(new InputSource(confFile));

Document doc = builder.parse(new FileInputStream(cf));

動きます。
もっといじったと思ったらこれだけでした。


動かしてみる


EditとボタンとListViewの簡単なUIで実行テスト。
解析結果をListViewに出してます。
インストール後一回目の実行は30秒程度待たされますが、二回目以降は一瞬で解析結果を返してくれます。
1

2



課題など


とりあえず動きました。が課題もたくさんあります。
メモリをかなり食う。
HTC-DesireのFree部分がかなり食われてました。
MemoryFileとかにすると何とかなるのかな?

HT-03A、エミュレータでは動かない。
辞書データがでかすぎて死にます。

常駐サービスか何かになれば使えるのではないか。
アプリ組み込みというより常駐サービスで何か返すようにするのがいいだろうなと。 
OpenWnnとかってどうやってるのかな?ヒントになるかも。

.senファイル系の圧縮
多分精度を落とせば可能なんだろうなぁ。でもよくわからない。


プロジェクト


動かしたプロジェクトの中にSenのソースや辞書データが含まれているので公開していいものかよくわかってません。
誰か教えて下さい!