Подтвердить что ты не робот

Tf-idf с использованием sklearn.feature_extraction.text.TfidfVectorizer

на этой странице: http://scikit-learn.org/stable/modules/feature_extraction.html упоминает:

Так как tf-idf очень часто используется для текстовых функций, есть еще один класс с именем TfidfVectorizer, который объединяет в себе все опции CountVectorizer и TfidfTransformer в одной модели.

то я следовал за кодом и использовал fit_transform() на моем корпусе. Как получить вес каждой функции, вычисленной fit_transform()?

Я пробовал:

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_'

но этот атрибут отсутствует.

Спасибо

4b9b3361

Ответ 1

Начиная с версии 0.15, оценка tf-idf каждой функции может быть получена через атрибут idf_ объекта 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))

Вывод:

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

Как обсуждалось в комментариях, до версии 0.15 обходным путем является доступ к атрибуту idf_ через предположительно скрытый _tfidf (экземпляр TfidfTransformer) вектора:

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

который должен давать тот же результат, что и выше.

Ответ 2

См. также этот о том, как получить значения TF-IDF для всех документов:

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

Я думаю, что результаты нормализованы по документу:

<Р → → +0,448320873199 2 + +0,448320873199 2 + +0,448320873199 2 + +0,630099344518 2   0,9999999999997548

Ответ 3

Вы также можете получить доступ к словарю по атрибуту vocabulary_, а по значению - по атрибуту idf_:

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["This is very strange",
          "This is very nice"]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

print(dict(zip(vectorizer.vocabulary_, vectorizer.idf_)))

Выход:

{'this': 1.0, 
 'is': 1.4054651081081644, 
 'very': 1.4054651081081644, 
 'strange': 1.0, 
 'nice': 1.0}