【问题标题】:tf-idf feature weights using sklearn.feature_extraction.text.TfidfVectorizer使用 sklearn.feature_extraction.text.TfidfVectorizer 的 tf-idf 特征权重
【发布时间】: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。

标签: python scikit-learn tf-idf


【解决方案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上面?
    猜你喜欢
    • 2020-09-27
    • 2020-06-23
    • 2020-01-18
    • 1970-01-01
    • 2020-09-22
    • 2017-12-27
    • 2016-09-07
    • 2016-08-13
    • 2019-04-19
    相关资源
    最近更新 更多