SlideShare una empresa de Scribd logo
1 de 26
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
PFI
PFI

ヒット文書

文書1, 文書2, 文書3
弊害


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

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



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

入力





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

出力


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

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



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



O(pos)
O(occ)

文書内に含まれる単語数が多くなると差が大きくなる
Document Listingを解く必要なデータ構造


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

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



Document Array : 接尾辞が出現する文書番号を格納した配列



Wavelet Tree : 様々な文字列処理をデータ構造
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$
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
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 $
Wavelet Tree


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

「それ Wavelet Tree でできるよ」



詳しくはPreferred Researchブログ「ウェーブレット木の世界」
http://research.preferred.jp/2013/01/wavelettree_world/



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

rank



select



topk



rangemaxk
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を割り当てる
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の出現位置を返す
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.
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: ヒット文書数)
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
Top-k による効率の良さ


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



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

検索結果の上位k件を表示することに対応
上位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))
Wavelet Tree: topk


dacabdabcbdc
101001001011
0



1

0

0

ccc

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

dcdcdc
101010

aaa bbb

範囲内の子ノードを辿っていく


aababb
001011
1

topk (s,e,k)

1

ddd



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



k個結果を出力したら停止する
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)を求める(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))
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

子を辿る時にどちらかの領域で
る



葉に到達した段階で該当する文字
を返す
最近の傾向: 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| … 文書配列を圧縮接尾辞配列で圧縮した時の使用領域
まとめ


Document Listing


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

Document Array





Suffix Array
Wavelet Tree

上位だけ求める事もできる





Top-K
Most-Important k

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

Más contenido relacionado

La actualidad más candente

La actualidad más candente (6)

R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミング
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 
Functional Way
Functional WayFunctional Way
Functional Way
 
Tokyo r50 beginner_2
Tokyo r50 beginner_2Tokyo r50 beginner_2
Tokyo r50 beginner_2
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
 

Similar a Pfiセミナー20131128

勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
Kazuki Nakajima
 

Similar a Pfiセミナー20131128 (7)

R言語勉強会#4.pdf
R言語勉強会#4.pdfR言語勉強会#4.pdf
R言語勉強会#4.pdf
 
Gura プログラミング言語の紹介
Gura プログラミング言語の紹介Gura プログラミング言語の紹介
Gura プログラミング言語の紹介
 
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
 
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
データ入力が終わってから分析前にすること
データ入力が終わってから分析前にすることデータ入力が終わってから分析前にすること
データ入力が終わってから分析前にすること
 
魂のコーディング
魂のコーディング魂のコーディング
魂のコーディング
 

Más de Preferred Networks

Más de Preferred Networks (20)

PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
 
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
 
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
 
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
 
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
 
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
 
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
 
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
 
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
 
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
 
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
 
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
 
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語るKubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
 
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
 
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
 
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
 
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
 
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
 

Pfiセミナー20131128