Transcript
Page 1: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

大規模テキスト索引( suffix array )の構築法とその情報検索への応

suffix array構築アルゴリズムと実装

定兼 邦彦東京大学理学系研究科

情報科学専攻

Page 2: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

2

内容• suffix array( 接尾辞配列 ) とは• 関連研究

– Bentley, Sedgewick 97– Manber, Myers 93

• Larsson, Sadakane のアルゴリズム– 計算量– 実装– メモリ

• disk 上での構成アルゴリズム• Application (proximity search)

Page 3: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

3

記号の説明

• X = X[0..n] 文字列• Sj j 番目の接尾辞 (suffix) X[j..n]

• I [0..n] 接尾辞の添字 j の配列

X = BANaNa

S1

S2

S0

Page 4: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

4

suffix array

X

0 BANaNa1 ANaNa2 NaNa3 aNa4 Na5 a

ソート

I1 ANaNa0 BANaNa4 Na2 NaNa5 a3 aNa

suffix array

・文字列の全ての suffix のポインタを辞書順にソートした配列

・省スペース ( 文字列自身と配列1つ )

Page 5: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

5

suffix array の特徴

• 省スペース ( 文字列自身と配列1つ )

• 任意の部分文字列の検索が可能– O(|P|log n) 時間– 補助配列を使うと O(|P|+log n) 時間

• 答えの列挙が簡単

Page 6: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

6

関連研究

• Bentley, Sedgewick 97

• Manber, Myers 93

Page 7: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

7

Bentley, Sedgewick

• quick sort の拡張 (<, =, > に分ける )

• 実際に高速• 冗長な文字列で極端に遅くなる

– O(n2) 時間

Page 8: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

8

t o b e o r n o t t o b e $

0 1 2 3 4 5 6 7 8 9101112

h=1

h=2

h=3

h=4

h=5

1 4 7 10

0 5 8 92 3 6 11 12

o6

3 12

2 11e

2 11b

6n

5r

0 8 9

5t

4

71 10r

7t

1 10b

3

12o

12$

2 11e

2

11o

11$ 1 10

e

1

10 o

10$

8

0 9o

8t

0 9b

0 9e

0

9 o

9$

Page 9: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

9

Manber, Myers

• doubling technique を用いる• Radix ソート• O(n log n) 時間• 実際は遅い

Page 10: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

10

11 11

doubling technique[Karp, Miller, Rosenberg 72]

• 長さ 1, 2, 4, 8, ... の部分文字列に番号を割り当てる

t o b e o r n o t t o b e $6 4 1 2 4 5 3 4 6 6 4 1 2 0

1 145 56 789 910 23

35 910 124

0

0

2 1 357 68 910 134 0

8

12 11

2 17 6

h=1

h=2

h=4

h=8

Page 11: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

11

Manber, Myers t o b e o r n o t t o b e $ 0 1 2 3 4 5 6 7 8 910111213

h=1

h=2

h=4

h=8

13 211 312 6 1 4 710 5 0 8 9 0 1 1 3 3 5 6 6 6 61011111113 21112 3 6 110 4 7 5 0 9 8 0 1 1 3 4 5 6 6 8 8101111131311 212 3 6 110 4 7 5 0 9 8 0 1 2 3 4 5 6 7 8 9101111131311 212 3 6 110 4 7 5 9 0 8 0 1 2 3 4 5 6 7 8 910111213

Page 12: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

12

Manber, Myers の問題点

• 各反復で全ての要素を見る– O ( n log 最大反復長 )– 後のほうのパスでは無駄が多い– すでにソートされている部分をスキップする

• 配列 1 つで Radix ソートを行うために遅くなっている– in-place のソートを使う (quick sort など )

Page 13: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

13

ソートされた部分のスキップ t o b e o r n o t t o b e $ 0 1 2 3 4 5 6 7 8 910111213

h=113 211 312 6 1 4 710 5 0 8 9 0 1 1 3 3 5 6 6 6 610111111

h=213 21112 3 6 110 4 7 5 0 9 8 1 1 3 4 6 6 8 8 111113

h=41311 212 3 6 110 4 7 5 0 9 8 1 2 6 7 8 9 1111

h=81311 212 3 6 110 4 7 5 9 0 8 1112

Page 14: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

14

Larsson, Sadakane の方法

