★データ解析備忘録★

ゆる〜い技術メモ

{rjumanpp} ver0.0.0.9993 サーバーモードに対応しました & vignetteを公開しました

はじめに

これまで

形態素解析器JUMAN++をRから操作するパッケージを作り始めました - ★データ解析備忘録★

【R】{rjumanpp}ver0.0.0.9991の変更点とパッケージの構想について - ★データ解析備忘録★

{rjumanpp} ver0.0.0.9992 表層形ではなく活用の原形を出力できるようになりました - ★データ解析備忘録★

GitHub

github.com

ver0.0.0.9993

そろそろ0.0.1にしてもいいかなあと思ってるくらいには形になってきました。今回のアップデートではサーバーモードをサポートする関数をつけました。

JUMAN++のサーバーモードに関しては以下の記事が分かりやすいです。

qiita.com

サーバーモードについて

JUMAN++ はサーバーモードとして常に起動しておくことができます。これにより、新しい入力のたびにJUMAN++ を呼び出すオーバーヘッドを回避し、結果を高速に得ることができます。

JUMAN++のサーバーモードはもともと、「ターミナルでRubyスクリプトを使ってローカルサーバーで起動しておいて、その状態でクライアント用の別のRubyスクリプトを使ってJUMAN++を動かす」、という大変面倒くさい手順で使います。

# ホストネーム、ポート番号は必要であればつける
ruby script/server.rb --cmd "jumanpp --force-single-path" --host host.name --port 1234

でサーバーを起動して、

echo "新しいスマートフォンを買った" | ruby script/client.rb --host host.name --port 1234

のようにクライアントで形態素解析

でも、これってかなり面倒くさいです。せっかくパッケージ化してるんだからサーバーの起動も形態素解析も全部Rでやりたい。

というわけで{rjumanpp}パッケージに全部組み込みました。

使い方

全部Rからやるといっても操作をRからやるだけで、Rubyは入ってなければ入れておいてください。

{rjumanpp}パッケージからサーバーモードを使うためには、まず jum_start_server() 関数でサーバーを起動します。そして、形態素解析の関数で server = TRUE を指定します。

# JUMAN++サーバーを起動
jum_start_server()

# 関数内でserver=TRUEを指定
jum_wakati("新しいスマートフォンを買った", server = TRUE)
#> [1] "新しい スマートフォン を 買った"

jum_start_server() 関数は、必要に応じてサーバーの名前とポート番号を指定することができます。デフォルトではlocalhostの12000ポートにつなぎます。

jum_start_server(host.name = "hoge", port = 1234)

速いの?

サーバーモードで JUMAN++ を利用することで、どの程度実行が速くなるのか見てみましょう。検証環境はMac OS , 3Ghz Corei7, メモリ16GBです。

# サーバーを利用しない
system.time(jum_wakati("新しいスマートフォンを買った", server = FALSE))
#>    ユーザ   システム       経過  
#>      0.114      0.178      0.325

# サーバーを利用する
system.time(jum_wakati("新しいスマートフォンを買った", server = TRUE))
#>    ユーザ   システム       経過  
#>      0.032      0.008      0.078

約4倍と、実行時間に明らかに差が出ていることが分かります。

何回か試しましたが、だいたい2〜4倍速くなります。

解析が終了したら、 JUMAN++ のサーバーを停止します。

jum_close_server()

vignette

今まで更新のたびにブログを更新していたのですが、やはり機能をまとめたものが欲しかったのでvignetteを書きました。

R interface for JUMAN++ • rjumanpp