構文解析器の省メモリ化を頼まれた

外国の方から,公開している構文解析器を日本語学習支援の Android アプリに使いたい,というメールが来た.前段の形態素解析器 (Kuromoji) は 10MiB 程度で動作するそうで(多少解析が遅くなっても良いから)構文解析器もその程度の消費メモリ(ディスク)で動かせないか,という質問(要望).
現在公開している構文解析器の消費メモリは (Mac mini Server (Late 2012)) で 28 MiB ぐらいで,構文解析器としては比較的省メモリな設計になっているのだけど,高速化のため素性の組み合わせを陽に展開しているのである程度メモリが必要となる.そこでまず,素性の組み合わせを展開しない PKI を分類に使うことを薦めてみた.手元で試したところ,解析速度は 1/60 ぐらいになってしまうが動作に必要となるメモリ・ディスクは 6 MiB ぐらいになった.[追記] ディスクは 1.5 MiB で済むようだ.
しかしこれは流石に割に合わない(解析速度が遅くなり過ぎ)と感じる.そこで,陽に組み合わせを展開する素性数を大幅に制限して,配列*1で密に保持できる程度に展開する組み合わせ素性の数を抑えたら,解析速度の低下は 1/2 (それでも 10,000 文/秒)程度で,動作に必要となるメモリ・ディスクを 7 MiB まで減らすことができた.近似なしで解析精度はそのまま.これなら良いか.
ソースコードを一行だけ書き換える必要があったが,次に公開する版ではその必要がないようにしておこう.よく調べたら,ソースコードは書き換える必要なかったが,少し修正した方が良い箇所が見つかったので,次に公開する版で対応しよう.
[追記] もう少し調べたら,ディスク使用量は 2 MiB ぐらいで済むことが分かった.内訳は,素性の変換辞書が 0.13 MiB, 文節区切りのモデルが 0.56 MiB, 係り受け解析のモデルが 1.13 MiB.

*1:高速化のため,高頻度素性の組み合わせは配列で,それ以外はダブル配列で保持する実装になっている.