为什么TF-IDF的值和IDF_不一样?

Why is the value of TF-IDF different from IDF_?

为什么矢量化语料的值和通过idf_属性得到的值不一样? idf_ 属性不应该只是 return 逆文档频率 (IDF),就像它出现在语料库矢量化中一样吗?

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["This is very strange",
          "This is very nice"]
vectorizer = TfidfVectorizer()
corpus = vectorizer.fit_transform(corpus)

print(corpus)

矢量化语料库:

  (0, 2)    0.6300993445179441
  (0, 4)    0.44832087319911734
  (0, 0)    0.44832087319911734
  (0, 3)    0.44832087319911734
  (1, 1)    0.6300993445179441
  (1, 4)    0.44832087319911734
  (1, 0)    0.44832087319911734
  (1, 3)    0.44832087319911734

词汇和idf_值:

print(dict(zip(vectorizer.vocabulary_, vectorizer.idf_)))

输出:

{'this': 1.0, 
 'is': 1.4054651081081644, 
 'very': 1.4054651081081644, 
 'strange': 1.0, 
 'nice': 1.0}

词汇索引:

print(vectorizer.vocabulary_)

输出:

{'this': 3, 
 'is': 0, 
 'very': 4, 
 'strange': 2, 
 'nice': 1}

为什么词this的IDF值在语料库中是0.44idf_得到的是1.0

这是因为 l2 标准化,它在 TfidfVectorizer() 中默认应用。 如果将 norm 参数设置为 None,您将获得与 idf_.

相同的值

>>> vectorizer = TfidfVectorizer(norm=None)

#output

  (0, 2)    1.4054651081081644
  (0, 4)    1.0
  (0, 0)    1.0
  (0, 3)    1.0
  (1, 1)    1.4054651081081644
  (1, 4)    1.0
  (1, 0)    1.0
  (1, 3)    1.0

此外,您计算特征对应的 idf 值的方法是错误的,因为 dict 不保留顺序。

使用:

 >>>> print(dict(zip(vectorizer.get_feature_names(), vectorizer.idf_)))

     {'is': 1.0,
      'nice': 1.4054651081081644, 
      'strange': 1.4054651081081644, 
      'this': 1.0, 
      'very': 1.0}