Comment est la TFIDFVectorizer dans scikit-learn censé fonctionner?

J'essaye de trouver des mots qui ont la particularité de certains documents à l'aide de la TfIDFVectorizer classe dans scikit-learn. Il crée un tfidf matrice avec tous les mots et leurs scores dans tous les documents, mais il semble alors de compter les mots communs, ainsi. C'est une partie du code, je suis en cours d'exécution:

vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(contents)
feature_names = vectorizer.get_feature_names()
dense = tfidf_matrix.todense()
denselist = dense.tolist()
df = pd.DataFrame(denselist, columns=feature_names, index=characters)
s = pd.Series(df.loc['Adam'])
s[s > 0].sort_values(ascending=False)[:10]

Je l'attendais cette pour retourner une liste de mots pour le document 'Adam', mais ce qu'il fait qu'elle renvoie une liste de mots courants:

and     0.497077
to      0.387147
the     0.316648
of      0.298724
in      0.186404
with    0.144583
his     0.140998

Je ne pourrais pas le comprendre parfaitement, mais si je comprends bien, tf-idf est censé trouver les mots qui sont distinctifs d'un document dans un corpus, de trouver des mots qui apparaissent fréquemment dans un document, mais pas dans d'autres documents. Ici, and apparaît fréquemment dans d'autres documents, donc je ne sais pas pourquoi elle retourne une valeur élevée ici.

Le code complet que j'utilise pour générer ce est dans ce Jupyter portable.

Quand je calcule tf/ri semi-manuellement, à l'aide de la NLTK et le calcul des scores pour chaque mot, - je obtenir les résultats appropriés. Pour le 'Adam' document:

fresh        0.000813
prime        0.000813
bone         0.000677
relate       0.000677
blame        0.000677
enough       0.000677

Qui semble correcte, étant donné que ces sont des mots qui apparaissent dans le 'Adam' document, mais pas autant que dans d'autres documents dans le corpus. Le code utilisé pour générer ce est dans cette Jupyter portable.

Je fais quelque chose de mal avec l'scikit code? Est-il une autre façon d'initialiser cette classe où il renvoie les résultats de la droite? Bien sûr, je peux ignorer les mots vides, en passant stop_words = 'english', mais qui n'a pas vraiment résoudre le problème, puisque les mots communs de toute sorte ne devriez pas avoir des scores élevés ici.

OriginalL'auteur Jonathan | 2016-04-22