TF-IDF cos類似度を利用したコンテンツベースのレコメンドエンジンを開発しようとしているのですが、素人ゆえになかなか上手く事が運びません。
今日はIDFの算出で四苦八苦しました。ちなみに今回は、 "評価対象の文書群 = IDF算出に用いる文書群" です。IDF算出は基本的に以下と式としています。
# Nは全文書数。nは特定の単語が出現する文書数。
idf = log(N/n) + 1
最初は何も考えずに、対数の底をe(自然対数の底)として計算しました。しかし・・・
底がeだとレアワードの重みづけが不十分
文書群の中でごくごく僅かな数の文書中でしか出現しない単語は、十分大きな重みづけがなされるべきです。ですが、底がe(自然対数の底)だと、他の単語と比較して十分な差が出にくいです。希少な単語を特徴として含む文章をクエリとして、類似度の高い文書を選出させた際に、納得のいく結果が得られませんでした。
底を1.5前後にするといい感じに!
ケースバイケースだとは思いますが、自分が扱っている文書群(約4万)の場合だと、IDF算出時の底を1.5前後にすると、理想に近い結果が得られました。まだまだ試行錯誤が必要ですが・・・
おまけ:Rubyで対数の底を指定する場合
Math.log は第二引数で底を指定することができます。
# nは単語の出現回数
idf = Math.log(n, 1.5)