pfiセミナー20131128

26
高高高高高高高高高高 - Document Listing - PFI 高高高高 11/28 高高高高 Preferred Infrastructure 高高 高高 西

Upload: preferred-infrastructure-preferred-networks

Post on 28-May-2015

1.662 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Pfiセミナー20131128

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

PFI セミナー 11/28

株式会社 Preferred Infrastructure

西鳥羽 二郎

Page 2: Pfiセミナー20131128

自己紹介

西鳥羽 二郎 PFI 内

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

Twitter ID: jnishi

Page 3: Pfiセミナー20131128

検索システム

検索キーワードを入力

キーワードを含む文書を表示

Page 4: Pfiセミナー20131128

全文検索

入力 D: 文書 q: クエリ

出力 文書 D 内で q が出現する

ポジション全て

アルゴリズム 転置インデックス N-gram Suffix Array

Page 5: Pfiセミナー20131128

Position 情報から文書情報を復旧

PFIPFIPFI

PFI

PFI

PFI

PFI

クエリ : PFI

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

ヒットポジション

文書 1, 文書 2, 文書 3

ヒット文書

Page 6: Pfiセミナー20131128

弊害

一文書あたりのヒット数が大きい時に効率が悪い ヒットポジションを全部出した上で文書を並び替えるのでヒットポ

ジションに比例する

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

Page 7: Pfiセミナー20131128

Document Listing とは

入力 文書集合 D={d1 , d2, d3, … dn}

クエリ q 出力

文書集合 {d| クエリ q が含まれている }

Page 8: Pfiセミナー20131128

Position 情報を使わないことによる効率の良さ

Occurrence Position… ヒットポジション数に比例する O(pos)

Document Listing… ヒットドキュメント数に比例する O(occ)

文書内に含まれる単語数が多くなると差が大きくなる

Page 9: Pfiセミナー20131128

Document Listing を解く必要なデータ構造

以下のデータ構造を用いることにより出現位置数によらず出現文書を取得できる Suffix Array : 文書の出現位置を求めることが可能なデータ構造 Document Array : 接尾辞が出現する文書番号を格納した配列 Wavelet Tree : 様々な文字列処理をデータ構造

Page 10: Pfiセミナー20131128

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 と判明

Page 11: Pfiセミナー20131128

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

Page 12: Pfiセミナー20131128

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

Page 13: Pfiセミナー20131128

Wavelet Tree

Document Array 上のある範囲での異なる要素を抽出する 「それ Wavelet Tree でできるよ」 詳しくは Preferred Research ブログ「ウェーブレット木の世界」

http://research.preferred.jp/2013/01/wavelettree_world/

Wavelet Tree: 文字列に対して下記のものを含めた様々な処理を行うことができるデータ構造 rank select topk rangemaxk

Page 14: Pfiセミナー20131128

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 を割り当てる

Page 15: Pfiセミナー20131128

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 の出現位置を返す

Page 16: Pfiセミナー20131128

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) で共通して出現する値を返す

Page 17: Pfiセミナー20131128

ヒット文書の列挙

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: ヒット文書数 )

Page 18: Pfiセミナー20131128

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

Page 19: Pfiセミナー20131128

Top-k による効率の良さ

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

log m)) m… 全体の文書数 docc… ヒット文書数

検索結果の上位 k 件を表示することに対応

Page 20: Pfiセミナー20131128

上位 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))

Page 21: Pfiセミナー20131128

Wavelet Tree: topk

topk (s,e,k) 範囲内の子ノードを辿っていく

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

葉ノードに行きついたら文字と範囲の大きさを返す

k 個結果を出力したら停止する

dacabdabcbdc101001001011

aababb001011

dcdcdc101010

aaa bbb ccc ddd

0 1

0 1 0 1

Page 22: Pfiセミナー20131128

Intersection による効率の良さ

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

計算量 : O(k log(e1-s1+e2-s2+1)) k… 同時に検索するクエリの数

Page 23: Pfiセミナー20131128

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

Page 24: Pfiセミナー20131128

Wavelet Tree: intersection

intersection(s1,e1,s2,e2) 2 つの範囲内の子ノードを同時に

辿って行く 子を辿る時にどちらかの領域で

文字が無くなったら探索を止める

葉に到達した段階で該当する文字を返す

dacabdabcbdc101001001011

aababb001011

dcdcdc101010

aaa bbb ccc ddd

0 1

0 1 0 1

Page 25: Pfiセミナー20131128

最近の傾向 : 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 を用いて元文書よりも小さいインデックを用いて実現

Page 26: Pfiセミナー20131128

まとめ

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

Suffix Array Document Array Wavelet Tree

上位だけ求める事もできる Top-K Most-Important k

最近では圧縮して元文書よりも小さなインデックスを用いて実現する方法が研究されている