tf-idf fonction de poids en utilisant des sklearn.extraction de caractéristiques.texte.TfidfVectorizer

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

comme tf–idf est un très souvent utilisé pour les traits de texte, il y a aussi 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 coder et utiliser fit_transform () sur mon corpus. Comment obtenir le poids de chaque fonctionnalité calculée 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

22
demandé sur fast tooth 2014-05-22 00:05:35

2 réponses

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

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 discuté dans les commentaires, avant la version 0.15, une solution consiste à accéder à l'attribut idf_ via le soi-disant caché _tfidf (une instance de TfidfTransformer ) du vectorizer:

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

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

65
répondu YS-L 2015-02-17 08:34:35

Voir aussi ce sur la façon d'obtenir le TF-IDF valeurs 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.999999999999997548

0
répondu aless80 2017-11-29 05:38:03