SlideShare uma empresa Scribd logo
1 de 82
Baixar para ler offline
坪坂正志
mail : m.tsubosaka(at)gmail(dot)com
今回の話の概要
   転置インデックスに対してdisjunctiveなクエ
    リで問い合わせを行った際に上位k件を取っ
    てくるためのDAAT(Document-at-a-time)
    ベースの効率的な手法について紹介する
ようするに
   大規模な文章セットに対する”watch OR iwc
    OR rolex”というクエリに関連度の高い文章
    を高速に持ってきたい
話の流れ
 転置インデックスについて
 TAAT, DAAT
 Top-k Query
     max-score
     inteval-based prunning
     other method
      ○ wand
      ○ layered-index
転置インデックスとは
   単語がどの文章に出現するかを格納した索引
    構造
     例えば下の構造から”iwc”が含まれる文章は文章1,5
      の2つであることが分かる
     また単語に紐づいてるリストを転置リストと呼ぶ

     iwc     1   5


    rolex    2   3   5


    watch    1   2   4   5
転置インデックスの利点
   全体の文章に対してはるかに少ない量のリ
    ストを見るだけでよい
     例えば英語版Wikipediaの記事は約397万あるが、
     そのうちiwcが含まれる記事は284件
   ANDやORなどの論理演算が含まれるクエリ
    と相性が良い
代表的なクエリのタイプ
   AND検索 (Conjunctive query)
     クエリ������ = (������1 , … , ������������ )が与えられた時に全ての������������
      が含まれる文章を返す
     例 : ������ = (������������������������ℎ, ������������������, ������������������������������)ならば”watch”, “iwc”,
      “rolex”全てが含まれる文章を返す
   OR検索 (Disjunctive query)
     クエリ������ = (������1 , … , ������������ )が与えられた時に������������ のいず
      れかが含まれる文章を返す
     例 : ������ = (������������������������ℎ, ������������������, ������������������������������)ならば”watch”, “iwc”,
      “rolex”いずれかが含まれる文章を返す
ANDクエリとORクエリ
 一般にANDクエリとORクエリの場合ANDク
  エリの方が高速
 また、簡単な絞り込み用途としての検索エ
  ンジンであればANDクエリのみで十分なこ
  とが多い
 一方でORクエリが有用なケースも多い
ORクエリが有用な例
   クエリ拡張
     代表的な検索エンジンで”algorithm”と検索する
      と”アルゴリズム”が含まれる記事もヒットしたり
      する
     このようにシノニムなどが含まれる記事もヒッ
      トするようにしたい場合はORクエリが使われる
     ○ この場合は”algorithm” OR “アルゴリズム”などのよ
       うになる
     ○ *検索エンジンの中の人ではないので本当にこうし
       てるかは知りません
ORクエリが有用な例
   類似検索
     表示されてる文章から類似の文章を検索する
     ex : コンテンツ連動型広告、関連文表示
     文章中の単語が全部含まれてるというのはあり
    えないので、ANDクエリでは文章がヒットしな
    い
話の流れ
 転置インデックスについて
 TAAT, DAAT
 Top-k Query
     max-score
     inteval-based prunning
     other method
      ○ wand
      ○ layered-index
ORクエリの実装
 ORクエリの高速化について見ていく前に
  naiveな実装について説明する
 代表的な手法として
     TAAT(Term-at-a-time)
     DAAT(Document-at-a-time)
   の2つが存在する
TAATについて
 Termごとに順番に処理していく手法
 処理の結果はアキュムレータという中間
  データに格納されていく
TAATの例
 例として”iwc OR rolex OR watch”というクエリ
  を考える
 初めに空のアキュムレータを作成する


accumulator = {}

     iwc       1   5


    rolex      2   3   5


    watch      1   2   4   5
TAATの例
   iwcに関する転置リストをaccumulatorに入
    れる

accumulator = {1,5}

     iwc       1   5


    rolex      2   3   5


    watch      1   2   4   5
TAATの例
   rolexに関する転置リストをaccumulatorと
    マージする

accumulator = {1,2,3,5}

     iwc       1   5


    rolex      2   3   5


    watch      1   2   4   5
