Weitere ähnliche Inhalte Ähnlich wie 転置インデックスとTop k-query (20) 転置インデックスとTop k-query2. 今回の話の概要
転置インデックスに対してdisjunctiveなクエ
リで問い合わせを行った際に上位k件を取っ
てくるためのDAAT(Document-at-a-time)
ベースの効率的な手法について紹介する
3. ようするに
大規模な文章セットに対する”watch OR iwc
OR rolex”というクエリに関連度の高い文章
を高速に持ってきたい
5. 転置インデックスとは
単語がどの文章に出現するかを格納した索引
構造
例えば下の構造から”iwc”が含まれる文章は文章1,5
の2つであることが分かる
また単語に紐づいてるリストを転置リストと呼ぶ
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
6. 転置インデックスの利点
全体の文章に対してはるかに少ない量のリ
ストを見るだけでよい
例えば英語版Wikipediaの記事は約397万あるが、
そのうちiwcが含まれる記事は284件
ANDやORなどの論理演算が含まれるクエリ
と相性が良い
7. 代表的なクエリのタイプ
AND検索 (Conjunctive query)
クエリ������ = (������1 , … , ������������ )が与えられた時に全ての������������
が含まれる文章を返す
例 : ������ = (������������������������ℎ, ������������������, ������������������������������)ならば”watch”, “iwc”,
“rolex”全てが含まれる文章を返す
OR検索 (Disjunctive query)
クエリ������ = (������1 , … , ������������ )が与えられた時に������������ のいず
れかが含まれる文章を返す
例 : ������ = (������������������������ℎ, ������������������, ������������������������������)ならば”watch”, “iwc”,
“rolex”いずれかが含まれる文章を返す
9. ORクエリが有用な例
クエリ拡張
代表的な検索エンジンで”algorithm”と検索する
と”アルゴリズム”が含まれる記事もヒットしたり
する
このようにシノニムなどが含まれる記事もヒッ
トするようにしたい場合はORクエリが使われる
○ この場合は”algorithm” OR “アルゴリズム”などのよ
うになる
○ *検索エンジンの中の人ではないので本当にこうし
てるかは知りません
10. ORクエリが有用な例
類似検索
表示されてる文章から類似の文章を検索する
ex : コンテンツ連動型広告、関連文表示
文章中の単語が全部含まれてるというのはあり
えないので、ANDクエリでは文章がヒットしな
い
14. TAATの例
例として”iwc OR rolex OR watch”というクエリ
を考える
初めに空のアキュムレータを作成する
accumulator = {}
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
15. TAATの例
iwcに関する転置リストをaccumulatorに入
れる
accumulator = {1,5}
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
16. TAATの例
rolexに関する転置リストをaccumulatorと
マージする
accumulator = {1,2,3,5}
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
17. TAATの例
watchに関する転置リストをaccumulatorと
マージする
accumulator = {1,2,3,4,5}
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
18. TAATの例
結果文章1,2,3,4,5がクエリに適合すること
が分かる
accumulator = {1,2,3,4,5}
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
21. DAATの例
各単語の転置インデックスの先頭にカーソ
ルを設定する
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
22. DAATの例
カーソル上の文章番号の最も小さい文章を
処理する
この場合は1
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
23. DAATの例
カーソルを次に進める
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
24. DAATの例
カーソル上の文章番号の最も小さい文章を
処理する
この場合は2
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
25. DAATの例
カーソルを次に進める
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
26. DAATの例
カーソル上の文章番号の最も小さい文章を
処理する
この場合は3
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
27. DAATの例
カーソルを次に進める
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
28. DAATの例
カーソル上の文章番号の最も小さい文章を
処理する
この場合は4
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
29. DAATの例
カーソルを次に進める
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
30. DAATの例
カーソル上の文章番号の最も小さい文章を
処理する
この場合は5
iwc 1 5
rolex 2 3 5
watch 1 2 4 5
32. DAATのメリット・デメリット
文章番号の小さい順に処理をするところは
Priority Queueというデータ構造を使うと効率
的に処理できる
例えばLuceneのorg.apache.lucene.search.
DisjunctionSumScorerの実装が参考になる
アキュムレータを持つ必要がない
文章ごとに処理していくので、フィルタ処理な
どとの相性が良い
例えば値段が50万円以下のもののみ出力する、メン
ズ用品のみ出力するなど
Luceneの実装もDAATになっている
ファイルへのランダムアクセスが多い
34. OR検索をどうやって高速化するか
単純にORでマッチする全部を取る必要があ
る場合は候補数が多い時にどうやっても処
理に時間を要する
しかし、検索結果の上位数件だけ必要であ
れば上位に来る可能性がない文章の評価を
スキップすることにより、処理の高速化が
可能となる
このような問い合わせに対して上位k件のみ
取り出すことをtop-k query processingと呼
ぶ
35. 文章のランク付け
上位k件を出力するためには、クエリに対して
どの文章の順位が高いかを決定する必要がある
どういった文章が適合してるかを考えてみる
例えば“watch”のみ含まれる文章では置時計や動詞の
watchが含まれる文章もヒットし、また数も大量にあ
るため、”iwc”のみが含まれる文章の方が関連性が高
いと考えられる
また”iwc”のみ含まれるページより”iwc”と”rolex”を含
むページの方が関連性が高い
“iwc”を1回含む文章よりも2回含む文章の方が関連度
が高い
36. 文章のランク付け
クエリ������ = (������1 , … , ������������ )に対して、文章������のス
コアを������������������������������ ������, ������ = ������ ������������������������������(������������ , ������)の形で
表す
������������������������������(������������ , ������)は文章における������������ の出現頻度、
������������ の珍しさなどが加味された値となる
またこの後の議論の都合上������������������������������ ������������ , ������ ≥ 0
を仮定する
この形のスコアリング関数にはTF-IDF,
BM25などの多くの代表的なものが含まれる
37. 転置インデックスの拡張
転置インデックスに対して、scoreの値およ
び各単語のscoreの最大値を付与する
図では(文章番号, スコア)という形式で書く
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,3) (5,1)
max_score=3
watch (1,1) (2,2) (4,1) (5,1)
max_score=2
39. max_score [H.R. Turtle and J. Flood, 1995]
今上位k位に入るための閾値が4だとすると
watchのみ含む文章はmax_score=2から絶対
に候補に入ることが無いことを利用する
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,3) (5,1)
max_score=3
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
41. max_scoreの例1
1位のスコアが6のため”watch”+”rolex”ではスコ
アが5にしかならないので、候補となる文章は
必ず”iwc”を含まなければならない
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,3) (5,1)
max_score=3
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
42. max_scoreの例1
”iwc”のカーソルを進める
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,3) (5,1)
max_score=3
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
43. max_scoreの例1
他の2つに関しては”iwc”を含まないものを評価しても意
味が無いので文章5まで飛ばす
実装上ここで効率的に飛ばすためには転置インデックスに100
個先までのポインタなどを持たせる必要がある
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,3) (5,1)
max_score=3
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
44. max_scoreの例1
文章5を評価してスコアが4であることを得
る
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,3) (5,1)
max_score=3
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
45. max_scoreの例1
全て見たので終了
処理の中で文章1,5のみを評価しており、2,3,4
の評価を飛ばせている
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,3) (5,1)
max_score=3
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
46. max_scoreの例2
上位1件のみ取ることを考える
ただ前のとスコアの設定が違う
最初の文章1を評価するとスコアは6になる
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
47. max_scoreの例2
1位のスコアが6のため”watch”のみではスコア
が2にしかならないので、候補となる文章は必
ず”iwc”か”rolex”を含まなければならない
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
48. max_scoreの例2
“iwc”のカーソルを進める
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
49. max_scoreの例2
“watch”の方は文章2まで飛ばす
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
50. max_scoreの例2
文章2を評価してスコアが3であることを得
る
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
51. max_scoreの例2
“rolex”のカーソルを進める
“watch”の方は3以降に飛ばす
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
52. max_scoreの例2
文章3を評価して、スコアが5であることを
得る
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
53. max_scoreの例2
“rolex”のカーソルを進める
“watch”の方は5以降に飛ばす
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
54. max_scoreの例2
文章5を評価してスコアが4であることを得
る
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
55. max_scoreの例2
一連の流れで文章1,2,3,5の評価を行なって
いる
iwc (1,5) (5,2)
max_score=5
rolex (2,2) (3,5) (5,1)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
56. max_score 補足
今上げた2つの例では文章1が最も大きいス
コアになる例であったが、文章の途中のも
のが1番になった場合、閾値もそれにあわせ
て変化していく
例2では閾値が6のときに”iwc”と”rolex”を含
むの代わりに”iwc”と”watch”を含むとしても
良かったが、通常は転置リストの長いもの
もしくはスコアが低いものから候補から除
外していく
57. max_scoreの性能
例えば[M. Fontoura+, 2011] では約340万文
章、3GBの広告データに対して平均長57.76
のクエリ検索を行った場合
Naive DAAT 26778.3 μsec
DAAT max_score 9321.3 μsec
と2.8倍近い性能改善が報告されている
* この辺りの性能改善率に関しては検索エン
ジンの性能および文章の性質に強く依存す
る
58. topdocsの利用[T. Stohman+, 2005]
極端にスコアが大きい文章のみ別の転置インデックスに
分ける
実装によってはメタデータに格納することもある
下の例ではこれにより文章2より先は”iwc”もしくは”rolex_2”が
入った文章のみ評価すれば良いことが分かる
iwc (1,5) (5,2)
max_score=5
rolex_1 (2,2) (5,1)
max_score=2
rolex_2 (3,5)
max_score=5
watch (1,1) (2,1) (4,2) (5,1)
max_score=2
60. 閑話:
modernな転置インデックスの機能
多くの場合転置リストはブロックごとに圧
縮されて格納されている
例えば転置リストの内容が{1,3,6,8,15,16}で
あれば{1,3},{6,8},{15,16}と分けられており、
内部は圧縮されている
圧縮アルゴリズムはVbyte, Simple9,
PForDeltaなどがある.
例えば[H. Yan+, 2009]などが参考になる
61. ブロック圧縮された転置インデックス
に対する検索手法
ブロックは圧縮されているのでなるべく
decode処理を飛ばしたい
またデータをブロック単位で持ってるので
ブロックごとのスコアの最大値や最小値を
持つことができる
ブロック圧縮された転置インデックスに対
する検索手法はここ最近2件ほど独立に手法
が提案されている
[K. Chakrabarti+, 2011] [S. Ding and T. Suel,
2011]
今回は主に[K. Chakrabarti+, 2011]の紹介を行う
62. Interval-based pruning for top-k processing
over compressed lists
ここからは最近の研究である
K. Chakrabarti, S. Chaudhuri and V. Ganti :
Interval-based pruning for top-k processing over
compressed lists, ICDE, 2011
の紹介を行う
著者はMicrosoft Researchの研究者
63. モチベーション
k=1のとき、通常のmax_scoreを実行すると文章9
の時点でスコアが8になり、������1 の転置リストのみ
では1位に届かないのでブロックDは飛ばせる
一方で文章3を見た時にスコアが3になり、ブロッ
クBの最大値は2であるため本来はdecodeしなく
てもよいが通常のmax_scoreではここをdecodeし
てしまう
max_score=5
max_score=6
[K. Chakrabarti+, 2011]より
64. 提案手法
与えられたクエリに対するブロックから区
間を作成して、Upper boundが現在の閾値以
上の区間のみ評価する
[K. Chakrabarti+, 2011]より
65. 例
論文のFig1の例、数値は一部変えてある
A B C D E
(1,3) (3,3) (5,1) (8,1) (9,5) (11,2) (12,1) (14,2) (15,1) (16,1)
F
G
(1,2) (9,3) (15,6) (16,1)
66. 例
区間を生成して、取り得る最大のスコアを
計算する
区間 [1,3] (3,5) [5,8] (8,9] (9,11] (11,12] (12,14] (14,15) [15,16]
max
score
6 3 4 8 5 1 2 0 7
A B C D E
(1,3) (3,3) (5,1) (8,1) (9,5) (11,2) (12,1) (14,2) (15,1) (16,1)
F
G
(1,2) (9,3) (15,6) (16,1
67. 例
始めの区間に関して, max_scoreを実行する
このときブロックA,Fをデコードする
区間 [1,3] (3,5) [5,8] (8,9] (9,11] (11,12] (12,14] (14,15) [15,16]
max
score
6 3 4 8 5 1 2 0 7
A B C D E
(1,3) (3,3) (5,1) (8,1) (9,5) (11,2) (12,1) (14,2) (15,1) (16,1)
F
G
(1,2) (9,3) (15,6) (16,1
68. 例
一位のスコアが5となるので、続く2つの区
間は見なくてよい
ブロックBのデコードはスキップされる
区間 [1,3] (3,5) [5,8] (8,9] (9,11] (11,12] (12,14] (14,15) [15,16]
max
score
6 3 4 8 5 1 2 0 7
A B C D E
(1,3) (3,3) (5,1) (8,1) (9,5) (11,2) (12,1) (14,2) (15,1) (16,1)
F
G
(1,2) (9,3) (15,6) (16,1
69. 例
区間(8,9]を処理して、文章9のスコアが8で
あることを得る
このときブロックCがデコードされる
区間 [1,3] (3,5) [5,8] (8,9] (9,11] (11,12] (12,14] (14,15) [15,16]
max
score
6 3 4 8 5 1 2 0 7
A B C D E
(1,3) (3,3) (5,1) (8,1) (9,5) (11,2) (12,1) (14,2) (15,1) (16,1)
F
G
(1,2) (9,3) (15,6) (16,1
70. 例
残りは全てスキップできる
区間 [1,3] (3,5) [5,8] (8,9] (9,11] (11,12] (12,14] (14,15) [15,16]
max
score
6 3 4 8 5 1 2 0 7
A B C D E
(1,3) (3,3) (5,1) (8,1) (9,5) (11,2) (12,1) (14,2) (15,1) (16,1)
F
G
(1,2) (9,3) (15,6) (16,1
73. PruneScoreOrder
スコアが高い区間から順にアクセスする
下の例では最初の区間で最大値を得るので、残
りは全てスキップできる
区間 [1,3] (3,5) [5,8] (8,9] (9,11] (11,12] (12,14] (14,15) [15,16]
max
score
6 3 4 8 5 1 2 0 7
A B C D E
(1,3) (3,3) (5,1) (8,1) (9,5) (11,2) (12,1) (14,2) (15,1) (16,1)
F
G
(1,2) (9,3) (15,6) (16,1
74. PruneHybrid
PruneScoreOrderの欠点として、
ランダムアクセスが多く発生すること
同じ転置リストのブロックに何回もアクセスするこ
とがある
○ これに関して論文ではキャッシュを用意して、なるべ
くディスクから読む回数及びデコード回数を少なくす
るという工夫が成されている
これに対してPruneHybridでは上位x%の区間の
みPruneScoreOrderを実施し、そこで得た閾値
を元にPruneSeqを実施するというのが
PruneHybridである
x=0のときPruneSeqと一致し
x=100のときPruneScoreOrderと一致する
75. PruneLazy
転置リストのIOがランダムになることを防
ぐため
1. 一定量の区間のブロックをメモリに読み
込む
このときdecodeは行わない
2. 読み込んだ区間に関して、スコア順に区
間を処理していく
閾値によってはいくつかの読み込んだブロック
に関してはdecodeは飛ばされる
を繰り返す
76. 実験結果
TREC Terabyte (800万ページ)のデータセッ
トで実験
max_scoreに近い手法に比べて3-6倍の性能改善
[K. Chakrabarti+, 2011]より
78. WAND [A. Broder+, 2003]
転置リストを先頭の文章番号の順に並べて、
pivotとなるtermの文章番号より前にある転置リ
ストのカーソルを進める手法
今閾値が7であるとすると”rolex”のみでは閾値に届か
ないので”iwc”も必要になる. このため”rolex”のカーソ
ルを5以降に飛ばしてよいことが分かる
max_scoreだと”watch”の方を除外してしまうので文
章2,3を評価してしまう
rolex (1,1) (2,5) (3,1)
max_score=5
iwc (1,5) (5,2) pivot term
max_score=5
watch (1,1) (6,1) (7,2) (8,3)
max_score=3
79. WANDの変形
WANDの改良としては
メモリ上の実行に適したmWAND [M. Fontoura+,
2011]
ブロック情報を利用したBlock-max WAND (BMW)
[S. Ding and T. Suel, 2011]
がある
両論文とも割と読みやすい
80. Layered-index [T. Stohman and W. Croft, 2007]
スコアに応じて、転置リストを複数に分ける
クエリの評価はTAATベースで行い、スコアが高いリスト
から順にマージしていく
途中でこれ以上アキュムレータにないものを追加しても上位k件
に入らないときはアキュムレータ内のみで評価する. アキュム
レータ内のものでも上位k件に入る可能性の無いものを除外する
などの最適化が行われる
iwc_1 (1,8) max_score=8
rolex_1 (2,5) (4,6) max_score=6
rolex_2 (5,4) (6,4) max_score=4
iwc_2 (4,3) (5,2) max_score=3
rolex_3 (1,1) (3,1) max_score=1
81. まとめ
転置インデックスに対してdisjunctiveなクエ
リで問い合わせを行った際に上位k件を取っ
てくるためのDAAT(Document-at-a-time)
ベースの効率的な手法について述べた
この辺りの論文はquery-processingという
キーワードでSIGIRなどの情報検索系の会議
によく投稿される
82. 参考文献
情報検索の基本的な教科書
[S. Büttcher+ 2010] Information Retrieval: Implementing and Evaluating Search Engines,
MIT Press
Max-score
[H.R. Turtle and J. Flood, 1995] Query evaluation: strategies and optimization. Information
processing and management
[T. Stohman+, 2005] Optimization strategies for complex queries, SIGIR
[K. Chakrabarti+, 2011] Interval-based pruning for top-k processing over compressed lists,
ICDE
WAND
[A. Broder+, 2003] Efficient query evaluation using a two-level retrieval process, CIKM
[M. Fontoura+, 2011] Evaluation strategies for top-k queries over memory-resident inverted
indexes, VLDB
[S. Ding and T. Suel, 2011] Faster top-k document retrieval using block-max indexes, SIGIR
Layered Index
[V. N. Anh and A. Moffat, 2006] Pruned query evaluation using pre-computed impacts,
SIGIR
[T. Stohman and W. Croft, 2007] Efficient document retrieval in main memory, SIGIR
その他
[H.Yan+ 2009] Inverted index compression and query processing with optimized document
ordering, WWW
[G. Navarro and Y. Nekrich 2012] Top-k Document Retrieval in Optimal Time and Linear
Space, SODA