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 スクリプト - Λάδι Βιώσας
に書いてあった。上のもここ見ながらやりました。