Symfoware

Symfowareについての考察blog

jumanをサーバーモードで起動し、Pythonから接続する

Debianに日本語形態素解析システム JUMANをインストールしてみました。
日本語形態素解析システム JUMANをDebian 8にapt-getでインストールする

Pythonから操作してみようと思います。


PyKNP



公開されているPyKNPを使って操作する方法もあるようです。
PyKNP

最終的にPython以外の言語でも操作してみたかったので、
別な方法を検討することにしました。




サーバーモード



jumanをサーバーモードで起動し接続する方法があるようです。


# juman -h
usage: juman -[b|B|m|p|P] -[f|c|e|E] [-S] [-N port] [-C host[:port]] [-i string] [-r rc_file]
             [-u [rendaku|lowercase|long-sound|onomatopoeia]]

             -b : show best path
             -B : show best path including homographs (default)
             -m : show all morphemes
             -p : show all paths
             -P : show all paths by -B style

             -f : show formatted morpheme data
             -c : show coded morpheme data
             -e : show entire morpheme data
             -e2 : -e plus semantics data (default)
             -E : -e plus location and semantics data

             -u : disable unknown word processing
             -i : ignore an input line starting with 'string'
             -r : use 'rc_file' as '.jumanrc'
             -v : show version

             -S : start JUMAN server
             -F : force JUMAN server run in the foreground
                     (use with -S, do not go to the background)
             -N port : specify JUMAN server's port Number
                     (use with -S, the default is 32000)
             -C host[:port] connect to JUMAN server




-Sオプションでサーバーが起動します。
-Fも合わせて指定すると、フォアグラウンドで起動してくれ、簡単に停止できそうです。


# juman -S -F




デフォルトでポート32000で待ち受けてくれます。






Pythonのサンプル



jumanサーバーを起動した端末のIPは192.168.1.102。
ここに別の端末からPythonで接続してみます。

こちらを参考にさせていただきました。
rubyからサーバモードのJUMAN/KNPを叩く
JUMAN/KNPをpythonで

また、通信プロトコルはこちらを参考にしています。
http://kameken.clique.jp/NLP2007/NLP_Tools/juman/juman_manual.pdf
D JUMANサーバのプロトコルの概要


サンプルはこのようになりました。


  1. # -*- coding:utf-8 -*-
  2. import socket
  3. import sys
  4. name = '192.168.1.102'
  5. port = 32000
  6. # jumanサーバーへ接続
  7. juman_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. juman_s.connect((name, port))
  9. # 「200 Running JUMAN version: 7.0」の応答を受け取り
  10. # これがないと先に進まない
  11. print juman_s.recv(1024)
  12. print '-' * 10
  13. # 「RUN」で形態解析を行うことを宣言
  14. juman_s.sendall('RUN\n')
  15. # 「200 OK」を受信
  16. print juman_s.recv(1024)
  17. print '-' * 10
  18. # 解析したい文字を送信
  19. context = 'テスト'
  20. juman_s.sendall(context+'\n')
  21. # 結果の受信
  22. juman_result = juman_s.recv(4096)
  23. print juman_result
  24. print '-' * 10




はまったのは、

1.適宜、応答を受信しないと処理が先に進まない。
2.「RUN」を送信して「200 OK」を受信してから、解析したい文字列を送らないといけない。


実行結果はこのようになります。


$ python sample.py
200 Running JUMAN version: 7.0

----------
200 OK

----------
テスト てすと テスト 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:テスト/てすと カテゴリ:抽象物 ドメイン:教育・学習"
EOS

----------




応答のあった文字を適当に分割・解析して利用することになります。

旧バージョンでは、EUCでデータを送信しないと行けなかったようですが、
現行バージョンでは、utf8で問題ないようです。


ちなみに、解析結果の意味は以下の並びのようです。


表記
読み
原形
品詞
品詞ID
品詞細分類
品詞細分類ID
活用型
活用型ID
活用形2
活用形2ID
意味情報






【参考URL】

rubyからサーバモードのJUMAN/KNPを叩く
JUMAN/KNPをpythonで
http://kameken.clique.jp/NLP2007/NLP_Tools/juman/juman_manual.pdf

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/06/13(火) 23:02:56|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<jumanをサーバーモードで起動し、PHPから接続する | ホーム | 日本語形態素解析システム JUMANをDebian 8にapt-getでインストールする>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1993-95ed8701
この記事にトラックバックする(FC2ブログユーザー)