TF-IDFは確かに良いスタートです。
ドキュメントのテキストの長さも考慮することで、改善することができます。これはライブラリLuceneの機能です。
Luceneは、文書の長さを考慮してTF-IDFの式を拡張しました。これは、人間の直感に対応するためです。結局のところ、ある単語の文書に「猫」という単語がある場合、この用語は、1000語の文書の1つの「猫」と比較すると、より関連性が高くなります。
Luceneのは、TF-IDFの拡張式を採用しているようです:
log(numDocs/(docFreq + 1)) * sqrt(tf) * (1/sqrt(length))
numDocs = total number of documents
docFreq = in how many documents the word was found
tf = Term frequency in a specific document
length = How many words there are in the document
ことのLuceneがBM25( "ベストマッチ25")と呼ばれる別のアルゴリズムを使用するように進化してきたのにこの頃はそれはそう。全体として、このアルゴリズムは、TF-IDFより良い結果を生み出すと思われます。この偉大なblog articleのLucene実装チェックの詳細については
IDF * ((k + 1) * tf)/(k * (1.0 - b + b * (|d|/avgDl)) + tf)
k = constant (typically 1.2)
tf = term frequency
b = also a constant which tunes the influence of the document length
|d| = document length
avgDl = average document length
IDF = log (numDocs/docFreq + 1) + 1
:Luceneのに使用されるBM25ための式があるようです。