大規模コーパスとjuman++

この間、形態素解析システムをjumanからjuman++に変更した。jumanは、サーバーモードで動かしていたが、juman++には、内臓でその機能がないので、標準ストリームをjavaで制御する方式に変更した。

日本語wikipediaの全本文など、大規模コーパスをjuman++で制御すると、いくつか深刻な問題が発生する。処理は、24スレッド、128Gメモリのubuntuマシンで処理するが、100を超えるjava スレッドごとにjuman++を立ち上げて処理する。

第1の問題は、jumanと比べ、数倍以上、遅いことである。これは、どうしようもない。プログラムを微調整して、少しでも挽回するしかない。

第2の大きな問題は、メモリを深刻に食べることだ。当初は、javaプログラムに、メモリーリークがあるのではないかと思ったが、javaのガベージコレクションは適切に機能し、メモリーも確保しているのでそちら側の問題ではないと結論づけた。juman++にメモリーリークがあるとは思えないが、どうしようもないので、一定処理ごとに、juman++を再起動し、一旦使っているメモリを解放させることで対応した。大体、1000個の文章を処理するごとに自動で再起動させている。

第3の問題は、数万の規模で文章を処理させていると、途中再起動しても、何かの拍子に、無反応になることである。エラーを吐くわけでもなく、文章を標準入力に入れても、出力しなくなる。標準エラーストリームに文章がたまるとそういうことになる経験があったのでそれかと思ったが、それを系統的に吐き出させていても発生する。これは、javaのバッファリーダーに標準出力をリダイレクトして取り込んでいるのであるが、工夫して、ready()で文章があることを確認してから読み込むようにし、一定期間(30秒)、ループが空回りすると、juman++を再起動するようにしたら、なんとかなっている。

ただ、その詰まりを起こした一つの文章は処理しないので、ちょっとした穴ができるが、全体の文章が膨大なので、影響は無視できる。

色々あっても、jumanと比べて、juman++が吐き出す形態素情報は魅力的で、それ以外のものにしようという気持ちは全く起きていない。