TAATの例
   watchに関する転置リストをaccumulatorと
    マージする

accumulator = {1,2,3,4,5}

     iwc       1   5


    rolex      2   3   5


    watch      1   2   4   5
TAATの例
   結果文章1,2,3,4,5がクエリに適合すること
    が分かる

accumulator = {1,2,3,4,5}

     iwc       1   5


    rolex      2   3   5


    watch      1   2   4   5
TAATのメリット・デメリット
 実装が簡単
 シーケンシャルアクセス中心になるので
  データがファイルに格納されてる時に割と
  性能がよい
 最近流行してるsuffix treeなどのデータ構造
  系と相性が良い [G. Navarro and Y. Nekrich
  2012]
 アキュムレータがORの結果が多くなるほど
  負荷が大きくなる
DAATについて
   クエリに関する転置インデックスを文章番
    号順に処理していく
DAATの例
   各単語の転置インデックスの先頭にカーソ
    ルを設定する


     iwc    1   5



    rolex   2   3   5



    watch   1   2   4   5
DAATの例
   カーソル上の文章番号の最も小さい文章を
    処理する
     この場合は1


     iwc       1   5



    rolex      2   3   5



    watch      1   2   4   5
DAATの例
   カーソルを次に進める



     iwc    1   5



    rolex   2   3   5



    watch   1   2   4   5
DAATの例
   カーソル上の文章番号の最も小さい文章を
    処理する
     この場合は2


     iwc       1   5



    rolex      2   3   5



    watch      1   2   4   5
DAATの例
   カーソルを次に進める



     iwc    1   5



    rolex   2   3   5



    watch   1   2   4   5
DAATの例
   カーソル上の文章番号の最も小さい文章を
    処理する
     この場合は3


     iwc       1   5



    rolex      2   3   5



    watch      1   2   4   5
DAATの例
   カーソルを次に進める



     iwc    1   5



    rolex   2   3   5



    watch   1   2   4   5
DAATの例
   カーソル上の文章番号の最も小さい文章を
    処理する
     この場合は4


     iwc       1   5



    rolex      2   3   5



    watch      1   2   4   5
DAATの例
   カーソルを次に進める



     iwc    1   5



    rolex   2   3   5



    watch   1   2   4   5
DAATの例
   カーソル上の文章番号の最も小さい文章を
    処理する
     この場合は5


     iwc       1   5



    rolex      2   3   5



    watch      1   2   4   5
DAATの例
 カーソルが最後まで来たので終了
 一連の処理では1,2,3,4,5の順で文章を処理
  した

     iwc    1   5



    rolex   2   3   5



    watch   1   2   4   5
DAATのメリット・デメリット
   文章番号の小さい順に処理をするところは
    Priority Queueというデータ構造を使うと効率
    的に処理できる
     例えばLuceneのorg.apache.lucene.search.
     DisjunctionSumScorerの実装が参考になる
 アキュムレータを持つ必要がない
 文章ごとに処理していくので、フィルタ処理な
  どとの相性が良い
     例えば値段が50万円以下のもののみ出力する、メン
      ズ用品のみ出力するなど
     Luceneの実装もDAATになっている
   ファイルへのランダムアクセスが多い
話の流れ
 転置インデックスについて
 TAAT, DAAT
 Top-k Query
     max-score
     inteval-based prunning
     other method
      ○ wand
      ○ layered-index
OR検索をどうやって高速化するか
 単純にORでマッチする全部を取る必要があ
  る場合は候補数が多い時にどうやっても処
  理に時間を要する
 しかし、検索結果の上位数件だけ必要であ
  れば上位に来る可能性がない文章の評価を
  スキップすることにより、処理の高速化が
  可能となる
 このような問い合わせに対して上位k件のみ
  取り出すことをtop-k query processingと呼
  ぶ
文章のランク付け
 上位k件を出力するためには、クエリに対して
  どの文章の順位が高いかを決定する必要がある
 どういった文章が適合してるかを考えてみる
     例えば“watch”のみ含まれる文章では置時計や動詞の
      watchが含まれる文章もヒットし、また数も大量にあ
      るため、”iwc”のみが含まれる文章の方が関連性が高
      いと考えられる
     また”iwc”のみ含まれるページより”iwc”と”rolex”を含
      むページの方が関連性が高い
     “iwc”を1回含む文章よりも2回含む文章の方が関連度
      が高い
