用語「BM25」について説明。各文書中の各単語の重要性をバランスよく評価する尺度で、主に検索クエリに最も一致する文書を特定するのに用いられる。キーワード検索以外にも、類似文書の検索やレコメンデーションにも活用できる。計算式は「(ある単語の文書間でのレア度)×(ある文書における、ある単語の出現頻度、の正規化された値)」で、正規化するための調整パラメーターを持つ、tf-idfの発展版と見なせる。
情報検索/自然言語処理におけるBM25(Best Matching 25)とは、検索クエリに最もよく一致する文書を見つけ出すための統計的アルゴリズムの一つである。このアルゴリズムは、文書内での単語の出現頻度(tf:term frequency)と、その単語が含まれる文書の希少性(idf:inverse document frequency)を用いて、各文書内に含まれる各単語が「その文書内でどれくらい重要か」を評価する(図1)。
ただしBM25は、(tf-idfのように)単にtf値とidf値を掛け合わせるだけでなく、文書の長さに基づいてtf値を正規化するために調整パラメーター(後述する数式内のk1やbなど)を用いるのが特徴だ。これにより、文書内で同じ単語が過度に繰り返されてもその重要性が過大評価されず、長い文書と短い文書間で「文書内の単語の重要性」をバランス良く評価できる。このようにBM25は、tf-idfを発展させたものと見なせる。
なお、「BM25」と記載される場合、一般的には「Okapi BM25」(オカピ・ビーエム25)を指すことが多い。ここでいう「Okapi」は、アフリカに生息するシマウマのような足を持つ、小型の馬のようなキリン科の動物のことではない。実際には、1980〜1990年代にロンドン大学シティ校で開発された「オカピ情報検索システム(Okapi information retrieval system)」に由来する名称であり、このシステムの一環として開発されたBM25のバリエーションの一つである。
1つのBM25スコアの計算を数式的に表現すると、要するに、
を算出したものだ(より詳しい数式は後述する)。この計算を、複数の文書間の全単語に対して行う。こうして算出されたBM25スコアは、さまざまな情報検索シナリオで利用可能である。
BM25は主に、ユーザーからの検索クエリ(1つまたは複数の単語)に対して、最も関連性の高い文書を効率的に特定するために、検索エンジンなどでのキーワード検索に活用されている。具体的には、検索クエリで指定された単語に関するBM25スコアに基づいて文書をランキングし、関連性の高い順に検索結果を示す。このスコアリング手法は、例えばAzure AI Searchのフルテキスト検索での順位付けなど、各クラウドプラットフォームが提供する検索サービスで広く採用されており、しかも(tf-idfなどではなく)Okapi BM25がよく使われている。
さらにBM25は、類似文書の検索や「この記事に関連する記事のピックアップ」のようなレコメンデーションにも活用されている。具体的には、各文章を構成する単語群を数値群によるベクトルに置き換えて(ベクトル化)、文書ごとに「各文書の特徴」を表す特徴ベクトルを作成する。2つの特徴ベクトルの類似度はコサイン類似度などを用いて算出できるので、全文書の特徴ベクトルのペア(組み合わせ)ごとに類似度を算出すれば、その結果に基づいて文書を類似性が高い順にランキングできる。
より直観的に理解できるように、冗長にはなるが、シンプルな具体例を使って説明しておこう。例えば(文書というよりも単語の羅列ではあるが)、
という3つの文書があった場合を考えてみる。
まず、「イヌ」という単語は全文書にあるため、「どの文書にもある=レアではない」、つまり「イヌ」のidf値(単語の文書間でのレア度)は非常に低い。このような単語は文書を特徴付ける役割が弱いため、それほど重要ではない。また、文書Aにはその「イヌ」が5単語中の3語で60%という非常に高い頻度で存在するためtf値(文書内での単語の出現頻度)は高いが、BM25では文書の長さに基づいてtf値が正規化されるため、文書の長さに関わらず適切なスコアが算出される。結果として、「イヌ」のBM25スコアはそれほど高くならない(ことが予想される)。
次に、「ネコ」という単語は文書Bにしかないため、「限られた文書にしかない=レアである」、つまり「ネコ」のidf値は高い。このような単語は、文書を特徴付ける役割が強いため、より重要である。また、文書Bにはその「ネコ」が4単語中の2語で50%という高い頻度で存在するためtf値も高いが、BM25では文書の長さに基づいてtf値が正規化されるため、文書の長さに関わらず適切なスコアが算出される。結果として、「ネコ」のBM25スコアは適切に高くなる(ことが予想される)。
※tf-idfの用語解説では、ここで手計算の例を掲載していたが、BM25は正規化の計算などがやや複雑なため、手計算の説明は省略する。代わりに、Pythonで実装したJupyterノートブックを筆者のGitHubリポジトリで提供している。
Okapi BM25の数式をまとめておこう。
nは「複数文書間の全単語の数」を、mは「全文書の数」を意味する。前掲の図1の例だと、単語数は「イヌ」「キジ」「キツネ」「サル」「タヌキ」「ネコ」の6個でn=6、文書数は「文書A」「文書B」「文書C」の3個でm=3となる。
式内にある「idf値」と「正規化されたtf値」の数式は以降で示す。まず、BM25のidf値の計算式は以下の通りだ。
BM25のidf値は、ほとんどの文書に頻繁に登場するような非常に一般的な単語の場合に、0未満の負の値になる可能性がある。このような単語は(検索クエリに対して)有用な識別情報を提供しないと考えられるため、これをスコアリングの計算に含めてしまうと、一般的な単語が含まれる文書が過剰にペナルティーを受け、スコアリング結果(検索結果のランキングなど)がゆがむ可能性がある。このようなゆがみは一般的に望ましくないため、多くの実装では、負のidf値を0に置き換えることで、その影響をスコアリングに反映させないようにする対策が採られる。
次に、BM25の正規化されたtf値の計算式は以下の通りである。
式内にある「文章長」とは、j番目の文書に含まれる単語の総数を意味する(※文字数ではないので注意してほしい)。また、「平均文章長」とは、全ての文書における文章長(単語数)の平均値を意味する。
k1は、文書内の単語の出現頻度が「結果のスコアにどれくらい影響を与えるか」を調整するためのパラメーターである。
bは、文書の長さ(単語数)が「結果のスコアにどれくらい影響を与えるか」を調整するためのパラメーターだ。
Okapi BM25における、k1とbのパラメーターの最適な値は、データセットや用途によって異なるため、その都度、ベストな値を探るのが好ましい。以下は一般的な推奨値だが、あくまでもスタート地点として考えてほしい。
k1の値を低く(例えば1.2を)設定すると、単語の出現回数の増加がスコアに与える影響が小さくなる。つまり、単語が少ししか出現していない文書と多く出現している文書の間のスコアの差が小さくなる。逆に高く(例えば2.0を)設定すると、単語の出現回数がスコアに与える影響が大きくなる。つまり、単語が多く出現している文書は、より高いスコアを得るようになる。
bの値を低く(例えば0.0を)設定すると、文書の長さ(単語数)がスコアに与える影響が小さくなる。つまり、短い文書と長い文書でのスコアの差が小さくなる。逆に高く(例えば1.0を)設定すると、文書の長さがスコアに与える影響が大きくなる。つまり、長い文書はより高いスコアを得やすくなる。その間の値(例えば0.75)を設定すると、長い文章と短い文書の間でバランスを調整できる。
Copyright© Digital Advantage Corp. All Rights Reserved.