darts-java: Double-ARray Trie System Java implementation.
概要
Taku Kudo さんの Double Array Trie の C++ 実装 (*1) を MURAWAKI Yugo さんが Java ポーティングしたバージョン (*2) に対して、 より Java らしいインタフェースに変更し、また性能面も改善した Darts の Java 実装です。
- (*1) Darts http://www.chasen.org/~taku/software/darts/
- (*2) http://nlp.ist.i.kyoto-u.ac.jp/member/murawaki/misc/index.html
元実装 (Java ポーティング版) からの改善点
- インタフェースの改善
- 文字列の char[] 表現や配列の多用を改め、より Java らしいインタフェースで、かつ手軽に利用できるインタフェースとしました。
- 入力データによってエラーとなるケースへの対処
- ヒープ消費量の改善
- Trie 構築時、および構築後のヒープ消費量が少なくなるようにしました (元実装の約 26% のヒープ消費量)。
- 実行速度の改善
- Trie の構築 (約 2.6 倍) や exact match での検索 (約 1.7 倍)、common prefix での検索 (約 1.2 倍) それぞれについて処理性能を向上しました。
使い方
DoubleArrayTrie.java を単品でご利用ください(実装はこのファイル一つで完結しています)。
Benchmark
テストデータ
Ubuntu 12 の /usr/share/dict/words (916 KB、99171 語) をテストデータとして利用しています。
測定方法
- ヒープ消費量
- DoubleArrayTrie#build() の呼び出し前後それぞれにおいて、ヒープ消費量を Runtime#totalMemory() / Runtime#freeMemory() にて計測し、その差分をとることで 構築後のヒープ消費量を算出しています。
- build() 処理時間
- ファイルから読み込んだテストデータを build() で 50 回処理し、その平均と標準偏差を算出しています。
- exactMatchSearch() 処理時間
- テストデータをもとに構築された Trie に対して、テストデータの語句すべてを 順に exact match 検索する処理を 50 回実施し、その平均と標準偏差を算出しています。
- commonPrefixSearch() 処理時間
- exactMatchSearch() と同様に、テストデータをもとに構築された Trie に対して、 テストデータの語句すべてを順に common prefix 検索する処理を 50 回実施し、その平均と標準偏差を算出しています。
- 元実装では、commonPrefixSearch() の結果を同メソッドに渡した int 配列で受け取るインタフェースと なっているため、検索結果の個数を求めるためと、実際の結果を受け取るためのそれぞれ1回ずつ (合計2回)、commonPrefixSearch() を呼び出しています。
測定結果
original imploved
====================================================
ヒープ消費量 [byte] 62,287,864 16,780,160
----------------------------------------------------
build() [msec] 165.68 64.26
(標準偏差) (82.87) (6.74)
----------------------------------------------------
exactMatchSearch() [msec] 10.88 6.24
(標準偏差) (7.21) (7.73)
----------------------------------------------------
commonPrefixSearch() [msec] 17.18 14.04
(標準偏差) (4.68) (4.75)
----------------------------------------------------
License
LGPL と修正 BSD のデュアルライセンスです。 各ライセンスの詳細は LGPL ファイル、BSD ファイルをご覧ください。
TODO
- Javadoc を記述する。