Pure PythonなRakuten MAを書いたのでその紹介記事です。
Rakuten MAとは
Rakuten MAは、楽天NLPプロジェクトさんによるJavaScriptの形態素解析器です。逐次でオンライン学習して手軽にモデルを更新できる点やブラウザを介してクライアント側から形態素解析ができる点などが特長だと思います。
詳しくは、以下の記事の説明がわかりやすいです。
- 本家 Rakuten MA 日本語ドキュメント
- パソコン工房のPCで遊ぼう第2弾! あんちべさんと一緒に Rakuten MA で形態素解析 - はてなニュース
- RakutenMAによる形態素解析入門 - あんちべ!
Python版 Rakuten MA
そんなRakuten MAをPythonで使いたいと思ったので、Python版を書きました!
$ pip install 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
比較用コード
# -*- 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"]])
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を使える、この一点だけが存在意義です。