12
PPJoin 研研研研 PPJoin+研研研 1

PP JoinならびにPP Join+の検証

Embed Size (px)

Citation preview

Page 1: PP JoinならびにPP Join+の検証

研究課題:PPJoin ならびに PPJoin+の検証

1

Page 2: PP JoinならびにPP Join+の検証

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

Page 3: PP JoinならびにPP Join+の検証

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 は数式で表すと、以下のような式で表現できる。

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 Filtering)した上で、共通データの出現位置(Positional Filtering)により一致度を判定する、という流れである。

[6]

具体的な数式・アルゴリズムとして、PPJoin の論文中に記載されている擬似コードを引用する。

3

Page 4: PP JoinならびにPP Join+の検証

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) = 8ubound = 1 + min(10 – 1 , 8 – 0) = 9

4

Page 5: PP JoinならびにPP Join+の検証

α は、2データ間で閾値を満たす類似度の下限、ubound は同一データ出現位置から計算される類似度値の上限を意味している。α より ubound の値が小さい場合は、2データは類似データとみなされない。

擬似コードの中では、α 値より ubound 値の方が大きい場合、配列 A[y]に数値を加算するロジックになっている。A[y]について値が 0 のものは Verify の対象とならないため、結果として α 値の方が ubound 値よりも大きい場合、そのデータについては類似データとして扱われないことになる。

各データ群の評価終了後、Verify関数により類似度を算出し、類似データの抽出を実施する。Verify関数内の処理については、論文中の擬似コードを引用する。

Verify内では基本的に、データ群 x とデータ群 y の Overlap 係数を算出し、類似度が α値より高い場合に類似データと判定している。Overlap 係数は以下のように定義される。

3.2.3 PPJoin+のアルゴリズムPPJoin はデータの先頭部分のみを評価するアルゴリズムであったが、PPJoin+では先頭部分に加えて、データ後方から再帰的にポジションを移動しデータのふるい分けを行うアルゴリズムとなっている。

論文から擬似コードを引用する。

5

Page 6: PP JoinならびにPP Join+の検証

こちらのアルゴリズムを、先の「Algorithm 1」の12行目(A[y] ← A[y] + 1)と置き換える。

Hmax はデータ x,y のそれぞれデータ長と、同一データの出現位置(i,j)、類似度の閾値 tの値より推測される、データ群間のハミング距離の最大値である。Hmax と、SuffixFilter により算出した実際のハミング距離を比較し、Hmax よりもハミング距離の値が小さい(距離が近い)場合に類似データの候補として扱う、という流れの処理となっている。

Suffix Filter のアルゴリズムは以下のようになっている。

6

Page 7: PP JoinならびにPP Join+の検証

まず、データ 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

Page 8: PP JoinならびにPP Join+の検証

データ件数文字列長がまちまちで、データ群中に類似文章が含まれる文章データ群。 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:PPJoin303.6 11 863.4 21 2927.8 29 6258.

829

C:PPJoin+ 70 11 110.4 20 227 27 481.6 27

8

Page 9: PP JoinならびにPP Join+の検証

○データ件数: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:PPJoin537.4 8 1917.8 14 5647.4 18 1407

518

C:PPJoin+ 100.3 6 182.8 9 375.4 12 941.8 12

○データ件数:2,000件閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6

処理時間(ms)

抽出件数 処理時間(ms)

抽出件数 処理時間(ms)

抽出件数 処理時間(ms)

抽出件数

A:SSJoin26888 4 27759.

512 27534 65 28583.

578

B:PPJoin9258.6 6 19448.

211 44745.

473 1257

2293

C:PPJoin+ 454.8 6 793.6 10 2176.6 51 5142.4 67

9

Page 10: PP JoinならびにPP Join+の検証

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

Page 11: PP JoinならびにPP Join+の検証

の順番で多くなっていることが見てとれる。件数が少ないほど、ふるい分けの際に取りこぼしているデータが多いと思われるが、その分速度の向上に繋がっている要素もあるため、アルゴリズムの選択は用途に応じて判断をするのが良いと思われる。

なお、PPJoin+については、SuffixFilter の再帰回数の設定値変更により、速度/抽出件数のチューニングが可能である。次項では、PPJoin+の再帰回数のチューニングにより、結果がどのように変化をするか、見ていきたいと思う。

5 チューニングPPJoin+の SuffixFilter の再帰回数を調節することで、どのような結果が出るか測定を行った。

5.1 条件以下の条件で性能測定を実施し、Overlap 係数の比較回数と類似データの抽出件数にどのような変化があらわれたか確認をした。なお、特記していない条件については、前項「4.性能測定」で実施した条件と同じ条件で実施している。

アルゴリズム C:PPJoin+

SuffixFilter の再帰回数 1 ※アルゴリズム的に PPjoin と同等になる。 2 3 ※結果は「4.性能測定」の実施結果と同等 4

5.2 結果以下のような結果となった。○データ件数:500件

閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6MAXDEPTH

比較回数 抽出件数 比較回数 抽出件数 比較回数 抽出件数 比較回数 抽出件数

1 242 11 723 21 1859 29 4275 292 30 11 35 21 50 29 97 293 25 11 35 21 50 29 97 294 17 10 22 19 22 22 22 22

○データ件数:1000件閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6

MAXDEPTH

比較回数 抽出件数 比較回数 抽出件数 比較回数 抽出件数 比較回数 抽出件数

1 547 8 1706 14 4504 18 10568 182 18 7 33 10 82 12 190 133 11 6 12 9 12 12 12 124 4 4 4 4 4 4 4 4

11

Page 12: PP JoinならびにPP Join+の検証

○データ件数:2000件閾値:0.9 閾値:0.8 閾値:0.7 閾値:0.6

MAXDEPTH

比較回数 抽出件数 比較回数 抽出件数 比較回数 抽出件数 比較回数 抽出件数

1 4566 6 13299 11 33875 73 73620 932 75 6 220 10 572 73 1457 913 32 6 50 10 64 51 67 674 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 より画像引用

12

Page 13: PP JoinならびにPP Join+の検証

[7] 「 Prefix Filter の 検 証 」 http://www.slideshare.net/moaikids/prefix-filter- 1126120

13