使用 sklearn.feature_extraction.text.TfidfVectorizer 的 tf-idf 特征权重
Posted
技术标签:
【中文标题】使用 sklearn.feature_extraction.text.TfidfVectorizer 的 tf-idf 特征权重【英文标题】:tf-idf feature weights using sklearn.feature_extraction.text.TfidfVectorizer 【发布时间】:2014-07-10 15:53:11 【问题描述】:此页面:http://scikit-learn.org/stable/modules/feature_extraction.html 提及:
由于 tf–idf 是一个非常常用于文本特征的类,还有一个名为 TfidfVectorizer 的类,它结合了 CountVectorizer 和 TfidfTransformer 在单个模型中。
然后我按照代码在我的语料库上使用 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)
的返回值。
返回值是一个存储归一化特征的scipy sparse_matrix。
【参考方案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
【讨论】:
【参考方案2】:从0.15版本开始,可以通过TfidfVectorizer
对象的idf_
属性获取每个特征的tf-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
正如 cmets 中所讨论的,在 0.15 版本之前,一种解决方法是通过向量化器的所谓隐藏的 _tfidf
(TfidfTransformer
的一个实例)访问属性 idf_
:
idf = vectorizer._tfidf.idf_
print dict(zip(vectorizer.get_feature_names(), idf))
应该给出与上面相同的输出。
【讨论】:
这是一个错误。用户不需要访问领先的_
成员。
我明白了。 TfidfVectorizer
是否应该直接公开 idf
属性?这样做似乎很合理。
如何在其中添加停用词?
@YS-L 这只是 IDF 分数,正确,不是完整的 TF-IDF 吗?
我对计算有疑问,因为在两个文档中出现了一次“nice”或“strange”不应该是 idf 等于 1 + log(2)e => 1.69 而不是 1.40上面?以上是关于使用 sklearn.feature_extraction.text.TfidfVectorizer 的 tf-idf 特征权重的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)