BM25
https://www.elastic.co/blog/practical-bm25-part-2-the-bm25-algorithm-and-its-variables
GPT-4.icon
BM25とは?
BM25(Best Matching 25) は、検索エンジンや情報検索でよく使われるランキング関数です。
入力されたクエリに対して、どの文書がどれくらい関連しているか(スコア)を計算します。
TF-IDF(単語の重要度を測る古典的な手法)を改良したものだと考えるとわかりやすいです。
ざっくり仕組み
TF (Term Frequency)
文書内でその単語が何回出てきたか。多いほどスコアが上がるけど、出現回数が多すぎると逆に加算が頭打ちになるように調整されます。
IDF (Inverse Document Frequency)
全体の中で珍しい単語ほど高くスコアされる。ありふれた単語(「the」「a」など)はあまり影響しない。
文書長補正:
長い文書は単語がたくさん出がちなので、不利にならないよう文書の長さに応じてスコアを調整します。
BM25の式(ざっくり)
code:tex
\text{score}(D, Q) = \sum_{t \in Q} IDF(t) \times \frac{f(t, D) \times (k_1 + 1)}{f(t, D) + k_1 \times (1 - b + b \times \frac{|D|}{\text{avgdl}})}
$ D : 文書
$ Q : クエリ(検索ワード)
$ f(t, D) : 文書Dにおける単語tの出現回数
$ |D| : 文書Dの長さ(単語数)
$ \text{avgdl} : コーパス内の文書の平均長
$ k_1 , $ b : ハイパーパラメータ(普通は $ k_1 = 1.2 ~$ 2.0 、$ b = 0.75 が多い)
実用的なイメージ
クエリの単語が文書に含まれていればスコアが上がる
文書内にたくさん出現していても、ある程度で打ち止め(過剰加算しない)
文書の長さが普通なら自然に評価、極端に長い/短いと補正がかかる
スコアが高い文書ほど、クエリと「関連度が高い」と判断する
実務では、スコア順に並べて、上位数件を表示する使い方が基本
例:クエリ「apple」を探したいとき
table:table
文書 内容 スコアイメージ
:---- :----- :--------------
D1 "I love apple pie." 高い(クエリとぴったり合う)
D2 "Banana and orange are delicious." 低い(apple出てない)
D3 "Apple is a famous tech company." 高い(apple出現、意味も関連しそう)
D4 "This is a very very very very very long document mentioning apple once." まあまあ(出現はしてるが文書が長すぎるので少し下がる)
「ヒットすれば1、しなければ0」みたいな動き?
実際は、スコアは相対的なものです。
スコア自体の絶対値(たとえば「3.1」とか「1.8」)に特に意味はなく、他のドキュメントと比べて高いか低いかだけが重要です。
要は
「スコアは絶対値じゃなくて、検索結果内での相対的な順位を決めるもの」
と捉えるとかなり実務的な理解になります!