大規模テキスト索引( suffix array) の構築法とその情報検索への応用 suffix...
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 PresentationTRANSCRIPT
大規模テキスト索引( 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.