【问题标题】:Why is the value of TF-IDF different from IDF_?为什么TF-IDF的值与IDF_不同?
【发布时间】:2019-11-01 08:05:19
【问题描述】:

为什么向量化语料库的值和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

【问题讨论】:

    标签: python scikit-learn tf-idf tfidfvectorizer


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-05-07
      • 2021-08-19
      • 1970-01-01
      • 2018-07-11
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多