stop-the-world

takuya-a のブログ

Information Retrieval and Web Search まとめ(23): 重複検知

前回は Web クローラの要件やそのアーキテクチャについて解説した。今回は、重複した文書の検知について扱う。

この記事は Information Retrieval and Web Search Advent Calendar 2020 の23日目の記事です。

adventar.org

重複ページの検知

  • Web には重複コンテンツがたくさんある
  • 厳密な重複検知(= 完全一致 (exact match))は一般的ではない
  • だが、準重複 (near duplicate) 検知の例は非常に多い
    • 例:ページ内容は同じだが更新日だけが違う

重複・準重複検知

  • 重複 (duplication): 完全一致はフィンガープリント (fingerprint) によって検知できる
  • 準重複 (near-duplication): 近似マッチ (approximate match)
    • 構文的な類似度を編集距離によって計算する
    • その類似度の閾値で準重複コンテンツを検知する
    • これは推移的にはならないが、推移的として扱うこともある
      • A と B、B と C がそれぞれ準重複だったとして、A と C は準重複とは限らない

類似度の計算

  • 特徴量
    • 文書のセグメント
      • 自然な、もしくは人工的な場所で分割
    • shingles
      • 単語 n-gram などを使う
  • 類似度の指標
    • それぞれの文書の shingles に対して定義される
    • ジャッカード係数 (Jaccard coefficient)
      • 共通集合の要素数 / 和集合の要素数
  • 文書  d_j のshingleを  S(d_j) で表すとすると、文書  d_1 d_2 のジャッカード係数は
 J(S(d_1), S(d_2)) = \dfrac{|S(d_1) \cap S(d_2)|}{|S(d_1) \cup S(d_2)|}

スケッチ

  • shingles どうしの正確な共通集合 (intersection)  S(d_i) \cap S(d_j) を計算するのは高コスト
  • それぞれの shingles から、部分集合を賢く選んで近似する
    • 近似した shingles の部分集合をスケッチ (sketch) と呼ぶ
  • 共通集合の要素数 / 和集合の要素数 J(S(d_1), S(d_2)))を、スケッチから推定する

スケッチベクトルの計算とジャッカード係数の推定

  • 各文書に対してスケッチベクトル (sketch vector) を作成する
    • スケッチベクトルの次元数 m は ~200 次元
    • スケッチベクトルの要素が t 以上(80% 以上など)かぶっている文書は準重複 (near duplicate) であるとみなせる
  • 準備
    • 文書の shingles を  1 .. 2^{m} のいずれかの値に写像する、以下のような集合関数  H() を用意する
      •  H(d_j) は、文書  d_j の shingles  S(d_j) の各要素のハッシュ値からなる集合
      •  m = 64 のとき、 H(d_j) の要素は 64 ビット非負整数のいずれかの値をとる
    •  1 .. 2^{m} のランダムな置換 (permutation)  \pi() を用意する
      •  1 .. 2^{m} 1 .. 2^{m} のいずれかの値にランダムに入れ替える写像
      • 置換は全単射なので異なる値が同じ値に写像されることはない
    •  H(d_j) の各要素を  \pi によって置換したものを  \Pi(d_j) とする
      •  H(d_j) の各要素  h \in H(d_j) に対して、対応する値  \pi(h) \in \Pi(d_j) が存在する
  • 文書  d_j \pi によるスケッチ  x_j^{\pi} \text{min}(\Pi(d_j)) \Pi(d_j) のうち最小の整数)で計算される

f:id:takuya-a:20201223235614p:plain
(IIR p.439 Figure 19.8) スケッチ計算の例

  • このスケッチの計算を 200 個のランダム置換  \pi_1, \pi_2, ..., \pi_{200} に対して行う
    • 200 次元のスケッチベクトルを計算する場合
  • このようにして得られた 200 個のスケッチ  x_j^{\pi_1}, x_j^{\pi_2}, ..., x_j^{\pi_{200}} を並べたものを、文書 j のスケッチベクトル  \phi_j とする
  • 文書 i と文書 j のペアに対するジャッカード係数  J(S(d_i), S(d_j)) |\phi_i \cap \phi_j| \, / \, 200 で推定する

置換の効率化

  • ランダムな置換は計算コストが高い
  • 線形の置換でも実用上はうまくいく
    • 大きな素数 p に対して、以下のような {0, ..., p-1} 上の置換の集合を考える
 \mathcal{F}_p = \{ \pi_{a,b}: 1 \leq a \leq p-1, 0 \leq b \leq p-1 \} \; \text{where} \; \pi_{a,b}(x) = ax + b \, \text{mod} \, p

まとめ

  • shingling は乱択アルゴリズム (randomized algorithm) である
    • なんの確率モデルも仮定していない
    • ある確率で正しい答えを返す
  • 文書のペアに対して準重複検知を行う方法を示した

講義資料

参考資料