web-dev-qa-db-ja.com

scikit-learnでtfidfの後に用語ドキュメント行列の上位nエントリを表示する方法

私は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のエントリ、つまりユニグラム、バイグラム、トリグラムなどのトップエントリを見つけるのに役立つ方法はありますか?

35
Amrith Krishna

バージョン0.15以降、 TfidfVectorizer によって学習された機能のグローバル用語重み付けは、属性idf_を介してアクセスでき、機能に等しい長さの配列を返します。寸法。この重み付けでフィーチャを並べ替えて、上位の重み付けされたフィーチャを取得します。

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で上位の機能を取得する2番目の問題は、同じアイデアを使用して、機能を異なるグループに分割するいくつかの追加手順を使用して実行できます。

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']
52
YS-L