コーパスを小さくする

現在、私の環境では、popfild.db の容量は約 3.8MB。これが大きい方なのか小さい方なのかわからないけれど、この大きさをできるだけ小さくすることができれば、POPFile の分類速度が速くなりそうな気がする。コーパスを小さくするための方法について、少し考えてみた。
現在、単語とバケツの組み合わせの数(バケツごとの固有単語数の合計)は 23,804 個(select count(*) from matrix;)で、バケツに関係なく数えた固有単語数は 19,137 個(select count(*) from words;)という環境。
この中から、コーパスに(正確には、バケツのひとつひとつに)一度しかあらわれない単語を削除してみる(これまでに一度しかあらわれていないということは、分類にはあまり使われていないのではないかという予想のもと)。popfile.db の内容をいじるためには、POPFile を終了して popfild.db をどこかにコピーしてから、Terminal で sqlite popfile.db として開く。まず、単語とバケツの組み合わせ表(matrix)から、あらわれた回数が 1 回だけの組み合わせを削除する。

sqlite> delete from matrix where times=1;

次に、単語表(words)から、上で行った作業によって必要なくなった単語(あらわれたどのバケツでも一度だけだった単語)を削除する。

sqlite> delete from words where id not in (select wordid from matrix);

これによって、単語とバケツの組み合わせの数は 10,652 個に、バケツに関係なく数えた固有単語数は 7,881 個となった。それぞれ半分以下にすることができた。最後に、データベースの無駄な部分を削除する(これを行わないと、データベースの内部にあるデータの数は減っても、データベースのファイルサイズが変わらない)。

sqlite> vacuum;
sqlite> .quit

popfile.db のサイズは、約 1.6MB となった。
これで精度があまり変わらなければ、コーパスが小さくなったぶんだけ効率があがったということができそうだ。まだ実験を開始してからまだあまりたっていないのだけど、これまで 47 通のメールを受け取って、精度は 100%。もうしばらく様子をみてみるつもり。