PP JoinならびにPP Join+の検証
- 2. 1 はじめに
日々データが蓄積されていく CGM サービスにおいて、大量のデータの中から類似するデ
ータを抽出することはデータマイニングの観点で大事であるが、計算量が多く処理に時間
がかかるのが一般的で、大変な処理である。
前回、大量データ中の類似データを効率的に抽出するアルゴリズムとして「Similarity
Join」「Prefix Filter」をテーマにレポートを作成したが、今回はその続編として、Prefix
Filter アルゴリズムの発展系である「PPJoin」ならびに「PPJoin+」について調査を行っ
た。
2 Similarity Join について
Similarity Join 自体は広い概念で、「あるデータ群の中で類似しているデータを抽出する 」
というアルゴリズム全般を包括する言葉となっている。
[1]
上記のように、データ群中にお類似しているデータが存在した場合、似ているもの同士の
ペアの結合(join)を行い、データを出力する、というアプローチである。
Similarity Join 全 般 に つ い て ま と め ら れ て い る 資 料 「 Similarity Join Algorithms:An
Introduction」[2]を参照すると、Similarity Join には大別して以下の三通りのアプローチ
が存在すると紹介されている。(p.27)
Partition-based
Filtering-based
Index-based
今回はこの中で、Filtering ベースのアプローチのひとつである「Prefix Filter」について
述べる。
3 Prefix Filter について
Prefix Filter は、データの比較を行う際に先ずデータの先頭方面の値同士で比較を行い、
類似有無のふるい分けを行うアルゴリズムである。
3.1 Prefix Filter アルゴリズムの種類
Prefix Filter の手法については、数多くの論文が発表されている。
SSJoin[3]
Formalize the prefix-filtering principle and use it in a symmetric way
Access original record for verification
(対称な方法でPrefix Filter を使用し類似検索を行う。オリジナルな
データにアクセスして類似有無の確認を行う)
All-Pairs[4]
Use prefix-filtering in an asymmetric way
(非対称な方法で Prefix Filter を使用して類似検索を行う)
PPJoin(PPJoin+)[5]
2
- 3. Employs prefix-filtering, position filtering and suffix filtering
(Prefix Filter 以外にPosition Filter, Suffix Filter を使用して類似検
索を行う)
3.2 今回採用したアルゴリズム
今 回 は Chuan Xiao 氏 が 2008 年 に 発 表 し た 論 文 「 Efficient Similarity Joins for
Near Duplicate Detection 」[5]に掲載されている、PPJoin アルゴリズム、ならびに
PPJoin+アルゴリズムのアプローチを参考に実装を行った。
3.2.1 Prefix Filter の基本的な考え方
PPJoin は Prefix Filter アルゴリズムの一種である。
Prefix Filter は数式で表すと、以下のような式で表現できる。
prefix( x) ∩ prefix ( y ) ≠ φ のとき
sim( x, y ) > t であれば類似
x,y は任意のデータ群、 φ は空配列、t は任意の閾値(1 >= t >= 0)。
prefix(x)は先頭 N バイト/N 文字のデータ、sim(x,y)は何かしらの類似度もしく
は距離を算出するためのアルゴリズム、という意味になる。
先頭のデータ同士を比較しなにかしら一致する場合(空配列で無い場合)、類似度を算出
し閾値以上であれば類似データとみなす、という流れになる。
3.2.2 PPJoin のアルゴリズム
先頭データの一致度・類似度を算出する手法として、他手法ではジャッカード係数やコサ
イン距離、Overlap 係数などの数値を用いるケースがあるが、PPJoin では「2つのデータ
群を先頭から見たときにそれぞれに出現する同一データの出現位置」により一致度を判定
する。
な お 、 PPJoin の 「 PP 」 は 、 「 Positional filtering with the Prefix filtering-based
algorithm.」の略とされている。
prefix( x) ∩ prefix ( y ) ≠ φ
の判定の際に、データの先頭部分を抜粋(Prefix Filtering)し
た上で、共通データの出現位置(Positional Filtering)により一致度を判定する、という
流れである。
[6]
具体的な数式・アルゴリズムとして、PPJoin の論文中に記載されている擬似コードを引
用する。
3
- 4. 5行目の
p ← |x| − (t * |x|) + 1;
において、データ群の先頭から読み取るデータの範囲を計算している。
t は類似度の閾値(threshold)、x はデータ群、|x|はデータ長となる。
たとえば 10 文字のデータ郡x「ABCDEFGHIJ」において閾値が 0.8 の場合
p = 10 - (0.8 * 10) +1 = 3
となり、先頭3データを抜粋して評価対象とする、という形である。
Positional Filtering の閾値として、9行目で
α ← (t / ( 1 + t ) ) * (|x| + |y|);
のように値 α を計算している。
2データを先頭から走査した結果同一データが出現した際に、同一データの出現場所(i,j)
を元に以下の式で ubound(upper bound:上限)の値を求め、値 α との比較を行う。
ubound ← 1 + min(|x| - i , |y| - j);
データ群 x「ABCDEFGHIJ」、データ群 y「BCDFGHIJ」、閾値 0.8 の場合は以下のよ
うになる。
α = (0.8 / ( 1 + 0.8 ) ) * (10 + 8) = 8
ubound = 1 + min(10 – 1 , 8 – 0) = 9
4
- 5. α は、2データ間で閾値を満たす類似度の下限、ubound は同一データ出現位置から計算さ
れる類似度値の上限を意味している。α より ubound の値が小さい場合は、2データは類
似データとみなされない。
擬似コードの中では、α 値より ubound 値の方が大きい場合、配列 A[y]に数値を加算する
ロジックになっている。A[y]について値が 0 のものは Verify の対象とならないため、結果
として α 値の方が ubound 値よりも大きい場合、そのデータについては類似データとして
扱われないことになる。
各データ群の評価終了後、Verify 関数により類似度を算出し、類似データの抽出を実施す
る。
Verify 関数内の処理については、論文中の擬似コードを引用する。
Verify 内では基本的に、データ群 x とデータ群 y の Overlap 係数を算出し、類似度が α 値
より高い場合に類似データと判定している。
Overlap 係数は以下のように定義される。
O(x, y) = x ∩ y
3.2.3 PPJoin+のアルゴリズム
PPJoin はデータの先頭部分のみを評価するアルゴリズムであったが、PPJoin+では先頭部
分に加えて、データ後方から再帰的にポジションを移動しデータのふるい分けを行うアル
ゴリズムとなっている。
論文から擬似コードを引用する。
5
- 6. こちらのアルゴリズムを、先の「Algorithm 1」の12行目(A[y] ← A[y] + 1)と置き換
える。
Hmax はデータ x,y のそれぞれデータ長と、同一データの出現位置(i,j)、類似度の閾値 t の
値より推測される、データ群間のハミング距離の最大値である。
Hmax と、SuffixFilter により算出した実際のハミング距離を比較し、Hmax よりもハミ
ング距離の値が小さい(距離が近い)場合に類似データの候補として扱う、という流れの
処理となっている。
Suffix Filter のアルゴリズムは以下のようになっている。
6
- 7. まず、データ y の中間位置 mid を求め、中間位置に存在するデータ w を取得する。
その上で、5~6行目にて、データ x 中の w の場所を走査し、その場所を基点に前後でデ
ータを分割する。
イメージとしては以下引用する図のような形となる。
[6]
分割したデータを用いてハミング距離を算出し、先ほど算出した Hmax の値と比較する。
Hmax よりも値が小さい(距離が近い)場合は、分割したデータを基に SuffixFilter 処理を再
帰的に実施する。
再帰は任意で定めた最大回数(MAXDEPTH)まで繰り返す。
[6]
このような形で、再帰的にデータを分割し、それぞれのハミング距離の計算を繰り返し行
っていくことでデータのふるい分けを行う手法が PPJoin+となる。
直感的に、データの先頭のみでふるい分けを実施するのに比べ、複数のデータ位置を基点
にふるい訳を複数回実施する方が不要な候補データの削除を効率的に行えるため、処理速
度としても有利になることが感じられる。
次項では、SSJoin、PPJoin、PPJoin+それぞれでどの程度のパフォーマンスの差が出るか、
実際に測定してみた。
4 性能測定
上述の PPJoin、PPjoin+、ならびに以前作成した研究レポート「Prefix Filter の検証」[7]
にて紹介した SSJoin アルゴリズムを用いて、性能測定を行った。
※ただし、SSJoin については筆者独自の解釈で拡張している箇所があるため、元論文記載
の内容と結果が異なる可能性があることをご了承いただきたい。
なお、検証用のプログラムは、論文を参考に Java 言語にてそれぞれ自作した。
4.1 条件
以下の条件で性能測定を実施した。
7
- 8. デ ー タ 件 数
文字列長がまちまちで、データ群中に類似文章が含まれる文章データ群。
A:約 500 件(482 件)
B:約1,000 件(940 件)
C:約 2,000 件(1894 件)
アルゴリズム
A:SSJoin
B:PPJoin
C:PPJoin+
SuffixFilter の再帰回数上限(MAXDEPTH)は「3」で設定
データの扱い
文 字 列 デ ー タ を 2-gram 単 位 で 分 割 し 、 ト ー ク ン と し た 。
(ex. あいうえお → あい,いう,うえ,えお)
類似度の閾値
0.9
0.8
0.7
0.6
データの取得方法
HDD 上にあるファイルより読み取り、いったんすべての文章をメモリ上に格
納した上で計算を行った
検証マシンのスペック
Macbook Air
CPU:1.6GHz Core 2 Duo
Memory:2GB
4.2 結果
以下のような結果となった。
処理時間については、同一条件で5回試行し、その平均値を取った。
○データ件数:500 件
閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6
処理時間 抽出件数 処理時間 抽出件数 処理時間 抽出件数 処理時間 抽出件数
(ms) (ms) (ms) (ms)
A:SSJoin 3075.8 10 2916.6 21 2925.2 27 2903.8 28
B:PPJoin 303.6 11 863.4 21 2927.8 29 6258.8 29
C:PPJoin+ 70 11 110.4 20 227 27 481.6 27
8
- 9. 閾値: 6
0.
閾値: 7
0. C : P Joi
P n+
B : P Joi
P n
閾値: 8
0. A:SSJoi n
閾値: 9
0.
0 2000 4000 6000 8000 10000 12000 14000 16000
○データ件数:1,000 件
閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6
処理時間 抽出件数 処理時間 抽出件数 処理時間 抽出件数 処理時間 抽出件数
(ms) (ms) (ms) (ms)
A:SSJoin 5654.6 5 5713.8 7 6241.2 12 7162.8 15
B:PPJoin 537.4 8 1917.8 14 5647.4 18 14075 18
C:PPJoin+ 100.3 6 182.8 9 375.4 12 941.8 12
閾値: 6
0.
閾値: 7
0. C : P Joi
P n+
B : P Joi
P n
閾値: 8
0. A:SSJoi n
閾値: 9
0.
0 2000 4000 6000 8000 10000 12000 14000 16000
○データ件数:2,000 件
閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6
処理時間 抽出件数 処理時間 抽出件数 処理時間 抽出件数 処理時間 抽出件数
(ms) (ms) (ms) (ms)
A:SSJoin 26888 4 27759.5 12 27534 65 28583.5 78
B:PPJoin 9258.6 6 19448.2 11 44745.4 73 125722 93
C:PPJoin+ 454.8 6 793.6 10 2176.6 51 5142.4 67
9
- 10. 閾値: 6
0.
閾値: 7
0. C : P Joi
P n+
B : P Joi
P n
閾値: 8
0. A:SSJoi n
閾値: 9
0.
0 2000 4000 6000 8000 10000 12000 14000 16000
4.3 考察
4.3.1 処理速度
処理速度の面では、PPJoin+の優秀さが際立っている。
Prefix Filter によるふるい分けだけでなく、Suffix Filtering を再帰的に実施することで
Overlap 係数による全文比較を行う回数を減らす事に成功していることが、速度の向上の
貢献している。
また、閾値を下げることによって、PPJoin ならびに PPJoin+の処理速度が線形に劣化し
ていることが見て取れる。PPJoin は多くの場合で SSJoin より処理速度が優秀だが、今回
使用したデータセットでは閾値が 0.6 になった段階で SSJoin よりも処理速度が劣化してい
る。
それぞれの閾値においての、PPJoin の Overlap 係数による比較回数を以下に記載する。
閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6
PPJoin:500 242 723 1859 4275
PPJoin:1000 547 1706 4504 10568
PPJoin:2000 4566 13229 33875 73620
閾値を下げることにより Overlap 係数による比較回数が増加することが、処理速度の劣化
に直結している様が見てとれる。
同様に、PPJoin+の Overlap 係数による比較回数を以下に記載する。
閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6
PPJoin+:500 25 26 27 27
PPJoin+:1000 11 12 12 12
PPJoin+:2000 32 50 64 67
ふるい分けが有効に作用し、Overlap 係数による比較回数を PPJoin に比べて大幅に削減
することに成功している。
4.3.2 抽出件数
類似データの抽出件数は、概ね
PPJoin > SSJoin > PPJoin+
の順番で多くなっていることが見てとれる。
10
- 12. 閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6
MAXDEPTH 比較回数 抽出件数 比較回数 抽出件数 比較回数 抽出件数 比較回数 抽出件数
1 4566 6 13299 11 33875 73 73620 93
2 75 6 220 10 572 73 1457 91
3 32 6 50 10 64 51 67 67
4 4 4 4 4 13 12 13 13
5.3 考察
SuffixFilter の再帰回数を増やせば増やすほど、比較回数が減り速度が向上することが分
かった。ただし、極端に回数を増やすとデータセットによっては抽出精度が大幅に下がる
ため、適切な値を調整して設定する必要がある。
今回使用したデータセットでは、再帰回数は2~3が適正値と判断できる。
6 考察とまとめ
大規模データ群の類似検索において、処理速度面での PPJoin+のアルゴリズムの優秀さが
確認できた。
また、SuffixFilter の再帰回数の調節により、抽出件数/処理時間の調節が行えることが
確認できた。再帰回数は、今回使用したデータセットでは2~3が適切な値であると確認
できた。
現在、筆者の関わっているシステムにて SSJoin のアプローチによる大規模データの類似
検索を実施しているが、SSJoin に比べて処理速度面の優秀さが際立っているため、段階的
に PPJoin+アルゴリズムに置き換えていこうと考えている。
今後は、類似手法のさらなるキャッチアップを行っていきたい。
また、今回については文章の比較でのみ確認を行っているが、画像データなど他データ形
式での確認も引き続き行っていきたい。
今回検証に使用した Java のプログラムコード、テストコード、ならびにデータセット群
は、参考資料として提示する。
7 参考文献・URL
[1] http://d.hatena.ne.jp/blanc_et_noir/20081013/1223830866 より画像引用
[2] http://www.cse.unsw.edu.au/~weiw/project/tutorial-simjoin-SEBD08.pdf
[3] Surajit Chaudhuri 「A Primitive Operator for Similarity Joins in Data Cleaning」
(2006)
http://research.microsoft.com/users/skaushi/ssjoin.pdf
[4] Roberto J. Bayardo 「Scaling Up All Pairs Similarity Search」(2007)
http://www.bayardo.org/ps/www2007.pdf
[5] Chuan Xiao「Efficient Similarity Joins for Near Duplicate Detection」(2008)
http://www2008.org/papers/pdf/p131-xiaoA.pdf
[6] http://www.cse.unsw.edu/~weiw/project/PPJoin-UTS-Oct-2008.pdf より画像引用
[7] 「Prefix Filter の検証」 http://www.slideshare.net/moaikids/prefix-filter-1126120
12