文章のランク付け
 クエリ������ = (������1 , … , ������������ )に対して、文章������のス
  コアを������������������������������ ������, ������ = ������ ������������������������������(������������ , ������)の形で
  表す
 ������������������������������(������������ , ������)は文章における������������ の出現頻度、
  ������������ の珍しさなどが加味された値となる
 またこの後の議論の都合上������������������������������ ������������ , ������ ≥ 0
  を仮定する
 この形のスコアリング関数にはTF-IDF,
  BM25などの多くの代表的なものが含まれる
転置インデックスの拡張
   転置インデックスに対して、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
話の流れ
 転置インデックスについて
 TAAT, DAAT
 Top-k Query
     max-score
     inteval-based prunning
     other method
      ○ wand
      ○ layered-index
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
max_scoreの例1
 上位1件のみ取ることを考える
 最初の文章1を評価するとスコアは6になる


     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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
max_score 補足
 今上げた2つの例では文章1が最も大きいス
  コアになる例であったが、文章の途中のも
  のが1番になった場合、閾値もそれにあわせ
  て変化していく
 例2では閾値が6のときに”iwc”と”rolex”を含
  むの代わりに”iwc”と”watch”を含むとしても
  良かったが、通常は転置リストの長いもの
  もしくはスコアが低いものから候補から除
  外していく
max_scoreの性能
   例えば[M. Fontoura+, 2011] では約340万文
    章、3GBの広告データに対して平均長57.76
    のクエリ検索を行った場合
     Naive DAAT 26778.3 μsec
     DAAT max_score 9321.3 μsec
 と2.8倍近い性能改善が報告されている
 * この辺りの性能改善率に関しては検索エン
  ジンの性能および文章の性質に強く依存す
  る
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
話の流れ
 転置インデックスについて
 TAAT, DAAT
 Top-k Query
     max-score
     inteval-based prunning
     other method
      ○ wand
      ○ layered-index
閑話:
modernな転置インデックスの機能
 多くの場合転置リストはブロックごとに圧
  縮されて格納されている
 例えば転置リストの内容が{1,3,6,8,15,16}で
  あれば{1,3},{6,8},{15,16}と分けられており、
  内部は圧縮されている
 圧縮アルゴリズムはVbyte, Simple9,
  PForDeltaなどがある.
     例えば[H. Yan+, 2009]などが参考になる
ブロック圧縮された転置インデックス
に対する検索手法
 ブロックは圧縮されているのでなるべく
  decode処理を飛ばしたい
 またデータをブロック単位で持ってるので
  ブロックごとのスコアの最大値や最小値を
  持つことができる
 ブロック圧縮された転置インデックスに対
  する検索手法はここ最近2件ほど独立に手法
  が提案されている
     [K. Chakrabarti+, 2011] [S. Ding and T. Suel,
      2011]
     今回は主に[K. Chakrabarti+, 2011]の紹介を行う
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の研究者
モチベーション
 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]より
提案手法
   与えられたクエリに対するブロックから区
    間を作成して、Upper boundが現在の閾値以
    上の区間のみ評価する




                     [K. Chakrabarti+, 2011]より
例
       論文の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)
例
       区間を生成して、取り得る最大のスコアを
        計算する
