糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

Structured annotations of web queries(SIGMOD 2010) 読んだ

Structured annotations of web queries

まとめ

検索クエリを構造化して扱うための手法を提示.

なんでそう扱いたいか

前の論文とも関連する,というかそちらの問題意識に近いけれど,商品検索のクエリは構造化されている.
通常の情報検索の文脈で"50 inch LG lcd tv"というクエリは一見何も問題無さそうだが,実はLGは50inchのlcd tvを生産していないのでこれでは商品がヒットしない.しかしクエリを構造化すればLGのlcd tvを検索できるので他のinchをユーザに提示できる.
この論文の目的は2つ.

  1. クエリを構造化されたデータとして扱えるようにする.例えば"50 inch LG lcd tv"というクエリを { テーブル(クエリが意図している領域) => TV,サイズ => 50inch,ブランド => LG,テレビの種類 => lcd tvs} と解釈できるようにしたい.
  2. 1つのクエリが複数のテーブルで解釈可能になる場合がある.例えばwhite tigerというクエリはアシックスのスニーカーの白いものを指しているのか,white tigerというタイトルの本を探しているのか,white tigerという動物を探しているのか,という事である.こういった場合,どのアノテーションが最も確からしいのかも計算したい.

問題定義

テーブルと呼ばれるデータ構造を考える.これはジャンル(商品)ごとに定義され,属性(attribute)とその値で構成される.
テレビとモニター,2つのテーブルの例を次に示す.

TVs
Type Brand Diagona
TV Samsung 46inch
TV Sony 60inch
TV LG 26inch
Monitors
Type Brand Diagona
Monitor Samsung 24inch
Monitor Dell 12inch
Monitor HP 32inch

こんな感じで商品ごとに属性(Brand, Diagonal...)とその値(Sony, 46inch...)で構成される.
あとはクエリについて

  1. クエリの単語それぞれに対応する属性を推定する
  2. その後,最も確からしいテーブルをクエリに推定する

という作業をやっていく.

クエリの単語それぞれに対応する属性を推定する(Annotation)

ここの作業は比較的単純.事前にテーブルごとに属性とその値をかき集めてストアしておく.あとはクエリの中からマッチするかどうかで判定("数字 [単位]"みたいな部分の処理は後述).その後クエリをS = {Table, Annotated Token, Free Token}というタプルで管理する.具体的には"50 inch LG lcd"というクエリは

S_1:
 Table: TVs
 
 Annotated_Token: 
  50inch: TVs.Diagonal
  LG: TVs.Brand
  lcd: TVs.Screen
  
 Free_Token:

 
S_2:
 Table: Monitors
 
 Annotated_Token: 
  50inch: Monitors.Diagonal
  LG: Monitors.Brand
  lcd: Monitors.Screen
  
 Free_Token: 

 
S_3:
 Table: Refrigerators
 
 Annotated_Token: 
  50inch: Refrigerators.Width
  LG: Refrigerators.Brand
  
 Free_Token:
    - lcd

こんな感じでテレビとモニタと冷蔵庫という3つのテーブルについてそれぞれアノテーションされる.冷蔵庫にはlcdなんて属性は存在しないのでFree Token扱い.

最も確からしいテーブルをクエリに推定する

アノテーションができたので,次にどのテーブルがクエリにふさわしいかを推定する.ここで生成モデルを考える.まずユーザはの確率でテーブルTとそこにある属性の集合を選ぶ.クエリにフリートークンが入ってる事を考慮してこれをと考える.次にユーザは特定のトークンを確率で選ぶ.つまりはあるクエリがテーブルiに属するスコアはとなる.
例えば"LD 30 inch screen"はテーブルTVsについてアノテーションされる.このクエリにおいて選択された属性は{TVs.Brand, TVs.Diagonal, TVs.free}なので

となる.ここで

  • が互いに独立であり
  • はTに依存し
  • [AT_i]はに依存する

という仮定を置くととなる.あとは各項計算する.
しかしこれだけだと「え,これ普通の検索クエリのつもりで入れただけでそんな構造化したつもりとかないんだけど」みたいな誤判定をする可能性がある.例えば"green apple"なるクエリを「青りんご」とそのままに解釈するのではなく「緑色という属性を持つアップルブランドの商品」と誤解するみたいな感じ.これを防ぐために普通の検索クエリから構成される言語モデル(Open Language Model)を考えて,を計算する.それであとはしきい値を考えてなら構造化して扱うようにする.

具体的に計算する

じゃあ具体的に何をどう計算するのかという話.求めなきゃならんのはにおいての3項,においてはの2項.
まずは何かというとテーブルにおいて属性がその値を取る個数."50 inch LG lcd"なるクエリだと「ブランドがLGで50 inch」なる属性を持つ要素の個数.それをテーブルのサイズで割る.実際は属性の値ごとに(全属性が独立であるという仮定に基づき)数え上げかけ合わせていく(数値属性はカテゴリ化した上で).あと細かい話だと全属性が独立というわけでもなく,例えばテレビブランドと商品ラインナップは独立じゃないので考慮してやる(ソニーというブランドとブラビアというラインナップは独立じゃない).
については普通の検索クエリのユニグラムを使ってとしてやる.についてはテーブル固有のユニグラムと普通の検索クエリのユニグラムを使ってとしてやる.
残りのはEMで求める.

感想

商用サイトで普通に行われているものとばかり思っていたので驚いた.クエリじゃないデータに形を変えて試したい.