如何在scikit-learn中使用tfidf后查看术语-文档矩阵的前n个条目

41

我是scikit-learn的新手,使用TfidfVectorizer来找到一组文档中术语的tfidf值。我使用了以下代码来获取相同结果。

vectorizer = TfidfVectorizer(stop_words=u'english',ngram_range=(1,5),lowercase=True)
X = vectorizer.fit_transform(lectures)

现在,如果我打印X,我可以看到矩阵中的所有条目,但是如何基于tfidf分数找到前n个条目?此外,是否有任何方法可以帮助我找到基于ngram的tfidf分数的前n个条目,即单个词、双词组、三词组等的前n个条目?

1个回答

65
自版本0.15起,通过访问属性idf_,可以获得由TfidfVectorizer学习的特征的全局术语权重。该属性将返回一个长度等于特征维数的数组。按照这个权重对特征进行排序,以获取具有最高权重的特征。
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np

lectures = ["this is some food", "this is some drink"]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(lectures)
indices = np.argsort(vectorizer.idf_)[::-1]
features = vectorizer.get_feature_names()
top_n = 2
top_features = [features[i] for i in indices[:top_n]]
print top_features

输出:

[u'food', u'drink']

使用相同的思路可以解决通过ngram获取顶级特征的第二个问题,需要将特征分成不同的组并添加一些额外的步骤:

from sklearn.feature_extraction.text import TfidfVectorizer
from collections import defaultdict

lectures = ["this is some food", "this is some drink"]
vectorizer = TfidfVectorizer(ngram_range=(1,2))
X = vectorizer.fit_transform(lectures)
features_by_gram = defaultdict(list)
for f, w in zip(vectorizer.get_feature_names(), vectorizer.idf_):
    features_by_gram[len(f.split(' '))].append((f, w))
top_n = 2
for gram, features in features_by_gram.iteritems():
    top_features = sorted(features, key=lambda x: x[1], reverse=True)[:top_n]
    top_features = [f[0] for f in top_features]
    print '{}-gram top:'.format(gram), top_features

输出:

1-gram top: [u'drink', u'food']
2-gram top: [u'some drink', u'some food']

7
如何精准获取每篇讲座文档中的前k个n元组(ngrams),而不是整个数据集中的前k个元素? - Amrith Krishna
能否获取特定文档的前n个特征? - AbtPst
我如何将其与CountVectorizer一起使用? 我想在矩阵中获取前5个单词。 - Hardik Gupta
3
看起来这并不是按TF-IDF排序,而是按字母顺序排序的。 - user124384
1
这个答案是不完整的。他想要过滤他的文档,使它们被编码并且只包含 TF-IDF 得分最高的前 X 个 n-gram。 - rjurney

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