[自然言語処理/NLP] Okapi BM25についてざっくりまとめ (理論編)

2020.04.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、Mr.Moです。

文書中に含まれる単語の重要度を評価する手法でよく使うものにTF-IDFがありますが、別の手法でOkapi BM25というのもあります。ケースによってはTF-IDFよりも精度が出る場合がありそうですので本記事でOkapi BM25をざっくり理解していこうと思います。

ちなみに、TF-IDFについては下記の記事を参考にしていただければと思います。

tf-idfについてざっくりまとめ_理論編

Okapi BM25とは

Okapi BM25は、情報検索における順位付けの手法である。検索エンジンがクエリとの関連性に応じて、文書を順位付けするのに用いられる。1970年代から1980年代にかけて、スティーブン・ロバートソンやカレン・スパーク・ジョーンズらが確率適合モデル(英語版)に基づいて開発した。BM25の "BM" は、 "Best Matching" の略である。

https://ja.wikipedia.org/wiki/Okapi_BM25

Wikipediaに情報がありました。数式の記載もありましたので今回はこちらの数式を用いて見ていこうと思います。
下記がOkapi BM25の数式ですね。

image.png

ちなみに上記の数式に対して下記の記載があり、「単語の出現頻度」ということはTFに相当するものと言えそうです。以降ではTFとして扱います。

image.png

まず最初に上記の数式をいくつかの要点に分けて見ていこうと思います。

TF

TFはTerm Frequencyの略で、「単語の出現頻度」すなわち「各文書においてその単語がどのくらい出現したのか」を意味するものです。ということで「いっぱい使われている単語があるとそのTF値は高くなる」ということになります。

Wikipediaの数式で言うと下記にあたる部分です。

image.png

IDF

IDFはInverse Document Frequencyの略で、「逆文書頻度」とも呼ばれ単語が「レア」なら高い値を、「色々な文書によく出現する単語」なら低い値を示すものです。

Wikipediaの数式で言うと下記にあたる部分です。

image.png

IDF値の計算に関してはさらに下記のような記載があり、分母・分子に0.5を足していますね。

image.png

ちなみに、scikit-learnでは下記の計算を採用しているようです。(本記事ではいったん上記の0.5を足しているもので進めていきます。)

image.png

ということでTF-IDFとは「その単語がよく出現するほど」、「その単語がレアなほど」大きい値を示すものになるんですね。
(ここまでは冒頭で紹介したTF-IDFの記事に詳細が記載されていますのでご参照いただければと思います)

さて、ここから先はOkapi BM25固有の値を見ていきます。

document length(DL)

文書に含まれる総単語数を用います。

Wikipediaの数式で言うと下記にあたる部分です。

image.png

avgdl

そして、全ての文章の平均の単語数の値も用います。

Wikipediaの数式で言うと下記にあたる部分ですね。

image.png

ここまでで主要な値をざっと把握しましたので改めてOkapi BM25 全体を理解していこうと思います。

Okapi BM25の解釈

image.png

計算式全体を通して見ると、単語の使用数が多くて値が高くなるのを抑制している感じでしょうか。

また、チューニング用途のパラメータ(k1, b)が用意されており、k1には1.2もしくは2.0をbには0.75を指定することが多いようです。

まとめ

TF-IDFでは1つの文章中での単語使用数が多いだけでも値が高くなる傾向がありましたので、Okapi BM25はその辺りが調整されていると言えるのではないでしょうか。 次は実際にPythonでOkapi BM25を使ってみようと思います。

参考