Sen

有名な日本語の形態素解析プログラムに,茶筅がある.これは,奈良先端大で開発されたもので,日本語の文章を入力すると,品詞を解析してくれる.

こんばんわ,ラッシャー木村です.

という入力に対して,

こんばんわ	(こんばんわ)	感動詞(0,5,5)	コンバンワ	コンバンワ
,	(,)	記号-読点(5,6,1)	,	,
ラッシャー	(ラッシャー)	未知語(6,11,5)	null	null
木村	(木村)	名詞-固有名詞-人名-姓(11,13,2)	キムラ	キムラ
です	(です)	助動詞(13,15,2)	デス	デス
.	(.)	記号-句点(15,16,1)	.	

のように,教えてくれるわけだ.茶筅は,高速性を追求して,Cで書かれている.いろんなライブラリから呼び出すインターフェイスもあったりするので,それはそれでいいのだが,やっぱりJava版が欲しい.で,そのJava版がSen.どうもSenと書いて「ちひろ」と読ませるらしいが,いくら何でもそれは無理.バグが指摘されていたりしてちょっと不安だが,他に良いものも無いので試してみる.

ダウンロードとビルド

ダウンロードして,antを実行すればよい.この手のツールで結構めんどうなのは辞書の作成なのだけど,Senはとてもよくできていて,dicディレクトリで,antとやると,自動的にipadicをダウンロードして,Senの形式に変換してくれる.便利便利.

実行

この手のツールは,文字コードの問題があるので面倒.特にMac版のJavaのデフォルト文字コードは謎...bin/sen.sh のjavaの引数に

-Dfile.encoding=UTF-8 \

を追加すると,以下のように実行できる.

$ echo 元気ですかー| SEN_HOME=. sh bin/sen.sh 
done.
Please input Japanese sentence:
[INFO] Dictionary - token file = ./dic/token.sen
[INFO] Dictionary - time to load posInfo file = 16[ms]
[INFO] Dictionary - double array trie dictionary = ./dic/da.sen
[INFO] DoubleArrayTrie - loading double array trie dict = ./dic/da.sen
[INFO] DoubleArrayTrie - loaded time = 0.386[ms]
[INFO] Dictionary - pos info file = ./dic/posInfo.sen
[INFO] Dictionary - time to load pos info file = 1[ms]
[INFO] Tokenizer - connection file = ./dic/matrix.sen
[INFO] Tokenizer - time to load connect cost file = 72[ms]
元気	(元気)	名詞-形容動詞語幹(0,2,2)	ゲンキ	ゲンキ
です	(です)	助動詞(2,4,2)	デス	デス
か	(か)	助詞-副助詞/並立助詞/終助詞(4,5,1)	カ	カ
ー	(ー)	未知語(5,6,1)	null	null

Google App Engine へ?

で,せっかくjavaだし,Google App Engineで実行しようとしてみた,が,今のところ挫折.

まずは,辞書が大きすぎてアップロードできない.ローカルでは実行できるんだけど,アップロードできる静的ファイルのサイズは,10Mまでらしい.が,Senの辞書で一番大きいのは20メガを超えている.

Senはファイルの読み込みに幾つか方法を用意している.幸い辞書ファイルは圧縮が効くので,辞書を圧縮しておき,実行時にメモリ上に展開する作戦を考えてみた.GZIPInputStreamを使って実装.

変なところでファイルのサイズを参照している部分があってちょっと手こずったが,なんとか実装して実行してみたところ,今度はアップロードには成功(^_^).が,今度は実行時エラー.

想像するに,コンテナ内でのメモリ量になんらかの制限があり,それ以上アロケートしようとするプログラムは強制的に停止させられているのだろう.まあ,妥当だ.

そもそもGZIP作戦だと,メモリ上に展開するのに時間がかかりすぎてあまり現実的ではない.ファイルを複数に分割してファイル容量の制限を回避する方法を考えてみよう.それならMMAPも使えそうだし.