使用 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 的类,它结合了 CountVectorizerTfidfTransformer 在单个模型中。

然后我按照代码在我的语料库上使用 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 版本之前,一种解决方法是通过向量化器的所谓隐藏的 _tfidfTfidfTransformer 的一个实例)访问属性 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)