Jumanの死

1億1千万ツイートのprolog化も、最終局面に来ている。トラブルがなければ、明日の朝には、終わっているはずだ。

前の記事からの進展は、サーバーモードのJumanが、耐えられなくなって死んでしまうという現象を回避するようにしたことだ。

全てのツイッターを4分割して、その三つ目をやっているときに、どうしてもSocketExceptionエラーが発生して、サーバーモードのJumanのソケットが死んでしまって、そのスレッド自体がフリーズしてしまうという現象が発生するようになった。そうなると、他はうまくやっているようなのだが、私の方が続ける気が無くなって、全体を止めてしまうというのが繰り返された。(一つのスレッドに、一つのJumanを、ポートを変えて立ち上げているので、他のJumanには影響を与えない)

よくよく原因を調べると、異常なツイートにJumanが疲弊してしまったようだ。ツイートの中に、次のような二つのツイートが続いてあった。

かぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁわぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁいぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃε=ε=(ノ≧∇≦)ノ#ボタンインコ#インコ
【1週間限定】セブン-イレブン、かわいすぎるXmasスイーツが登場sCMXcバニラといちごのサンタケーキ、チョコとクッキーのトナカイケーキ、いちごムースを使った柊のケーキを展開しています。 https…

この二つのツイート、それぞれ単独では、prolog 化できるのだが、続けると必ず、二つ目の文章のJumanによる形態素解析の場面で、SocketExceptionエラーが発生してしまう。Jumanのプログラムを調べていないので(ソースはあるが、面倒でできない)よくわからないが、最初の文章でJumanが内部エラーを引き起こしてしまっているようなのだ。

さらに調べると、最初の「ぁぁぁぁぁぁぁぁ」あるいは「ぃぃぃぃぃ」というような文字の連続を一部やめる(少し短くする)と、続けても問題なくprolog化できる。およそ、このツイートは日本語ではないので、Jumanが投げ出してしまう気持ちもよく理解できる。(元文章はなるべくいじらず、可能な限り受け入れようというのがポリシーだ。そうすることによって、どんな文章にもprolog化アルゴリズムが適用できるだろうと思っているので)

内部エラーを起こして、フリーズしてしまうのは実は係り受け解析のKNPなのだ。なぜそうなるのかというと、Jumanの内部エラーで、中途半端に構文解析終えて、最後にEOSを返さないのだ。そのために、EOSをKNPがいつまでも待つという形でスレッドがフリーズする。だから、最後にEOSをあえてつけるようにしたが、それでKNPはフリーズしなくなるのだが、その後Jumanは動かなくなってしまうので、処理が進まない。

結局、先のような同一文字が5文字以上続いているような文章は、prolog化の対象から外すことにした。正規表現の後方参照で、そのような連続文字をチェックできる。

ただ、そうしてみると、ツイッターの中には、そうした同一文字の連続うちという現象がいたるところで観れる。だから、多少躊躇したが、そんなの文章じゃないだろうという思いの方が打ち勝って、この基準を導入することにした。

今、最後の1/4を実行している。210このスレッドが動いている。早くて超高機能のパソコンのおかげで、大きな問題なくここまできた。