Pfiセミナー20131128
-
Upload
preferred-infrastructure-preferred-networks -
Category
Documents
-
view
1.662 -
download
5
Transcript of Pfiセミナー20131128
高速に文書を取得する- Document Listing -
PFI セミナー 11/28
株式会社 Preferred Infrastructure
西鳥羽 二郎
自己紹介
西鳥羽 二郎 PFI 内
SFBD プロジェクト エンジニア アライアンス担当 バイオプロジェクト エンジニア
Twitter ID: jnishi
検索システム
検索キーワードを入力
キーワードを含む文書を表示
全文検索
入力 D: 文書 q: クエリ
出力 文書 D 内で q が出現する
ポジション全て
アルゴリズム 転置インデックス N-gram Suffix Array
Position 情報から文書情報を復旧
PFIPFIPFI
PFI
PFI
PFI
PFI
クエリ : PFI
文書 1: 5, 文書 1: 20, 文書 1: 25,文書 2: 3, 文書 2: 40,文書 3: 8, 文書 3: 35
ヒットポジション
文書 1, 文書 2, 文書 3
ヒット文書
弊害
一文書あたりのヒット数が大きい時に効率が悪い ヒットポジションを全部出した上で文書を並び替えるのでヒットポ
ジションに比例する
ヒットポジション数による打ち切りを行うこともよくある
Document Listing とは
入力 文書集合 D={d1 , d2, d3, … dn}
クエリ q 出力
文書集合 {d| クエリ q が含まれている }
Position 情報を使わないことによる効率の良さ
Occurrence Position… ヒットポジション数に比例する O(pos)
Document Listing… ヒットドキュメント数に比例する O(occ)
文書内に含まれる単語数が多くなると差が大きくなる
Document Listing を解く必要なデータ構造
以下のデータ構造を用いることにより出現位置数によらず出現文書を取得できる Suffix Array : 文書の出現位置を求めることが可能なデータ構造 Document Array : 接尾辞が出現する文書番号を格納した配列 Wavelet Tree : 様々な文字列処理をデータ構造
Suffix Array
全接尾辞を辞書式順序でソートした結果
例abracadabra$ 11 $10 a$ 7 abra$ 0 abracadabra$ 3 acadabra$ 5 adabra$ 8 bra$ 1 bracadabra$ 4 cadabra$ 6 dabra$
0 abracadabra$ 1 bracadabra$ 2 racadabra$ 3 acadabra$ 4 cadabra$ 5 adabra$ 6 dabra$ 7 abra$
・・・dabra = dabra$
辞書式順序ソート
出現位置 ( 先頭位置からのオフセット )
例: dabra を検索する1. 配列 SA の大きさは 11 なので配列インデッ
クスの中心値 5 から検索2. SA[5] = 8 、この 8 は “ abracadabra” の
“ bra” の出現位置を指している
3. 検索クエリの "dabra" と "bra" を比較すると "dabra" の方が辞書式順で大きい
4. よって検索範囲は SA[5] から SA[11] の間に絞り込まれる
5. SA[5] と SA[11] の間 → SA[8] = 66. SA[8] = 6 の 6 は “ abracadabra” の
dabra に一致。よって dabra の出現位置は 6 と判明
Document Array
各文書をつなげた文字列 T = d1$d2$...$dm に対し Suffix Array SA
を構築 文書配列 D を次のように構築する
|DA| = |SA| T[i] = SA[i] (i=0,1,…|T|-1) が該当する文字が含まれる文書番号
例 d1 = mi ma ma, d2 = la ma la, d3 = me mi ma, d4 = la me me
1 2 3 4 5 6 7 8 9 10
11
12
13
14
15
16
T mi ma
ma
$ la ma
la $ me
mi ma
$ la me
me
$
SA $ $ $ $ la la la ma
ma
ma
ma
me
me
me
mi mi
SA 4 8 12 16 7 5 13 3 11 6 2 15 14 9 10 1
DA
1 2 3 4 2 2 4 1 3 2 1 4 4 3 3 1
Document Array から文書集合を取得する
Document Listing は Suffix Array にてクエリがヒットする範囲の文書配列上から ID を取得する問題と同じになる1 2 3 4 5 6 7 8 9 1
011
12
13
14
15
16
T mi ma
ma
$ la ma
la $ me
mi ma
$ la me
me
$
SA $ $ $ $ la la la ma
ma
ma
ma
me
me
me
mi mi
SA 4 8 12 16 7 5 13 3 11 6 2 15 14 9 10 1
DA
1 2 3 4 2 2 4 1 3 2 1 4 4 3 3 1クエリ : ma の場合13: la me me …3: ma $ la ma …11: ma $ la me …6: ma la …2: ma ma …15: me $
ma が含まれる文書 : 1,2,3
Wavelet Tree
Document Array 上のある範囲での異なる要素を抽出する 「それ Wavelet Tree でできるよ」 詳しくは Preferred Research ブログ「ウェーブレット木の世界」
http://research.preferred.jp/2013/01/wavelettree_world/
Wavelet Tree: 文字列に対して下記のものを含めた様々な処理を行うことができるデータ構造 rank select topk rangemaxk
Wavelet Tree: 構築法
dacabdabcbdc101001001011
aababb001011
dcdcdc101010
aaa bbb ccc ddd
0 1
0 1 0 1
{a, b} に 0 を割り当て、 {c, d} に 1 を割り当てる
{a, c} に 0 を割り当て、 {b, d} に 1 を割り当てる
Wavelet Tree: 子を辿る時
dacabdabcbdc101001001011
aababb001011
dcdcdc101010
aaa bbb ccc ddd
0 1
0 1 0 1
子を辿る時左 (0) の子の範囲 : 0 〜 rank0(n)-1右 (1) の子の範囲 : rank0(n) 〜 n
補足rank0(i) = 0 から i-1 番目までの i の出現回数を返すselect0(i) = i+1 番目の 0 の出現位置を返す
Wavelet Tree でできる操作
操作名 説明access(i) i 番目の要素を取得rankc(i) T[0..i) の中での c の出現数を返すselectc(i) i+1 番目の c の出現位置を返すrange_report(s,e,ci,cj)
T[s,e) の中での ci…cj の各文字の出現頻度を返す
topk(s,e,k) T[s,e) の中で出現数が大きい値を k 個返すrangemaxk(s,e,k) T[s,e) の中で値が大きい順に返すintersection(s,e,u,v)
T[s,e), T[u,v) で共通して出現する値を返す
ヒット文書の列挙
1. Suffix Array でクエリ q を含む範囲 [s, e) を求める2. Document Array で range_report(s, e, 1, m) を求める (m: 全
文書数 )1 2 3 4 5 6 7 8 9 10
11
12
13
14
15
16
T mi ma
ma
$ la ma
la $ me
mi ma
$ la me
me
$
SA $ $ $ $ la la la ma
ma
ma
ma
me
me
me
mi mi
SA 4 8 12 16 7 5 13 3 11 6 2 15 14 9 10 1
DA
1 2 3 4 2 2 4 1 3 2 1 4 4 3 3 1クエリ : ma の場合13: la me me …3: ma $ la ma …11: ma $ la me …6: ma la …2: ma ma …15: me $
ma が含まれる文書 : 1,2,3
range_report(s,e,1,m) = (1,2),(2,1),(3,1)計算量 : O(log m + docc log(m/docc))(docc: ヒット文書数 )
Wavelet Tree: range_report
range_report(s,e,m) 範囲内の子ノードを辿って行く 葉に到達したら該当する文字と範
囲の大きさを返す
dacabdabcbdc101001001011
aababb001011
dcdcdc101010
aaa bbb ccc ddd
0 1
0 1 0 1 rank05 〜 rank08
rank012+rank15 〜 rank08+rank18
Top-k による効率の良さ
文書配列と Wavelet Tree を組み合わせると上位 k 件の文書を多くの場合 O(k log m) の処理で求めることができる。 ( 最悪 O(docc
log m)) m… 全体の文書数 docc… ヒット文書数
検索結果の上位 k 件を表示することに対応
上位 k 件
1. Suffix Array でクエリ q を含む範囲 [s, e) を求める2. Document Array で topk(s, e, k) を求める (m: 全文書数 )
1 2 3 4 5 6 7 8 9 10
11
12
13
14
15
16
T mi ma
ma
$ la ma
la $ me
mi ma
$ la me
me
$
SA $ $ $ $ la la la ma
ma
ma
ma
me
me
me
mi mi
SA 4 8 12 16 7 5 13 3 11 6 2 15 14 9 10 1
DA
1 2 3 4 2 2 4 1 3 2 1 4 4 3 3 1クエリ : ma の場合13: la me me …3: ma $ la ma …11: ma $ la me …6: ma la …2: ma ma …15: me $
ma が含まれる文書 : 1,2,3
topk(s,e,2) = (1,2),(2,1)計算量 : O(k log(m))
Wavelet Tree: topk
topk (s,e,k) 範囲内の子ノードを辿っていく
その際に範囲が大きい子から辿っていく
葉ノードに行きついたら文字と範囲の大きさを返す
k 個結果を出力したら停止する
dacabdabcbdc101001001011
aababb001011
dcdcdc101010
aaa bbb ccc ddd
0 1
0 1 0 1
Intersection による効率の良さ
文書配列と Wavelet Tree の Intersection を用いると and 検索も可能
計算量 : O(k log(e1-s1+e2-s2+1)) k… 同時に検索するクエリの数
And クエリの検索結果
1. Suffix Array でクエリ q1 を含む範囲 [s1, e1) と q2 を含む範囲[s2,e2) を求める
2. Document Array で intersection(s1, e1, s2, e2) を求める (m:
全文書数 )1 2 3 4 5 6 7 8 9 10
11
12
13
14
15
16
T mi ma
ma
$ la ma
la $ me
mi ma
$ la me
me
$
SA $ $ $ $ la la la ma
ma
ma
ma
me
me
me
mi mi
SA 4 8 12 16 7 5 13 3 11 6 2 15 14 9 10 1
DA
1 2 3 4 2 2 4 1 3 2 1 4 4 3 3 1クエリ : ma の場合13: la me me …3: ma $ la ma …11: ma $ la me …6: ma la …2: ma ma …15: me $
ma が含まれる文書 : 1,2,3
intersection(s1,e1, s2, e2) = {1,3}計算量 : O(k log(e1-s1+e2-s2+1))
クエリ : mi の場合9: me mi…10: mi ma…1: mi ma …
mi が含まれる文書 : 1,3
Wavelet Tree: intersection
intersection(s1,e1,s2,e2) 2 つの範囲内の子ノードを同時に
辿って行く 子を辿る時にどちらかの領域で
文字が無くなったら探索を止める
葉に到達した段階で該当する文字を返す
dacabdabcbdc101001001011
aababb001011
dcdcdc101010
aaa bbb ccc ddd
0 1
0 1 0 1
最近の傾向 : compressed space
時間計算量 空間使用量Document Listing O(log1+εn) |CSA| + o(n)
Document Listing with Frequencies
O(log m log1+εn)m… 文書数
|CSA| + o(n)
Top-k Document O(log2 k log1+εn)
|CSA| + o(n)
Top-k Most Important Documents
O(log k log1+εn) |CSA| + o(n)
|CSA| … 文書配列を圧縮接尾辞配列で圧縮した時の使用領域
Compressed Suffix Array を用いて元文書よりも小さいインデックを用いて実現
まとめ
Document Listing 以下のデータ構造を用いて高速にヒット文書を抽出する方法
Suffix Array Document Array Wavelet Tree
上位だけ求める事もできる Top-K Most-Important k
最近では圧縮して元文書よりも小さなインデックスを用いて実現する方法が研究されている