概要
情報検索タスクにおける、TFIDFやBM25のコサイン類似度と関連性スコア(定義後述)について考えていたらよくわからなくなったのでとりあえず疑問点を整理しました。
- ネットの情報を軽く眺めた範囲では、情報検索タスクにおいて、TFIDFではコサイン類似度、BM25では関連性スコアを用いていることが多い。
- BM25でもコサイン類似度を用いたらだめなのか。
関連性スコア
関連性スコアというのは正式な名前ではないかもしれませんが、ここでは以下のように定義します。
- ある文章(クエリ)からみた別の文章(文書)の関連性スコアとは、クエリにおける単語の出現回数を、文書におけるその単語の重要度で重み付けして足し合わせた値である。
単語の重みはいわゆるTFIDFやBM25とよばれるものです。これらは、クエリの長さの影響は受けませんが、文書の長さの影響はうけるため、クエリと文書の役割を入れ替えると異なる関連性スコアとなります。つまり対称ではありません。
BM25(BM25Okapi)の関連性スコアの計算式を以下に示します。Qがクエリ、Dが文書です。
\text{score}(D, Q) = \sum_{i=1}^{n} \text{IDF}(q_i) \cdot \frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1 \cdot \left( 1 - b + b \cdot \frac{|D|}{\text{avgdl}} \right)}
コサイン類似度
ある文章を、その文章における単語の重要度で重み付けした疎なベクトルに変換し、ベクトル同士のコサイン類似度を求めることで、文章同士が似ているかどうかを見積もることができます。コサイン類似度なので、対象性があります。TFIDFやBM25は単語の重要度に相当する概念のため、これで重みづけた文章ベクトルを作ることができます。
TFIDFによる情報検索
TFIDFを用いた情報検索では、クエリと文書のコサイン類似度に基づきランキングすることが多いです(e.g. langchainのTFIDFRetriever)。
スタンフォード大学の講義資料では関連性スコア(p23)が一瞬紹介されますが、そのあとは情報検索ではコサイン類似度を使うことが紹介されています(p26-)。
BM25による情報検索
一方で、BM25では、クエリから見た文書の関連性スコアでランキングすることが多いです(e.g. rank_bm25)。TFIDF同様にコサイン類似度で計算してもよさそうですが、あまりそういう情報は出てきません。
Wikipediaでは関連性スコアのみが紹介されています。
スタンフォード大学の講義資料でも関連性スコア(p28)が紹介されていますが、コサイン類似度は登場しません(見落としでなければ)。
追記:
BM25でベクトルの類似度を計算しているっぽい事例を見つけました。
関連性スコアの課題
非対称であるために、文章の類似度の指標としては使いにくい気がします。
ひょっとしたら情報検索タスクだけであれば、非対称でも問題ないのかもしれません。例えば、文章Aをクエリとして文章Bがヒットするのは嬉しいが逆は嬉しくないということはあるかもしれません。しかし関連性スコアの計算式は必ずしもそのような効果を生むために非対称になっているわけでもなさそうなので、やはり微妙な印象はあります。
また関連性スコアそのものの課題というわけではありませんが、TFIDFとBM25は似たような概念なのに、情報検索におけるランキングのもとになる指標の計算方法が関連性スコアとコサイン類似度で異なるというのも、なんだか収まりが悪いです。
おわりに
できたらBM25でもコサイン類似度でランキングしたいです。ネットに情報がでていないだけで、既存の検索システムは実はBM25のコサイン類似度を用いているのかもしれませんがどうなんでしょうか。気になります。