Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PFIセミナー 11/28

高速に文書を取得する
- Document Listing -

株式会社 Preferred Infrastructure
西鳥羽 二郎
自己紹介



西鳥羽 二郎
PFI内





SFBDプロジェクト エンジニア アライアンス担当
バイオプロジェクト エンジニア

Twitter ID: jnishi
検索システム

検索キーワードを入力

キーワードを
含む文書を表示
全文検索


入力





D: 文書
q: クエリ

出力


文書D内でqが出現するポ
ジション全て



アルゴリズム




転置インデックス
N-gram
Suffix Array
Position情報から文書情報を復旧
クエリ: PFI

PFI

PFI

ヒットポジション
PFI

文書1: 5, 文書1: 20, 文書1: 25,
文書2: 3, 文書2: 40,
文書3: 8, 文書3: 35

PFI
PFI
...
弊害


一文書あたりのヒット数が大きい時に効率が悪い


ヒットポジションを全部出した上で文書を並び替えるのでヒットポ
ジションに比例する



ヒットポジション数による打ち切りを行うこともよくある
Document Listingとは


入力





文書集合D={d1 , d2, d3, … dn}
クエリq

出力


文書集合 {d| クエリqが含まれている}
Position情報を使わないことによる効率の良さ


Occurrence Position…ヒットポジション数に比例する




Document Listing…ヒットドキュメント数に比例する




O(pos)
O(occ)...
Document Listingを解く必要なデータ構造


以下のデータ構造を用いることにより出現位置数によらず出現文書
を取得できる


Suffix Array : 文書の出現位置を求めることが可能なデータ構造



Document...
Suffix Array


全接尾辞を辞書式順序でソートした結果
例 abracadabra$
0 abracadabra$
1 bracadabra$
2 racadabra$
3 acadabra$
辞書式
4 cadabra$
順序
...
Document Array




各文書をつなげた文字列 T = d1$d2$...$dmに対しSuffix Array SAを構
築
文書配列Dを次のように構築する





|DA| = |SA|
T[i] = SA[i] (...
Document Arrayから文書集合を取得する


Document ListingはSuffix Arrayにてクエリがヒットする範囲の文書
配列上からIDを取得する問題と同じになる
1

2

3

4

5

6

7

8

9
...
Wavelet Tree


Document Array上のある範囲での異なる要素を抽出する


「それ Wavelet Tree でできるよ」



詳しくはPreferred Researchブログ「ウェーブレット木の世界」
htt...
Wavelet Tree: 構築法
dacabdabcbdc
101001001011
0

{a, b}に0を割り当て、{c, d}に1を割り当てる

1

aababb
001011

dcdcdc
101010

0

0

1

aaa...
Wavelet Tree: 子を辿る時
子を辿る時
左(0)の子の範囲: 0〜rank0(n)-1
右(1)の子の範囲: rank0(n)〜n

dacabdabcbdc
101001001011
0

1

aababb
001011

dc...
Wavelet Treeでできる操作
操作名

説明

access(i)

i番目の要素を取得

rankc(i)

T[0..i)の中でのcの出現数を返す

selectc(i)

i+1番目のcの出現位置を返す

range_report...
ヒット文書の列挙
1.
2.

Suffix Arrayでクエリqを含む範囲[s, e)を求める
Document Arrayでrange_report(s, e, 1, m)を求める(m: 全文書数)
1

2

3

4

5

6

7
...
Wavelet Tree: range_report


dacabdabcbdc
101001001011
0



1

0

0

ccc

葉に到達したら該当する文字と範
囲の大きさを返す

dcdcdc
101010

aaa b...
Top-k による効率の良さ


文書配列とWavelet Treeを組み合わせると上位k件の文書を多くの
場合O(k log m)の処理で求めることができる。(最悪O(docc log m))





m…全体の文書数
docc…ヒ...
上位k件
1.
2.

Suffix Arrayでクエリqを含む範囲[s, e)を求める
Document Arrayでtopk(s, e, k)を求める(m: 全文書数)
1

2

3

4

5

6

7

8

9

10

11

...
Wavelet Tree: topk


dacabdabcbdc
101001001011
0



1

0

0

ccc

その際に範囲が大きい子から
辿っていく

dcdcdc
101010

aaa bbb

範囲内の子ノードを...
Intersection による効率の良さ


文書配列とWavelet TreeのIntersectionを用いるとand検索も可能



計算量: O(k log(e1-s1+e2-s2+1))


k…同時に検索するクエリの数
Andクエリの検索結果
1.

2.

T

Suffix Arrayでクエリq1を含む範囲[s1, e1)とq2を含む範囲[s2,e2)を
求める
Document Arrayでintersection(s1, e1, s2, e2)を求める...
Wavelet Tree: intersection


dacabdabcbdc
101001001011
0

intersection(s1,e1,s2,e2)


2つの範囲内の子ノードを同時に
辿って行く

1



aabab...
最近の傾向: compressed space
Compressed Suffix Arrayを用いて元文書よりも小さいインデックを用いて実現

時間計算量
Document Listing
O(log1+εn)
Document Listin...
まとめ


Document Listing


以下のデータ構造を用いて高速にヒット文書を抽出する方法



Document Array





Suffix Array
Wavelet Tree

上位だけ求める事もできる
...
Upcoming SlideShare
Loading in …5
×

Pfiセミナー20131128

3,264 views

Published on

Pfiセミナー20131128

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

×