区間           [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
例
       始めの区間に関して, 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
例
       一位のスコアが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
例
       区間(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
例
       残りは全てスキップできる

区間           [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
Interval-baseの利点
 max_scoreがglobalな最大値のみ使うのに対
  して、ブロックごとの最大値を利用できる
  のでより枝刈りが利用できる
 区間の数は高々ブロックの数の2倍程度にし
  かならない
     通常ブロックには100個程度の文章idが格納され
    ているので、長さ10万程度の転置リストでもブ
    ロックは1000個程度しかないので、区間の生成
    はほとんど負荷にならない
区間へのアクセス方法
 例では前から順に区間にアクセスしていっ
  たが論文ではこれをPruneSeqと言っている
 他にはPruneScoreOrder, PruneHybrid,
  PruneLazyというアクセス方法を提案してい
  る
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
PruneHybrid
   PruneScoreOrderの欠点として、
     ランダムアクセスが多く発生すること
     同じ転置リストのブロックに何回もアクセスするこ
     とがある
     ○ これに関して論文ではキャッシュを用意して、なるべ
      くディスクから読む回数及びデコード回数を少なくす
      るという工夫が成されている
   これに対してPruneHybridでは上位x%の区間の
    みPruneScoreOrderを実施し、そこで得た閾値
    を元にPruneSeqを実施するというのが
    PruneHybridである
     x=0のときPruneSeqと一致し
     x=100のときPruneScoreOrderと一致する
PruneLazy
 転置リストのIOがランダムになることを防
  ぐため
 1. 一定量の区間のブロックをメモリに読み
  込む
     このときdecodeは行わない
   2. 読み込んだ区間に関して、スコア順に区
    間を処理していく
     閾値によってはいくつかの読み込んだブロック
     に関してはdecodeは飛ばされる
   を繰り返す
実験結果
   TREC Terabyte (800万ページ)のデータセッ
    トで実験
     max_scoreに近い手法に比べて3-6倍の性能改善




              [K. Chakrabarti+, 2011]より
話の流れ
 転置インデックスについて
 TAAT, DAAT
 Top-k Query
     max-score
     inteval-based prunning
     other method
      ○ wand
      ○ layered-index
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
WANDの変形
   WANDの改良としては
     メモリ上の実行に適したmWAND [M. Fontoura+,
      2011]
     ブロック情報を利用したBlock-max WAND (BMW)
      [S. Ding and T. Suel, 2011]
 がある
 両論文とも割と読みやすい
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
まとめ
 転置インデックスに対してdisjunctiveなクエ
  リで問い合わせを行った際に上位k件を取っ
  てくるためのDAAT(Document-at-a-time)
  ベースの効率的な手法について述べた
 この辺りの論文はquery-processingという
  キーワードでSIGIRなどの情報検索系の会議
  によく投稿される
参考文献
   情報検索の基本的な教科書
       [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

Mais conteúdo relacionado

Mais procurados

リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介Recruit Technologies
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Takahiko Ito
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」Ken'ichi Matsui
 
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015SaitoTsutomu
 
研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイするTakayuki Itoh
 
競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略K Moneto
 
僕がつくった 70個のうちの48個のWebサービス達
僕がつくった 70個のうちの48個のWebサービス達僕がつくった 70個のうちの48個のWebサービス達
僕がつくった 70個のうちの48個のWebサービス達Yusuke Wada
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIShota Imai
 
レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方Shun Nukui
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツpospome
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)Shota Imai
 
推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれからcyberagent
 
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリングmlm_kansai
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門hoxo_m
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類Shintaro Fukushima
 

Mais procurados (20)

リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
 
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
 
研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイする
 
競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略
 
僕がつくった 70個のうちの48個のWebサービス達
僕がつくった 70個のうちの48個のWebサービス達僕がつくった 70個のうちの48個のWebサービス達
僕がつくった 70個のうちの48個のWebサービス達
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
 
レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
 
推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから
 
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類
 

Destaque

ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016Yota Ishida
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介Recruit Technologies
 
Java 9 and Future #jjug
Java 9 and Future #jjugJava 9 and Future #jjug
Java 9 and Future #jjugYuji Kubota
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to missAndres Almiray
 
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMyy yank
 
2017spring jjug ccc_f2
2017spring jjug ccc_f22017spring jjug ccc_f2
2017spring jjug ccc_f2Kazuhiro Wada
 
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求hajime funaki
 
Arachne Unweaved (JP)
Arachne Unweaved (JP)Arachne Unweaved (JP)
Arachne Unweaved (JP)Ikuru Kanuma
 
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.JustSystems Corporation
 
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Hiroyuki Ohnaka
 
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Kosuke Kida
 
Introduction of Project Jigsaw
Introduction of Project JigsawIntroduction of Project Jigsaw
Introduction of Project JigsawYuichi Sakuraba
 
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善Works Applications
 
Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Logico
 
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~Yoshio Kajikuri
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
グラフデータベース入門
グラフデータベース入門グラフデータベース入門
グラフデータベース入門Masaya Dake
 

Destaque (20)

How to Run Solr on Docker and Why
How to Run Solr on Docker and WhyHow to Run Solr on Docker and Why
How to Run Solr on Docker and Why
 
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介
 
Java 9 and Future #jjug
Java 9 and Future #jjugJava 9 and Future #jjug
Java 9 and Future #jjug
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to miss
 
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
 
2017spring jjug ccc_f2
2017spring jjug ccc_f22017spring jjug ccc_f2
2017spring jjug ccc_f2
 
Jjug ccc
Jjug cccJjug ccc
Jjug ccc
 
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
 
Arachne Unweaved (JP)
Arachne Unweaved (JP)Arachne Unweaved (JP)
Arachne Unweaved (JP)
 
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
 
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
 
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1
 
Introduction of Project Jigsaw
Introduction of Project JigsawIntroduction of Project Jigsaw
Introduction of Project Jigsaw
 
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
 
Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)
 
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
 
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
グラフデータベース入門
グラフデータベース入門グラフデータベース入門
グラフデータベース入門
 

Semelhante a 転置インデックスとTop k-query

JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1Susisu
 
本当にあった怖い話し (やきに駆動 2.0)
本当にあった怖い話し (やきに駆動 2.0)本当にあった怖い話し (やきに駆動 2.0)
本当にあった怖い話し (やきに駆動 2.0)Oda Shinsuke
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
本当にあった怖い話し Db編
本当にあった怖い話し Db編本当にあった怖い話し Db編
本当にあった怖い話し Db編Oda Shinsuke
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強Kiyoshi Ogawa
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
AWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンAWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンseiichi arai
 
PostgreSQL13を検証してみた
PostgreSQL13を検証してみたPostgreSQL13を検証してみた
PostgreSQL13を検証してみたNaoya Takeuchi
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010Tsukasa Oi
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
Ansible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれからAnsible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれからTakeshi Kuramochi
 
OCP Serverを用いた OpenStack Containerの検証
 OCP Serverを用いたOpenStack Containerの検証 OCP Serverを用いたOpenStack Containerの検証
OCP Serverを用いた OpenStack Containerの検証Takashi Sogabe
 

Semelhante a 転置インデックスとTop k-query (20)

JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
本当にあった怖い話し (やきに駆動 2.0)
本当にあった怖い話し (やきに駆動 2.0)本当にあった怖い話し (やきに駆動 2.0)
本当にあった怖い話し (やきに駆動 2.0)
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
Rでreproducible research
Rでreproducible researchRでreproducible research
Rでreproducible research
 
本当にあった怖い話し Db編
本当にあった怖い話し Db編本当にあった怖い話し Db編
本当にあった怖い話し Db編
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
AWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンAWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターン
 
PostgreSQL13を検証してみた
PostgreSQL13を検証してみたPostgreSQL13を検証してみた
PostgreSQL13を検証してみた
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
Ansible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれからAnsible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれから
 
OCP Serverを用いた OpenStack Containerの検証
 OCP Serverを用いたOpenStack Containerの検証 OCP Serverを用いたOpenStack Containerの検証
OCP Serverを用いた OpenStack Containerの検証
 

Mais de 正志 坪坂

KDD 2016勉強会 Deep crossing
KDD 2016勉強会 Deep crossingKDD 2016勉強会 Deep crossing
KDD 2016勉強会 Deep crossing正志 坪坂
 
Deeplearning輪読会
Deeplearning輪読会Deeplearning輪読会
Deeplearning輪読会正志 坪坂
 
WSDM 2016勉強会 Geographic Segmentation via latent factor model
WSDM 2016勉強会 Geographic Segmentation via latent factor modelWSDM 2016勉強会 Geographic Segmentation via latent factor model
WSDM 2016勉強会 Geographic Segmentation via latent factor model正志 坪坂
 
Deeplearning勉強会20160220
Deeplearning勉強会20160220Deeplearning勉強会20160220
Deeplearning勉強会20160220正志 坪坂
 
OnlineMatching勉強会第一回
OnlineMatching勉強会第一回OnlineMatching勉強会第一回
OnlineMatching勉強会第一回正志 坪坂
 
Tokyowebmining ctr-predict
Tokyowebmining ctr-predictTokyowebmining ctr-predict
Tokyowebmining ctr-predict正志 坪坂
 
Riak Search 2.0を使ったデータ集計
Riak Search 2.0を使ったデータ集計Riak Search 2.0を使ったデータ集計
Riak Search 2.0を使ったデータ集計正志 坪坂
 
Contexual bandit @TokyoWebMining
Contexual bandit @TokyoWebMiningContexual bandit @TokyoWebMining
Contexual bandit @TokyoWebMining正志 坪坂
 
Introduction to contexual bandit
Introduction to contexual banditIntroduction to contexual bandit
Introduction to contexual bandit正志 坪坂
 
確率モデルを使ったグラフクラスタリング
確率モデルを使ったグラフクラスタリング確率モデルを使ったグラフクラスタリング
確率モデルを使ったグラフクラスタリング正志 坪坂
 
Big Data Bootstrap (ICML読み会)
Big Data Bootstrap (ICML読み会)Big Data Bootstrap (ICML読み会)
Big Data Bootstrap (ICML読み会)正志 坪坂
 

Mais de 正志 坪坂 (20)

Recsys2018 unbiased
Recsys2018 unbiasedRecsys2018 unbiased
Recsys2018 unbiased
 
WSDM2018Study
WSDM2018StudyWSDM2018Study
WSDM2018Study
 
Recsys2016勉強会
Recsys2016勉強会Recsys2016勉強会
Recsys2016勉強会
 
KDD 2016勉強会 Deep crossing
KDD 2016勉強会 Deep crossingKDD 2016勉強会 Deep crossing
KDD 2016勉強会 Deep crossing
 
Deeplearning輪読会
Deeplearning輪読会Deeplearning輪読会
Deeplearning輪読会
 
WSDM 2016勉強会 Geographic Segmentation via latent factor model
WSDM 2016勉強会 Geographic Segmentation via latent factor modelWSDM 2016勉強会 Geographic Segmentation via latent factor model
WSDM 2016勉強会 Geographic Segmentation via latent factor model
 
Deeplearning勉強会20160220
Deeplearning勉強会20160220Deeplearning勉強会20160220
Deeplearning勉強会20160220
 
OnlineMatching勉強会第一回
OnlineMatching勉強会第一回OnlineMatching勉強会第一回
OnlineMatching勉強会第一回
 
Recsys2015
Recsys2015Recsys2015
Recsys2015
 
KDD 2015読み会
KDD 2015読み会KDD 2015読み会
KDD 2015読み会
 
Recsys2014 recruit
Recsys2014 recruitRecsys2014 recruit
Recsys2014 recruit
 
EMNLP2014_reading
EMNLP2014_readingEMNLP2014_reading
EMNLP2014_reading
 
Tokyowebmining ctr-predict
Tokyowebmining ctr-predictTokyowebmining ctr-predict
Tokyowebmining ctr-predict
 
KDD2014_study
KDD2014_study KDD2014_study
KDD2014_study
 
Riak Search 2.0を使ったデータ集計
Riak Search 2.0を使ったデータ集計Riak Search 2.0を使ったデータ集計
Riak Search 2.0を使ったデータ集計
 
Contexual bandit @TokyoWebMining
Contexual bandit @TokyoWebMiningContexual bandit @TokyoWebMining
Contexual bandit @TokyoWebMining
 
Introduction to contexual bandit
Introduction to contexual banditIntroduction to contexual bandit
Introduction to contexual bandit
 
確率モデルを使ったグラフクラスタリング
確率モデルを使ったグラフクラスタリング確率モデルを使ったグラフクラスタリング
確率モデルを使ったグラフクラスタリング
 
Big Data Bootstrap (ICML読み会)
Big Data Bootstrap (ICML読み会)Big Data Bootstrap (ICML読み会)
Big Data Bootstrap (ICML読み会)
 
Tokyowebmining2012
Tokyowebmining2012Tokyowebmining2012
Tokyowebmining2012
 

転置インデックスとTop k-query

  • 2. 今回の話の概要  転置インデックスに対してdisjunctiveなクエ リで問い合わせを行った際に上位k件を取っ てくるためのDAAT(Document-at-a-time) ベースの効率的な手法について紹介する
  • 3. ようするに  大規模な文章セットに対する”watch OR iwc OR rolex”というクエリに関連度の高い文章 を高速に持ってきたい
  • 4. 話の流れ  転置インデックスについて  TAAT, DAAT  Top-k Query  max-score  inteval-based prunning  other method ○ wand ○ layered-index
  • 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”いずれかが含まれる文章を返す
  • 8. ANDクエリとORクエリ  一般にANDクエリとORクエリの場合ANDク エリの方が高速  また、簡単な絞り込み用途としての検索エ ンジンであればANDクエリのみで十分なこ とが多い  一方でORクエリが有用なケースも多い
  • 9. ORクエリが有用な例  クエリ拡張  代表的な検索エンジンで”algorithm”と検索する と”アルゴリズム”が含まれる記事もヒットしたり する  このようにシノニムなどが含まれる記事もヒッ トするようにしたい場合はORクエリが使われる ○ この場合は”algorithm” OR “アルゴリズム”などのよ うになる ○ *検索エンジンの中の人ではないので本当にこうし てるかは知りません
  • 10. ORクエリが有用な例  類似検索  表示されてる文章から類似の文章を検索する  ex : コンテンツ連動型広告、関連文表示  文章中の単語が全部含まれてるというのはあり えないので、ANDクエリでは文章がヒットしな い
  • 11. 話の流れ  転置インデックスについて  TAAT, DAAT  Top-k Query  max-score  inteval-based prunning  other method ○ wand ○ layered-index
  • 12. ORクエリの実装  ORクエリの高速化について見ていく前に naiveな実装について説明する  代表的な手法として  TAAT(Term-at-a-time)  DAAT(Document-at-a-time)  の2つが存在する
  • 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
  • 19. TAATのメリット・デメリット  実装が簡単  シーケンシャルアクセス中心になるので データがファイルに格納されてる時に割と 性能がよい  最近流行してるsuffix treeなどのデータ構造 系と相性が良い [G. Navarro and Y. Nekrich 2012]  アキュムレータがORの結果が多くなるほど 負荷が大きくなる
  • 20. DAATについて  クエリに関する転置インデックスを文章番 号順に処理していく
  • 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になっている  ファイルへのランダムアクセスが多い
  • 33. 話の流れ  転置インデックスについて  TAAT, DAAT  Top-k Query  max-score  inteval-based prunning  other method ○ wand ○ layered-index
  • 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
  • 38. 話の流れ  転置インデックスについて  TAAT, DAAT  Top-k Query  max-score  inteval-based prunning  other method ○ wand ○ layered-index
  • 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
  • 40. max_scoreの例1  上位1件のみ取ることを考える  最初の文章1を評価するとスコアは6になる 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
  • 59. 話の流れ  転置インデックスについて  TAAT, DAAT  Top-k Query  max-score  inteval-based prunning  other method ○ wand ○ layered-index
  • 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
  • 71. Interval-baseの利点  max_scoreがglobalな最大値のみ使うのに対 して、ブロックごとの最大値を利用できる のでより枝刈りが利用できる  区間の数は高々ブロックの数の2倍程度にし かならない  通常ブロックには100個程度の文章idが格納され ているので、長さ10万程度の転置リストでもブ ロックは1000個程度しかないので、区間の生成 はほとんど負荷にならない
  • 72. 区間へのアクセス方法  例では前から順に区間にアクセスしていっ たが論文ではこれをPruneSeqと言っている  他にはPruneScoreOrder, PruneHybrid, PruneLazyというアクセス方法を提案してい る
  • 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]より
  • 77. 話の流れ  転置インデックスについて  TAAT, DAAT  Top-k Query  max-score  inteval-based prunning  other method ○ wand ○ layered-index
  • 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