• 2つの方法を組合わせる– Bentley, Sedgewick– doubling technique

Page 15: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

15

実験結果

時間 (s)

0

1000

2000

3000

4000

5000

6000

7000

LarssonSadakane

B&S M&M Kurtz

新聞記事 (109M)特許 (89M)

Reuters (27M)html (125M)

Ultra60 ( メモリ 2GB)

Page 16: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

16

h=4

21 76

1111

0 1 2 3 4 5 6 7 8 9101112

t o b e o r n o t t o b e $

8 0 9

71 10312

71 1010 111

1260

2 11

386

11

4h=2

2

118

11

0

1

104

103

10 9

h=1

1 4 7 10

0 5 8 92 3 6 11 12

o6

3 12

2 11e

2 11b

6n

5r 0 8 9

5 t

6 6 6 653 31 1 10 111111

4 81111

96 631 1 13

11 129

h=8

9 80

0

Page 17: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

17

計算量

• O(n log n) 時間• 木の根から各葉へのパス上に

– <, > に対応する枝の数 log2 n +1 以下

– = に対応する枝の数 log2 n +1 以下– 1 回の分割は線形時間

Page 18: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

18

比較回数の期待値

• = に対応する枝の数は平均的には少ない

• 以下 (H は文字列のエントロピー )

• Bentley, Sedgewick では 以下

H

n22

loglog2

H

n2log2

Page 19: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

19

実装 ( 基本 )

• 配列• アルゴリズム• 配列の更新方法

Page 20: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

20

配列

• X[0..n] 文字列• I [0..n] 接尾辞の添え字の配列• V[ j ] 接尾辞 j の先頭 h 文字につける番

号   = j を含むグループの左端の添え字 i

• L[ i ] 辞書順で i 番目の接尾辞から始まるグループのサイズ

Page 21: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

21

アルゴリズム

• 接尾辞を先頭の 1 文字でグループ分け• I, V, L の計算 , h=1

1 各グループの I[i] を V[I[i]+h] に従い並び替える2 V が隣と異なる場合はグループを分け , L を更新3 L を見て異なるグループに異なる V を書く4 隣り合うサイズ 1 のグループを一つにし , L を更

新5 サイズが 2 以上のグループがあれば

h := 2h として 1 に戻る

Page 22: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

22

$beo

rbe$

eor

ne$

not

t obe

o orn

o ott

o obe

$rno

t tob

e tto

b tob

tobeornottobe $

13 2 11 3 12 6 1 4 7 10 5 0 8 9I[i]

0 1 1 3 3 5 6 6 6 6 10 11 11 11V[I[i]]

3 3 6 0 1 10 11 1 6 11 6V[I[i]+1]

先頭の2文字でソート

I の並び替え (h=1)

Page 23: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

23

$beo

rbe$

eor

ne$

not

t obe

o orn

o ott

oobe

$rno

t tob

e tto

btob

0 5 101 1 3 4 6 6 8 9 11 11 13

tobeornottobe $

13 2 11 12 3 6 1 10 4 7 5 0 9 8I[i]

V[I[i]]

V[I[i]+2] 8 0 4 3 1 1

先頭の4文字でソート

I の並び替え (h=2)

Page 24: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

24

$beo

rbe$

eor

ne$

not

t obe

o orn

o ott

oobe

$rno

t tobeo

rtto

btobe

tobeornottobe $

0 5 101 2 3 4 6 7 8 9 11 11 13

13 11 2 12 3 6 10 1 4 7 5 0 9 8I[i]

V[I[i]]

V[I[i]+4] 8 0

先頭の8文字でソート

I の並び替え (h=4)

Page 25: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

25

tobeornottobe $

$beo

rbe$

eor

ne$

not

t obe

o orn

o ott

oobe

$rno

t tobeo

rtto

btobe

0 5 101 2 3 4 6 7 8 9 11 12 13

13 11 2 12 3 6 10 1 4 7 5 9 0 8I[i]

V[I[i]]

ソート終了

I の並び替え (h=8)

Page 26: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

26

L の更新X t o b e o r n o t t o b e $I 0 1 2 3 4 5 6 7 8 910111213

h=1L 1 2 2 1 4 1 3V 0 1 1 3 3 5 6 6 6 610111111

h=2L 1 2 -3 2 2 1 2 1V 0 1 1 3 4 5 6 6 8 810111113

