3

この特定のコードから取得した tfidf の結果を正規化したいと思います。

for (int docNum = 0; docNum < ir.numDocs(); docNum++) {
            TermFreqVector tfv = ir.getTermFreqVector(docNum, "contents");
            if (tfv == null) {
                // ignore empty fields
                continue;
            }
            String[] tterms = tfv.getTerms();
            int termCount = tterms.length;
            int[] freqs = tfv.getTermFrequencies();
            for (int t = 0; t < termCount; t++) {
                double idf = ir.numDocs() / ir.docFreq(new Term("contents", tterms[t]));
                System.out.println(" " + tterms[t] + " " + freqs[t]*Math.log(idf));
            }
        }

このコードの出力は次のとおりです。

area 0.0
areola 5.877735781779639
ari 3.9318256327243257
art 1.6094379124341003
artifici 1.0986122886681098
assign 2.1972245773362196
associ 3.295836866004329
assur 1.9459101490553132
averag 1.0986122886681098
avoid 0.6931471805599453
.
.
.

どんな助けでも大歓迎です。ありがとうございました

4

1 に答える 1

9

一般的なアプローチは、ドキュメント サイズで正規化することです。つまり、カウント(または絶対度数)という用語を使用する代わりに、相対度数を使用します。

周波数freqsum配列の合計になります。次に使用します

freqs[t]/(double)freqsum*Math.log(idf)

この種の混乱を避けるために、次の用語を使用することをお勧めします。

  • 「絶対頻度」の項カウント
  • 文書内単語比率の相対頻度

あいまいな用語「用語頻度」の代わりに。

歴史的に、Salton、Yang、On the specification of term values in automatic indexing (1973) を調べると、それらは絶対数を参照していることを知っています。コサインの類似性はスケールを削除するため、とにかく問題ありません。Lucene のような最新のシステムは、ドキュメントの影響をより適切に制御しようとします。

于 2012-07-05T15:48:02.060 に答える