大規模テキスト索引( suffix array )の構築法とその情報検索への応
用
suffix array構築アルゴリズムと実装
定兼 邦彦東京大学理学系研究科
情報科学専攻
2
内容• suffix array( 接尾辞配列 ) とは• 関連研究
– Bentley, Sedgewick 97– Manber, Myers 93
• Larsson, Sadakane のアルゴリズム– 計算量– 実装– メモリ
• disk 上での構成アルゴリズム• Application (proximity search)
3
記号の説明
• X = X[0..n] 文字列• Sj j 番目の接尾辞 (suffix) X[j..n]
• I [0..n] 接尾辞の添字 j の配列
X = BANaNa
S1
S2
S0
4
suffix array
X
0 BANaNa1 ANaNa2 NaNa3 aNa4 Na5 a
ソート
I1 ANaNa0 BANaNa4 Na2 NaNa5 a3 aNa
suffix array
・文字列の全ての suffix のポインタを辞書順にソートした配列
・省スペース ( 文字列自身と配列1つ )
5
suffix array の特徴
• 省スペース ( 文字列自身と配列1つ )
• 任意の部分文字列の検索が可能– O(|P|log n) 時間– 補助配列を使うと O(|P|+log n) 時間
• 答えの列挙が簡単
6
関連研究
• Bentley, Sedgewick 97
• Manber, Myers 93
7
Bentley, Sedgewick
• quick sort の拡張 (<, =, > に分ける )
• 実際に高速• 冗長な文字列で極端に遅くなる
– O(n2) 時間
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$
9
Manber, Myers
• doubling technique を用いる• Radix ソート• O(n log n) 時間• 実際は遅い
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
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
12
Manber, Myers の問題点
• 各反復で全ての要素を見る– O ( n log 最大反復長 )– 後のほうのパスでは無駄が多い– すでにソートされている部分をスキップする
• 配列 1 つで Radix ソートを行うために遅くなっている– in-place のソートを使う (quick sort など )
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
14
Larsson, Sadakane の方法
• 2つの方法を組合わせる– Bentley, Sedgewick– doubling technique
15
実験結果
時間 (s)
0
1000
2000
3000
4000
5000
6000
7000
LarssonSadakane
B&S M&M Kurtz
新聞記事 (109M)特許 (89M)
Reuters (27M)html (125M)
Ultra60 ( メモリ 2GB)
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
17
計算量
• O(n log n) 時間• 木の根から各葉へのパス上に
– <, > に対応する枝の数 log2 n +1 以下
– = に対応する枝の数 log2 n +1 以下– 1 回の分割は線形時間
18
比較回数の期待値
• = に対応する枝の数は平均的には少ない
• 以下 (H は文字列のエントロピー )
• Bentley, Sedgewick では 以下
H
n22
loglog2
H
n2log2
19
実装 ( 基本 )
• 配列• アルゴリズム• 配列の更新方法
20
配列
• X[0..n] 文字列• I [0..n] 接尾辞の添え字の配列• V[ j ] 接尾辞 j の先頭 h 文字につける番
号 = j を含むグループの左端の添え字 i
• L[ i ] 辞書順で i 番目の接尾辞から始まるグループのサイズ
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 に戻る
22
$beo
rbe$
eor
ne$
not
t obe
o orn
o ott
o obe
$rno
t tob
e tto
b tob
e
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)
23
$beo
rbe$
eor
ne$
not
t obe
o orn
o ott
oobe
$rno
t tob
e tto
btob
e
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)
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)
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)
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
27
実装 ( 改良 )
• 1 パス化– I, V, L の更新を一度に行う
• L ( グループのサイズの配列 ) を消去– V で L を表す
28
1 パス化
• I を並び替える際に V を更新– <, =, > に分割– > を再帰的にソート– = の V を更新– < を再帰的にソート
• 更新の順番が重要– V は常に大きくなるので < を先に更新す
ると順序が狂う
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
30
L の消去
• V[ j ] = j を含むグループの左端の添え字 i
• <, =, > の順に V を更新• スキップするグループのサイズは I に格納
– スキップされる接尾辞の I は使われない• 最後に V から I を復元
– I[V[ j ]] = j
j を含むグループの右端の添え字 i
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
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 を次のグループの先頭に
}
}
33
メモリ
• 必要なメモリ• ディスク上での構成
34
必要メモリ
• Bentley, Sedgewick 5n (8n)
• Manber, Myers 8n
• Larsson, Sadakane 8n
• Kurtz >13n
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: ページサイズ )
36
Doubling technique + discarding
• doubling technique
• 回の反復• M/B-way マージソートを用いる
メモリ内と異なる点• すでにソートされている部分はスキッ
プ
n2log
37
現実的な方法
• 文字列を分割• メモリ内で suffix array を作る• disk 上の suffix array にマージする
– メモリ内の suffix を辞書順に disk 上に挿入• disk 上の文字列がメモリに入るなら速
い
38
さらなる高速化
• 伊東の方法 [2] と組み合わせる– suffix を 2種類に分割– 片方を Bentley, Sedgewick などでソート–もう片方は Radix ソート
39
Application (proximity search)
• 指定したキーワードが近くに現れている場所を見つける
• 検索結果を絞れる• 近くに現れている 関連がある
– 「今井」 +「ホームページ」 +「東京」– 「 samba」 +「 98」
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.