Pure Python 版オンライン形態素解析ツール Rakuten MA

  • 22
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Pure PythonなRakuten MAを書いたのでその紹介記事です。

Rakuten MAとは

Rakuten MAは、楽天NLPプロジェクトさんによるJavaScriptの形態素解析器です。逐次でオンライン学習して手軽にモデルを更新できる点やブラウザを介してクライアント側から形態素解析ができる点などが特長だと思います。

詳しくは、以下の記事の説明がわかりやすいです。

Python版 Rakuten MA

そんなRakuten MAをPythonで使いたいと思ったので、Python版を書きました!

$ pip install rakutenma でインストールできます。

https://pypi.python.org/pypi/rakutenma

from rakutenma import RakutenMA

rma = RakutenMA(phi=1024, c=0.007812)
rma.load("model_ja.json")
rma.hash_func = rma.create_hash_func(15)

print(rma.tokenize("うらにわにはにわにわとりがいる"))
print(rma.train_one(
       [["うらにわ","N-nc"],
        ["に","P-k"],
        ["は","P-rj"],
        ["にわ","N-n"],
        ["にわとり","N-nc"],
        ["が","P-k"],
        ["いる","V-c"]]))

こんな感じで本家JS版と同じようにAPIを使えるようになってます。
詳しくは上記PyPIを参照してください。

Python3系しか対応してないよ

本当はPython 2.7にも対応したかったのですが、気力が尽きたのでひとまずPython 3系のみ対応してます。 バージョン0.2からPython 3.3, 3.4に加えてPython 2.6, 2.7でも動くようになりました。

モデルの互換性あるよ

Rakuten MAのモデルは文字列をハッシュ関数によって数値化した値を扱います。このハッシュ関数の挙動をJS版と同じになるようにしたので、JS版と同じモデルファイルをPython版でも使い回すことができます。

このパッケージにはモデルファイルを含んでいないので、別途本家Rakuten MAのリポジトリから入手してください。

処理時間の比較

トークナイズと学習を1000回ずつ回して本家JS版と処理時間を比較してみました。

実行環境

  • CPU: Core i7 2GHz
  • Memory: 8GB
  • OS: Mac OSX 10.8.5

  • Python: 3.4.2

  • Node.js: 0.10.33

  • Pypy: 2.4.0 (Python 3.2.5)

  • Rakuten MA Python: 0.2

  • Rakuten MA (JS): 1.0.0

比較用コード

rakutenma_benchmark.py
# -*- coding: utf-8 -*-
from rakutenma import RakutenMA

rma = RakutenMA()
for i in range(1000):
    rma.tokenize("もう何も怖くない")
    rma.train_one(
        [["もう","F"],
         ["何","D"],
         ["も","P-rj"],
         ["怖く","A-c"],
         ["ない","X"]])
rakutenma_benchmark.js
var RakutenMA = require('./rakutenma');

var rma = new RakutenMA();
rma.featset = RakutenMA.default_featset_ja;

for (var i = 0; i < 1000; i++) {
    rma.tokenize("もう何も怖くない");
    rma.train_one(
        [["もう","F"],
         ["何","D"],
         ["も","P-rj"],
         ["怖く","A-c"],
         ["ない","X"]]);
}

結果

計算機に余裕がある状態で計り直しました。(2015/01/15)
$ time python rakutenma_benchmark.py 

real    0m3.583s
user    0m3.573s
sys 0m0.009s

$ time node rakutenma_benchmark.js

real    0m1.852s
user    0m1.831s
sys 0m0.027s

本家JS版と比べて2倍近く時間がかかってます(;´Д`)

ついでにPypyでも試してみました。

$ time pypy3 test.py 

real    0m1.908s
user    0m1.859s
sys 0m0.042s

本家と並ぶ性能が出ました。

さいごに

Python版Rakuten MAを書きました。本家と比べて2倍近く遅いし、ブラウザから使えるという大きなメリットを失っているのでいまいちですが、グルーコードを書かずにPythonからRakuten MAを使える、この一点だけが存在意義です。