歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【情報検索】文章スコアのTF-IDFとBM25についてポインタを残しておく

OSS検索エンジンであるSolr/Luceneの勉強会に行っていました。

solr.doorkeeper.jp

この中の発表『Solrで多様なランキングモデルを活用するためのプラグイン開発』で、

  • SimilarityにはTF-IDFとBM25の二種類あり、Solr6からはBM25がデフォルトになっている
  • SolrのTF-IDFは、同じ単語が大量に出てきた際にスコアが極端に大きくならないように、TFが補正されている(√がかかっている)

という話があり、私は情報検索については不勉強なので、BM25は初めて聞く単語でした。

qiita.com

特徴

[改訂第3版]Apache Solr入門には次のように書かれています。271ページからの引用です。

  1. TFIDFSimilarityのような複雑な補正の仕方がなく,一般的なBM25である
  2. BM25は変数を2つ追加することで,TFIDFSimilarityが行おうとしていた補正の程度をコントロールできる
  3. tfに√よりもさらに上昇が抑えられる非線形変換がかかっている
  4. idfがシンプルになっている
  5. ヒットしやついドキュメントにかかるペナルティのかけ方も異なる

また、こちらのブログには次のように書かれています。また、『Information Retrieval: Imple- menting and Evaluating Search Engines』という教科書に詳しく解説されているという記述があります。

BM25って何? という質問には「文書長正規化したTF-IDF」と答えるようにしており,経験的に性能が良いことが知られている,という情報を加えれば使う分には十分だと思っている.

ただBM25を教科書で見かけると「背景には確率的情報検索てものがあってな」という記述を何度か見かけるし,一応検索をやってますというような人間がBM25が生まれた背景や,その背景とされる確率的情報検索について知りません,というわけにもいかない.

アプリケーションとして利用するには、とりあえずこのことを把握しておけば良さそうです。ただ、もしきちんと理解したいなら、鈍器のような本を読まなきゃいけなさそうです。

Python実装

文章の特徴量というと、検索エンジンだけでなく、データマイニング方面での実装も気になりますね。

ただし、機械学習や統計処理で使うライブラリでは、scikit-learnではTfIdfVectorizerのような形では実装されていませんでした。ただし、以下のライブラリを代わりに作成した方がいるようですね。

kujira16.hateblo.jp

トピックモデル用のライブラリgensimでは使われてるようですね。

radimrehurek.com

ただ、テキストマイニングでは統計モデルの特徴量としてTF-IDFを使うので、「同じ単語が大量に出てきた際にスコアが極端に大きくならないようにTFを補正したり、BM25を利用する」ようなモチベーションはあるのでしょうか?

参考文献

こちらの本を引用しています。

[改訂第3版]Apache Solr入門――オープンソース全文検索エンジン (Software Design plus)

[改訂第3版]Apache Solr入門――オープンソース全文検索エンジン (Software Design plus)