情報検索で使われる単語の重み付け方法のひとつにOkapi BM25というものがあります。文献によって細かな違いはありますが,今回は Wikipediaに載ってるやつ を使うことにします。 それぞれの文書におけるそれぞれの語の重みを表す行列を計算するクラスを作りたいのですが,いろいろと省略すると,以下のような形式の計算を行う必要が出てきます。 ここで, は の疎行列で , は の密なベクトルで です。 この計算は,NumPyのブロードキャストルールに従えば以下のように書けるはずです。 残念ながら,この通りに書くだけでは都合の悪いことがあります。 は疎行列で,展開するとメモリにやさしくないので疎行列のままにしたいのですが,分母は が密なベクトルなので を計算すると密な行列になってしまいます。ところが,分子は疎行列の なので計算結果の は明らかに疎行列です。そういうわけで,密な行列になってしまう