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
Vous devez vous connecter pour publier un commentaire.
De scikit-learn documentation:
Que tf–idf est très souvent utilisé pour les fonctions de texte, il y a aussi une autre classe appelée TfidfVectorizer qui combine toutes les options de CountVectorizer et TfidfTransformer dans un modèle unique.
Comme vous pouvez le voir, TfidfVectorizer est un CountVectorizer suivie par TfidfTransformer.
Ce que vous êtes probablement à la recherche pour est TfidfTransformer et pas TfidfVectorizer
OriginalL'auteur Sagar Waghmode
Je crois que votre question se trouve dans l'aide de différentes listes de mots vides. Scikit-learn et NLTK utiliser différentes listes de mots vides par défaut. Pour scikit-learn, il est généralement une bonne idée d'avoir un custom stop_words liste transmise à TfidfVectorizer, par exemple:
Page de Doc pour TfidfVectorizer classe: [http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html%5D%5B1%5D
Je suppose que votre intuition est que TFIDF devraient bénéficier les termes rares. C'est à moitié vrai. TFIDF prend en compte deux choses principales: TF, qui est le terme de fréquence dans le document, et de l'IDF, qui est l'inverse de la fréquence des termes sur l'ensemble des documents. TF avantages fréquentes, alors que TSAHAL avantages les termes rares. Ces deux sont presque opposés à des mesures, ce qui rend la TFIDF l'équilibre métrique.
Aussi, la suppression de mots vides est une pratique très courante lors de l'utilisation d'un vecteur de l'espace de représentation. Nous pouvons raisonner de cette façon: pour la plupart des applications, vous voulez avoir une métrique qui est élevé pour les termes importants et faible/nulle pour les non-importants. Si votre représentation (TFIDF dans ce cas) ne parvient pas à le faire, à vous de les contrer par la suppression d'un terme qui ne va pas aider et potentiellement nuire à votre modèle.
OriginalL'auteur Rabbit
Je ne sais pas pourquoi ce n'est pas par défaut, mais vous voudrez probablement
sublinear_tf=True
dans l'initialisation de TfidfVectorizer. Je bifurquais votre pension et vous a envoyé un RP avec un exemple qui ressemble probablement plus proche de ce que vous voulez.Parce que vous êtes maintenant en utilisant beaucoup moins de documents. Donc, l'armée israélienne, qui pousse dans le nombre de fois que le terme est trouvé dans un document (c'est à dire, c'est un par le numéro de document), n'obtient pas de très grande avec seulement quatre documents (<=4 pour tout terme) et vous n'avez pas assez de "puissance statistique".
comment puis-je obtenir des résultats différents en exécutant le même code. Le seul code de différence est de "vectorizer = TfidfVectorizer(sublinear_tf=True, stop_words='anglais')", alors que je semble être bien raisonnable de sortie pour adam: soutenir 0.045090 os 0.045090 tu 0.044417 toi 0.043673 en temps opportun 0.043269 ton 0.042731 premier 0.041628 absence 0.041234 côtes 0.041234 sentir 0.040259
OriginalL'auteur Randy
à l'aide de code ci-dessous je obtenir de bien meilleurs résultats
Sortie
et
OriginalL'auteur emilywuq