【问题标题】:Normalizing TF-IDF results标准化 TF-IDF 结果
【发布时间】:2012-07-02 03:26:39
【问题描述】:

我想标准化我从这个给定代码中得到的 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
.
.
.

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 我想标准化我从这个给定代码中得到的 tfidf 结果:
  • TF-IDF 规范化。
  • 哈哈,对不起,我的意思是转换为0到1的范围。TF-IDF结果大于1。

标签: normalization normalize tf-idf


【解决方案1】:

一种常见的方法是按文档大小进行标准化。即不使用词条计数(或绝对频率),而是使用相对频率。

freqsum 成为频率数组的总和。然后使用

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

为避免此类混淆,我建议使用以下术语:

  • 术语计数用于“绝对频率”
  • 文档中单词比率的相对频率

而不是模棱两可的术语“词频”。

我知道,从历史上看,如果您查阅 Salton, Yang, On the specification of term values in automatic indexing (1973),它们指的是绝对计数。余弦相似度将消除比例,因此无论如何都无关紧要。像 Lucene 这样的现代系统会尝试更好地控制文档的影响。

【讨论】:

  • 只是为了说清楚-所以你的意思是freqsum根据我上面的代码是termCount?我只是想澄清一下对不起兄弟。
  • 不,termCount不同项的数量,不是吗?我说的是总金额。想想相对词频,应该很清楚了。
  • 这是正确的 Anony 先生吗? int[] freqs = tfv.getTermFrequencies();double freqsum = Math.sqrt(freqs[i]) / tterms.length;
  • 没有。计算总和不涉及平方根。
  • 那不是也会产生负值吗?
猜你喜欢
  • 2013-08-16
  • 2012-07-02
  • 2020-09-27
  • 2017-09-17
  • 2019-11-14
  • 2020-08-06
  • 2012-08-28
  • 2015-05-07
  • 1970-01-01
相关资源
最近更新 更多