为什么TFIDF的值不同于IDF?

2024-04-19 23:31:28 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么向量化语料库的值与通过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?你知道吗


Tags: 属性iscorpusthis词汇veryniceprint
1条回答
网友
1楼 · 发布于 2024-04-19 23:31:28

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

相关问题 更多 >