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

问题描述 投票:0回答:1

为什么矢量化语料的值和通过

idf_
属性得到的值不一样?
idf_
属性不应该以它在语料库矢量化中出现的相同方式返回逆文档频率 (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.44
,而通过
1.0
得到的是
idf_

python scikit-learn tf-idf tfidfvectorizer
1个回答
3
投票

这是因为

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}
© www.soinside.com 2019 - 2024. All rights reserved.