この記事で紹介すること
- KNPのサポートパッケージ作った話
- 若干だけ(1.6倍~2倍)処理速度が向上する1
- Juman++ & KNPの組み合わせでは10倍近く、速度向上
KNPとは・・?
「日本語構文解析器」です。
こんなことができます。
- 格解析
- 構文解析
- 固有表現抽出
えっ、RNNでいいんじゃね?
DNN大流行期の今に「まだパージングやってんの?」と思われるかもしれません。
実際、工夫されたRNNを利用すると、格タイプを当てるタスクで最高精度が出ることがすでに示されています。実際、ソースコードも公開されてるので、もうこっちで良いんじゃないか・・・という気もします。
とはいえ、解析対象の格はまだKNPが方が多いですし、
KNPは格解析だけでなく、形態素情報から、構文情報もまとめて表示してくれるので、ツールとしては使い勝手が良いのです。
KNPの少し困るとこ
解析速度があまり早くないです。
「MecabやCabochaの解析速度が早すぎなだけだ」という意見もあったりしますが
入力データが少しだけの時はあまり気にならないのですが、データ量が増えてくると、少しでも工夫したいものです。
とはいえ、中身は触りたくないところです。
じゃあ、__「分散化しちゃえばいいじゃん」__という、安直なアイディアを形にしたのが、本記事で紹介するパッケージです。
KNPの呼び出し処理を分散化してくれるパッケージを作ったった
インストール
Pypiに登録したので、 pip
でインストールできます。
pip install knp-utils
特徴
- シングルスレッドよりも早くなる (当たり前)
- 並列処理の割にはメモリ消費が少ない。マシンに優しい。
- KNP解析結果を得るための簡単なインターフェースを用意した
- コマンドラインインターフェース/Webアプリケーションをもってるので、Python関係ない人も使うことができる
- Python2.x/3.xの両方で動く
- pyknpを使いたい人もこうすれば、うまくいく。
速度比較 (Juman & KNP)
早くなりました。入力文書数が増えるほど、差は大きくなる傾向があります。
下記の数値は40文書のときの比較です。
ちなみにpexpect
, everytime
とはマルチスレッド内部でJuman & KNPプロセスを扱うモード名です。
pexpect
はJuman & KNPプロセスを起動しっぱなしにしておきます。
everytime
は入力テキストの度にJuman & KNPを起動します。
pexpect mode, finished with :44.13979196548462[sec]
everytime mode, finished with :38.31942701339722[sec]
pyknp, finished with :64.74086809158325[sec]
速度比較 (Juman++ & KNP)
Juman++ & KNPの組み合わせ時の時間比較です。
Juman++(1.02)は「動作が遅いだの、なんだの」言われることを耳にします。
これはプロセス起動時のモデルファイル読み込みに時間がかかるからです。
なので、プロセスを起動しっぱなしにしておけば、早くなるわけです。単純な話ですね。
pexpect mode, finished with :48.096940994262695[sec]
everytime mode, finished with :64.07872700691223[sec]
pyknp, finished with : 602.032340992232452[sec]
動作内容
以下の処理を繰り返しているだけです。
- 入力文書をsqlite3 DBに格納
- マルチスレッドでJuman & KNP呼び出しを分散処理する 2
- 解析結果をsqlite3 DBに保存
最後に
手早く、お手軽に、楽しい構文解析ライフを!