为什么矢量化语料库的值与通过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)
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
的单词0.44
的IDF值是1.0
,而idf_
是{{1}}的IDF值呢?
答案 0 :(得分:2)
这是由于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
此外,由于dict
不会保留顺序,因此您用于计算功能的相应idf值的方法也是错误的。
使用:
>>>> print(dict(zip(vectorizer.get_feature_names(), vectorizer.idf_)))
{'is': 1.0,
'nice': 1.4054651081081644,
'strange': 1.4054651081081644,
'this': 1.0,
'very': 1.0}