rubyからサーバモードのJUMAN/KNPを叩く

JUMAN/KNPにはJUMAN/KNP自体をサーバとして立ち上げて、クライアントからの通信を受けて解析する-Sモードというのがある。

juman -S

とかするとJUMANが立ち上がって、32000ポートで入力を待つ。(KNPは31000ポートがデフォルト)
この状態で例えば、

juman -C localhost:32000

とかするとそっちの窓で解析結果が返ってくる。こいつをrubyで使う。

#! /usr/bin/ruby -Ke
require 'socket'
print("JUMAN/KNP接続テスト\n")

#Jumanとのソケット通信部分######################################

juman_s = nil
until juman_s
  begin 
    juman_s = TCPSocket.open("localhost", 32000)
  rescue
    STDERR.print "Jumanとの接続に失敗しました。再接続しています。\n"
    sleep 5
    retry
  end
end

STDERR.print "Jumanに接続しました\n"

juman_s.write("RUN -e2\n")
while f = gets
  juman_s.write(f)
  while true
    f = juman_s.gets
    print f
    break if f.to_s == "EOS\n"
  end
end

juman_Sに"RUN\n"を送ると解析の入力を待つモードになるが、このRUNを投げるときにオプションも指定する。サーバモードのデフォルトは-Bオプションだが、JUMANの通常の出力オプションは-e2なので、KNPこの解析結果を投げるつもりであれば"RUN -e2\n"のようにオプションを指定しておく必要がある。

どうでもいいけど、僕はずっと"RUN"で投げていてはまったのと、-e2オプションをどのタイミングで指定するのがわからずにJUMANのclient.cのソースを読んだ。

同じようなことをKNPでやればKNPのサーバモードでも解析ができるはず。Juliusも。ちなみにJuliusのサーバモードはデフォルト10500番ポートで待っているが、そのあたり詳しくは

音声認識システム Julius を使って twitter に投稿する ruby スクリプト - Λάδι Βιώσας

に書いてあった。上のもここ見ながらやりました。