python 为什么TF-IDF的值与IDF_不同?

g6ll5ycj  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(139)

为什么矢量化语料库的值与通过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,而通过idf_获得时是1.0

qjp7pelc

qjp7pelc1#

这是因为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}

相关问题