web-dev-qa-db-fra.com

Comment voir les n premières entrées de la matrice terme-document après tfidf dans scikit-learn

Je suis nouveau dans scikit-learn et j'utilisais TfidfVectorizer pour trouver les valeurs tfidf des termes dans un ensemble de documents. J'ai utilisé le code suivant pour obtenir le même.

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

Maintenant, si j'imprime X, je peux voir toutes les entrées dans la matrice, mais comment puis-je trouver les n meilleures entrées en fonction du score tfidf. En plus de cela, y a-t-il une méthode qui m'aidera à trouver les n meilleures entrées en fonction du score tfidf par ngram, c'est-à-dire les meilleures entrées parmi unigram, bigram, trigram et ainsi de suite?

35
Amrith Krishna

Depuis la version 0.15, la pondération globale des termes appris par un TfidfVectorizer est accessible via l'attribut idf_, qui renverra un tableau de longueur égale à la dimension de l'entité. Triez les entités par cette pondération pour obtenir les entités pondérées les plus performantes:

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

Production:

[u'food', u'drink']

Le deuxième problème d'obtenir les fonctionnalités principales par ngram peut être fait en utilisant la même idée, avec quelques étapes supplémentaires pour diviser les fonctionnalités en différents groupes:

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

Production:

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