web-dev-qa-db-fra.com

poids de la fonction tf-idf à l'aide de sklearn.feature_extraction.text.TfidfVectorizer

cette page: http://scikit-learn.org/stable/modules/feature_extraction.html mentionne:

Comme tf – idf est très souvent utilisé pour les fonctionnalités de texte, il existe également une autre classe appelée TfidfVectorizer qui combine toutes les options de CountVectorizer et TfidfTransformer dans un seul modèle.

puis j'ai suivi le code et utilisé fit_transform () sur mon corpus. Comment obtenir le poids de chaque fonctionnalité calculé par fit_transform ()?

J'ai essayé:

In [39]: vectorizer.idf_
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-39-5475eefe04c0> in <module>()
----> 1 vectorizer.idf_

AttributeError: 'TfidfVectorizer' object has no attribute 'idf_'

mais cet attribut est manquant.

Merci

26
fast tooth

Depuis la version 0.15, le score tf-idf de chaque fonctionnalité peut être récupéré via l'attribut idf_ de l'objet TfidfVectorizer:

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["This is very strange",
          "This is very Nice"]
vectorizer = TfidfVectorizer(min_df=1)
X = vectorizer.fit_transform(corpus)
idf = vectorizer.idf_
print dict(Zip(vectorizer.get_feature_names(), idf))

Sortie:

{u'is': 1.0,
 u'Nice': 1.4054651081081644,
 u'strange': 1.4054651081081644,
 u'this': 1.0,
 u'very': 1.0}

Comme indiqué dans les commentaires, avant la version 0.15, une solution de contournement consiste à accéder à l'attribut idf_ via le soi-disant caché _tfidf (une instance de TfidfTransformer) du vectoriseur:

idf = vectorizer._tfidf.idf_
print dict(Zip(vectorizer.get_feature_names(), idf))

qui devrait donner la même sortie que ci-dessus.

78
YS-L

Voir aussi this sur la façon d'obtenir les valeurs TF-IDF de tous les documents:

feature_names = tf.get_feature_names()
doc = 0
feature_index = X[doc,:].nonzero()[1]
tfidf_scores = Zip(feature_index, [X[doc, x] for x in feature_index])
for w, s in [(feature_names[i], s) for (i, s) in tfidf_scores]:
    print w, s

this 0.448320873199
is 0.448320873199
very 0.448320873199
strange 0.630099344518

#and for doc=1
this 0.448320873199
is 0.448320873199
very 0.448320873199
Nice 0.630099344518

Je pense que les résultats sont normalisés par document:

>>> 0.448320873199 2 + 0.448320873199 2 + 0.448320873199 2 + 0.630099344518 2 0,9999999999997548

1
aless80