使用sklearn.feature_extraction.text.TfidfVectorizer计算tf-idf特征权重

32
这个页面:http://scikit-learn.org/stable/modules/feature_extraction.html提到:

由于tf-idf在文本特征中经常被使用,所以还有另一个类叫做TfidfVectorizerCountVectorizerTfidfTransformer的所有选项结合到单个模型中。

然后我按照代码,在我的语料库上使用了fit_transform()。如何获取fit_transform()计算出的每个特征的权重?
我尝试过:
In [39]: vectorizer.idf_
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-39-5475eefe04c0> in <module>()
----> 1 vectorizer.idf_

AttributeError: 'TfidfVectorizer' object has no attribute 'idf_'

但是缺少这个属性。

谢谢


从文档中的示例来看,我认为您应该使用vectorizer.fit_transform(corpus)的返回值。 - Lukas Graf
返回值是一个存储归一化特征的scipy稀疏矩阵。 - fast tooth
2个回答

84
自版本0.15以来,每个特征的tf-idf得分可以通过TfidfVectorizer对象的属性idf_检索:
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["This is very strange",
          "This is very nice"]
vectorizer = TfidfVectorizer(min_df=1)
X = vectorizer.fit_transform(corpus)
idf = vectorizer.idf_
print dict(zip(vectorizer.get_feature_names(), idf))

输出:

{u'is': 1.0,
 u'nice': 1.4054651081081644,
 u'strange': 1.4054651081081644,
 u'this': 1.0,
 u'very': 1.0}

如评论中所讨论的,在版本0.15之前,一个解决方法是通过向量化器的假定隐藏对象_tfidf(一个TfidfTransformer实例)访问属性idf_


idf = vectorizer._tfidf.idf_
print dict(zip(vectorizer.get_feature_names(), idf))

应该产生与上面相同的输出。


这是一个错误。用户不应该需要访问前导的“_”成员。 - Fred Foo
我明白了。TfidfVectorizer直接暴露一个idf属性是合理的吗?看起来很合理。 - YS-L
如何在其中添加停用词? - Nurdin
5
这只是IDF分数,对吧?并不是完整的TF-IDF? - Felipe
或者如果是十进制的话,1 + log(2)10得到的是1.30而不是1.40。 - Inherited Geek
显示剩余2条评论

1

另请参见this,了解如何获取所有文档的TF-IDF值:

feature_names = tf.get_feature_names()
doc = 0
feature_index = X[doc,:].nonzero()[1]
tfidf_scores = zip(feature_index, [X[doc, x] for x in feature_index])
for w, s in [(feature_names[i], s) for (i, s) in tfidf_scores]:
    print w, s

this 0.448320873199
is 0.448320873199
very 0.448320873199
strange 0.630099344518

#and for doc=1
this 0.448320873199
is 0.448320873199
very 0.448320873199
nice 0.630099344518

我认为这些结果是按文档归一化的:

>>>0.4483208731992+0.4483208731992+0.4483208731992+0.6300993445182 0.9999999999997548


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接