h=4L-11 2 1V 0 1 2 3 4 5 6 7 8 910111113

h=8L-14V 0 1 2 3 4 5 6 7 8 910111213

Page 27: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

27

実装 ( 改良 )

• 1 パス化– I, V, L の更新を一度に行う

• L ( グループのサイズの配列 ) を消去– V で L を表す

Page 28: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

28

1 パス化

• I を並び替える際に V を更新– <, =, > に分割– > を再帰的にソート– = の V を更新– < を再帰的にソート

• 更新の順番が重要– V は常に大きくなるので < を先に更新す

ると順序が狂う

Page 29: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

29

h=4

21 76

1111

0 1 2 3 4 5 6 7 8 9101112

t o b e o r n o t t o b e $

7

11

1 101

3

126 0 9

8671 1010

4 811

h=210 9

2

118

11

0

1

104

103

h=1

1 4 7 10

0 5 8 92 3 6 11 12

o6

3 12

2 11e

2 11b

6n

5r 0 8 9

5 t

6 6 6 653 31 1 10 111111

4 81111

96 612

0

32 11

3

1 1 13

11 12 h=8

9 8

090

Page 30: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

30

L の消去

• V[ j ] = j を含むグループの左端の添え字 i

• <, =, > の順に V を更新• スキップするグループのサイズは I に格納

– スキップされる接尾辞の I は使われない• 最後に V から I を復元

– I[V[ j ]] = j

j を含むグループの右端の添え字 i

Page 31: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

31

t o b e o r n o t t o b e $ 0 1 2 3 4 5 6 7 8 910111213

h=1I-1 211 312-1 1 4 710-1 0 8 9V 0 2 2 4 4 5 9 9 9 910131313

h=2-1 211-3 110 4 7-1 0 9-1 0 2 2 3 4 5 7 7 9 910121213

h=4-11 0 9-1 0 1 2 3 4 5 6 7 8 910121213

h=8-14 0 1 2 3 4 5 6 7 8 910111213

Page 32: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

32

アルゴリズム ( 改良版 )各反復でi = 0

while (i n) {s = I[ i ]

if (s < 0) i = i - s // ソート済みグループをスキップ

else {ソート済みグループを連結I [i .. i+V[i] ] をソートi = i + V[i] + 1 // i を次のグループの先頭に

}

}

Page 33: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

33

メモリ

• 必要なメモリ• ディスク上での構成

Page 34: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

34

必要メモリ

• Bentley, Sedgewick 5n (8n)

• Manber, Myers 8n

• Larsson, Sadakane 8n

• Kurtz >13n

Page 35: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

35

Suffix array のディスク上での構成

• Gonnet, Baeza-Yates, Snider 92– disk は sequential access のみ

• Crauser, Ferragina 98– doubling algorithm + discarding

2

2

MB

nI/O

)(loglog /2 M

nn

B

nBM I/O

(M: メモリサイズ , B: ページサイズ )

Page 36: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

36

Doubling technique + discarding

• doubling technique

• 回の反復• M/B-way マージソートを用いる

メモリ内と異なる点• すでにソートされている部分はスキッ

n2log

Page 37: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

37

現実的な方法

• 文字列を分割• メモリ内で suffix array を作る• disk 上の suffix array にマージする

– メモリ内の suffix を辞書順に disk 上に挿入• disk 上の文字列がメモリに入るなら速

Page 38: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

38

さらなる高速化

• 伊東の方法 [2] と組み合わせる– suffix を 2種類に分割– 片方を Bentley, Sedgewick などでソート–もう片方は Radix ソート

Page 39: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

39

Application (proximity search)

• 指定したキーワードが近くに現れている場所を見つける

• 検索結果を絞れる• 近くに現れている 関連がある

– 「今井」 +「ホームページ」 +「東京」– 「 samba」 +「 98」

Page 40: 大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装

40

参考文献

[1] N. J. Larsson and K. Sadakane. Faster Suffix Sorting. Technical Report LU-CS-TR:99-214, LUNDFD6/(NFCS-3140)/1-20/(1999), Department of Computer Science, Lund University, Sweden, May 1999. http://www.cs.lth.se/home/Jesper_Larsson/

[2] 伊東秀夫 . 大規模テキストに対する Suffix Array の効率的な構成法 . SIGNL-129-5, IPSJ, January 1999.


Top Related