erika-trieのtail部分にトライを導入してみた

LOUDSを用いたトライのライブラリであるerika-trieを改良した。具体的にはux-trieやmarisa-trieで使われているトライのtail部分を逆向きトライで持たせる、という手法を導入してみた。さしあたり日本語wikipediaを用いた評価をしたのでメモしておく。

erika-trie(実用版)とキーワード抽出ツールerika_extractを作ったよ - EchizenBlog-Zwei
LOUDSトライのライブラリの性能を比較してみた - EchizenBlog-Zwei
(続)LOUDSトライのライブラリの性能を比較してみた - EchizenBlog-Zwei


前回の実験時にはtail部分もすべてノードとして持たせていたのだが、この部分を文字列orトライで選択可能にした。文字列のほうが高速だが、トライのほうがデータサイズは小さくなる。
データサイズについては以下のとおり。トライを用いた場合はux-trieと同程度にまで小さくなった。

元データ			: 26,960,268 byte
marisa-trie		: 7,199,728 byte
ux-trie			: 10,364,932 byte
erika-trie(旧)		: 18,866,382 byte
erika-trie(文字列)	: 15,145,131 byte
erika-trie(トライ)	: 10,859,269 byte


common-prefix-searchの検索速度は以下のとおり。トライを用いた場合の速度低下が気になるがそれでもux-trieよりは速い。

marisa-trie		: 11.9 sec
ux-trie			: 57.2 sec
erika-trie(旧)		: 20.7 sec
erika-trie(文字列)	: 22.3 sec
erika-trie(トライ)	: 31.6 sec


predictive-searchの検索速度は以下のとおり。こちらはトライを用いた場合に絶望的なほど遅くなる。erika-trieはtailのトライからの文字列復元が高速に行えないので、それが影響している気がする(すみません。ちゃんと調べてないです)。

marisa-trie		: 13.5 sec
ux-trie			: 45.8 sec
erika-trie(旧)		: 28.4 sec
erika-trie(文字列)	: 24.2 sec
erika-trie(トライ)	: 62.4 sec

というわけで文字列版のerika-trieは速度への影響が小さいままでデータサイズが小さくなったので結構良い結果が出た気がする。一方でトライ版はデータサイズを小さくした反面predictive-searchに非常に大きな悪影響がでてしまった。うむむ。
あとmarisa-trieに勝てる気がしないんだけど、どうなってるのこれ・・・。