はじめに
TF-IDFから始まり、その発展形であるBM25まで、私たちは文書の関連度を測るための強力なアルゴリズムを学んできました。
では、私たちが実際に使う検索エンジン、例えば「Elasticsearch」のようなシステムは、裏側でどのようにスコアを計算しているのでしょうか?
実は、Elasticsearch(の内部で動いているLuceneというライブラリ)は、TF-IDFやBM25の考え方をベースに、さらに現実の問題に合わせた、いくつかの賢い工夫を加えています。
【重要】
現在のElasticsearchのデフォルトのスコアリングアルゴリズムは、私たちが前回学んだBM25です。この記事では、そのBM25に至るまでに培われた、またBM25の根底にも流れる「TF-IDFを現実世界に合わせて改良していく」という思想、特にLuceneのPractical Scoring Function と呼ばれる考え方を、初心者向けに解説します。
今回は「やさしい編」。数式は一切使いません!
具体的な検索シーンを想像しながら、「もし自分が検索エンジンだったら、どういう文書を上位に表示したいか?」という気持ちで、Elasticsearchの思考を追体験していきましょう。
1. 検索エンジンが抱える「新たな悩み」
TF-IDFやBM25は、主に「一つの文書」と「一つの単語」の関係性を深く掘り下げてきました。
しかし、私たちが実際に検索するときは、複数の単語で検索することが多いですよね。
例えば、あなたがECサイトで「軽くて 小さい ノートPC」と検索したとします。
この時、検索エンジンはいくつかの文書(商品ページ)を見つけてきます。
-
商品A: タイトルが「【新発売】ノートPC XYZモデル」。商品説明に「軽くて持ち運びに便利。小さいバッグにも収まります」と書かれている。
→ 3つのキーワードが全てマッチ! -
商品B: タイトルが「高性能ノートPC ABCモデル」。商品説明に「グラフィック性能が高く、ゲームにも最適。少し重いですがパワフルです」と書かれている。
→ 「ノートPC」しかマッチしていない。 -
商品C: タイトルが「小さい!超軽量ノートPC」。商品説明に「とにかく軽くてコンパクト。サブ機として最適です」と書かれている。
→ 3つのキーワードが全てマッチ!
さて、この時、TF-IDFやBM25の基本計算だけだと、少し困ったことが起きます。
それは、「検索キーワードのうち、いくつの単語にマッチしたか?」 という視点が、スコア計算に直接的には含まれていないことです。
直感的に、私たちは商品Bよりも、キーワードが全部揃っている商品Aや商品Cを上位に表示してほしいですよね。
さらに、もう一つの悩みがあります。
- 商品Aは、「商品説明」という長い文章の中にキーワードが点在しています。
- 商品Cは、「タイトル」という短い文章の中にキーワードが凝縮されています。
どちらがより「軽くて 小さい ノートPC」という検索意図に合っているでしょうか?
おそらく、タイトルで堂々とアピールしている商品Cの方を、より高く評価したいと思うはずです。
このように、現実の検索では、
- 検索キーワードがたくさんマッチした文書を、もっと高く評価したい!
- 文書全体だけでなく、「タイトル」や「本文」といったフィールドの長さも考慮したい!
という、新たな課題が出てくるのです。
2. 解決策その1:マッチ数ボーナス (Coordination Factor)
最初の悩み、「検索キーワードがたくさんマッチした文書を高く評価したい」を解決するのが、Coordination Factor (協調因子)、通称 coord です。
これは非常にシンプルなアイデアです。
coord= マッチしたキーワードの数が多ければ多いほど、スコアにボーナスポイントを与える仕組み
「軽くて 小さい ノートPC」の例で見てみましょう。
検索キーワードは3つです。
- 商品A (3つマッチ): ベースのスコアに 大きなボーナス が加算される。
- 商品B (1つマッチ): ベースのスコアに 小さなボーナス しか加算されない(あるいはボーナス無し)。
- 商品C (3つマッチ): ベースのスコアに 大きなボーナス が加算される。
このcoordのおかげで、たくさんのキーワードにマッチした商品AとCが、一つしかマッチしなかった商品Bよりも、明確に上位に来るようになります。
「下手な鉄砲も数撃ちゃ当たる」ではなく、「たくさんの弾が当たった的(まと)は、より重要だ」と判断する、賢い仕組みです。
3. 解決策その2:フィールド長ペナルティ (Field Length Norm)
次の悩み、「タイトルなどの短いフィールドでのヒットを高く評価したい」を解決するのが、Field Length Norm (フィールド長ノルム) です。
これも、私たちの直感に合った考え方です。
fieldNorm= フィールドが短ければ短いほど、その中にある単語の価値は高まる、というルール
なぜでしょう?
例えば、「概要」(短いフィールド)に「機械学習」と書いてあれば、その文書は間違いなく機械学習に関するものでしょう。
しかし、「参考文献一覧」(非常に長いフィールド)に「機械学習」とあっても、それは数ある参考文献の一つに過ぎず、文書全体のテーマとは言えないかもしれません。
先ほどの例で言えば、
- 商品A: 「商品説明」という長いフィールドでマッチ。→ スコアへの補正は小さい。
- 商品C: 「タイトル」という短いフィールドでマッチ。→ スコアへの補正が大きい。
このfieldNormによって、同じ単語がヒットした場合でも、それが「どこで」ヒットしたかによって重要度が変わってきます。短いフィールドでヒットした単語は、その文書を特徴づける重要なキーワードである可能性が高い、と判断するわけです。
これは、TF-IDFで学んだ「文書長の正規化」の考え方を、より現実に合わせてフィールド単位で適用する、洗練されたアイデアと言えます。
まとめと、次へのステップ
今回は、Elasticsearch(Lucene)がどのようにTF-IDFやBM25の考え方を拡張しているかを、数式を一切使わずに見てきました。
-
Coordination Factor (
coord):
検索キーワードにたくさんマッチするほど、スコアにボーナスを与える。 -
Field Length Norm (
fieldNorm):
タイトルなどの短いフィールドでマッチするほど、単語の重要度を高く評価する。
Elasticsearchのスコアは、単純なTF×IDFの計算だけでなく、このような現実の検索シーンに合わせた様々な「調整」や「ボーナス」 を組み合わせることで、算出されています。
$$
\text{最終スコア} \approx (\text{BM25等の基本スコア}) \times (\text{マッチ数ボーナス}) \times (\text{フィールド長補正})
$$
(※あくまでイメージです)
これで、なぜElasticsearchが単なるキーワード検索よりも賢く、関連性の高い結果を返せるのか、その秘密の一端が見えてきたのではないでしょうか。
次回は、いよいよ「応用編」です。
今回学んだcoordやfieldNormといった概念が、実際のスコアリング計算式の中で、どのような形で登場するのか。数式と具体的な計算例を使って、Elasticsearchのスコアリングの核心に迫ります。