ある分野の研究者となるために

先日のJUMAN/KNPのラッパーの話の続き。

この前書いたjumanknp.rbはLinuxで書いたのだが、あれをWindowsに持って行ったときに思いがけない罠に嵌った。
Threadから立ち上げたjuman -Sと通信をするとなぜか、

金閣寺について。 金閣寺について。 金閣寺について。 未定義語 15 その他 1 * 0 * 0 NIL
EOS

みたいな感じで返ってくる。ちなみに期待するのはこんな感じ。

金閣寺 きんかくじ 金閣寺 名詞 6 組織名 6 * 0 * 0 "代表表記:金閣寺/きんかくじ"
に に に 助詞 9 格助詞 1 * 0 * 0 "連語"
ついて ついて つく 動詞 2 * 0 子音動詞カ行 2 タ系連用テ形 14 "連語"
。 。 。 特殊 1 句点 1 * 0 * 0 NIL
EOS

試しに別のプロンプトを立ち上げて、juman -C localhost:32000から文を送信してやると、これは正しく解析する。rubyからTCP/IPで通信をするとうまくいかない。

この現象を調べているうちにわかったことは、

  • JUMANは入力はSJISを期待しているが、どうもStringがrubyからASCIIになって送信されてるっぽい
  • rubyの中でString.force_encode("Shift_JIS")とかしても効果がない
  • もちろんcoding Shift_JISとかcoding Windows-31Jとかruby -Ksとかも試したけど意味ない
  • WindowsRubyTCP/IPの実装に怪しげなところがある

ということ。Linux版のTCP/IP実装ではEUCのStringを投げるとEUCのStringが飛ぶけど(ruby 1.8系と1.9系で文字コードの扱いが変わっているがそのあたりは割愛)、Windows版の実装では全部強制的にASCIIになってしまうっぽい。なんじゃそりゃ。

とりあえずこの問題の解決策としては、

  • RubyTCP/IPのライブラリの実体を探して書き換える
  • JUMAN/KNPのソースにiconvか何かを追加して文字コードSJISに強制的に切り替える

あたりしか思いつかないけどどっちも辛い…

後者はもしかしたら、元々EUCの実装をWindows実装で表だけSJISに切り替えてる可能性があるので、そうならぱっとできるかもしれないけど、河原(大)先生に聞くべきかなー


今なんでこんなことをやってるかというと、僕の研究は対話システムの動的な応答生成と分野適応なのだが、河原先生に、「ある分野の研究者となるためには、その分野の周辺技術は一通り実装までやってみるべき」と言われ、なるほどと思ったというのがある。
例えば、音声認識の研究をするのであれば、専門が音響モデルであろうと言語モデルであろうと、既存のものを使うだけでなくて、どちらのモデルも自前で作ってみるようなことを、博士の間にするべき、というのが先生の教えなのだが、確かに研究をやってる以上、ここはあれに依存しています、そっちはどこどこに依存しています、というのはよくない。言語処理研究者は言語処理のパーザを一から書くべき、とまでは言わないけど、少なくとも、メジャーなパーザのコードを読んで、自分でモデルを作れる、というところまでは、博士を出るつもりである以上はやらないといけないと思う。
そんなわけで、対話システムの研究をやるのであれば、言語処理的なパーザに対する理解も必要だし、音声認識言語モデルによる分野適応もできないといけないし、応答の音声合成に対する造詣も、あった方がいい。対話システム自体広い分野にまたがる複合テーマなので、やるべきことも多いが、少なくとも各要素技術に対する理解と、それらの制御は自前できちんとできるようにしないとなあ。