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

40
大大大大大大大大大suffix array 大大大大大大大大大大大大大大 suffix array 大大大大大大大大大大大 大大 大大 大大大大大大大大大大 大大大大大大

Upload: kiley

Post on 13-Jan-2016

86 views

Category:

Documents


0 download

DESCRIPTION

大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix array 構築アルゴリズムと実装. 定兼 邦彦 東京大学理学系研究科 情報科学専攻. 内容. suffix array( 接尾辞配列)とは 関連研究 Bentley, Sedgewick 97 Manber, Myers 93 Larsson, Sadakane のアルゴリズム 計算量 実装 メモリ disk 上での構成アルゴリズム Application (proximity search ). 記号の説明. X = X [0.. n ] 文字列 - PowerPoint PPT Presentation

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.