Как areTF-IDF рассчитывается scikit-узнайте TfidfVectorizer

я запускаю следующий код для преобразования текстовой матрицы в матрицу TF-IDF.

text = ['This is a string','This is another string','TFIDF computation calculation','TfIDF is the product of TF and IDF']

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(max_df=1.0, min_df=1, stop_words='english',norm = None)

X = vectorizer.fit_transform(text)
X_vovab = vectorizer.get_feature_names()
X_mat = X.todense()
X_idf = vectorizer.idf_

Я получаю следующий вывод

X_vovab =

[u'calculation',
 u'computation',
 u'idf',
 u'product',
 u'string',
 u'tf',
 u'tfidf']

и X_mat =

  ([[ 0.        ,  0.        ,  0.        ,  0.        ,  1.51082562,
      0.        ,  0.        ],
    [ 0.        ,  0.        ,  0.        ,  0.        ,  1.51082562,
      0.        ,  0.        ],
    [ 1.91629073,  1.91629073,  0.        ,  0.        ,  0.        ,
      0.        ,  1.51082562],
    [ 0.        ,  0.        ,  1.91629073,  1.91629073,  0.        ,
      1.91629073,  1.51082562]])

Теперь я не понимаю, как вычисляются эти баллы. Моя идея заключается в том, что для текста[0] вычисляется оценка только для "строки", и в 5-м coloumn есть оценка. Но как TF_IDF является продуктом термин частота которого составляет 2 и ИДФ, который журнал(4/2) составляет 1,39 и не 1.51 как показано в матрице. Как рассчитывается оценка TF-IDF в scikit-learn.

3 ответов


TF-IDF выполняется в несколько шагов TfidfVectorizer Scikit Learn, который фактически использует TfidfTransformer и наследует CountVectorizer.

позвольте мне суммировать шаги, которые он делает, чтобы сделать его более простым:

  1. ТФС рассчитываются по fit_transform CountVectorizer (с)
  2. idfs рассчитываются с помощью fit () TfidfTransformer
  3. tfidfs вычисляются с помощью преобразования TfidfTransformer ()

вы можете проверить источник код здесь.

вернемся к вашему примеру. Вот расчет, который выполняется для веса tfidf для 5-го члена словаря, 1-го документа (X_mat[0,4]):

во-первых, tf для 'string', в 1-м документе:

tf = 1

во-вторых, idf для 'string' с включенным сглаживанием (поведение по умолчанию):

df = 2
N = 4
idf = ln(N + 1 / df + 1) + 1 = log (5 / 3) + 1 = 1.5108256238

и, наконец, вес tfidf для (документ 0, функция 4):

tfidf(0,4) = tf * idf = 1 * 1.5108256238 = 1.5108256238

Я заметил, что вы не хотите нормализовать матрицу tfidf. Имейте в виду, что нормализация матрицы tfidf является общим и обычно рекомендуемым подходом, поскольку большинство моделей потребует нормализации матрицы функций (или матрицы дизайна).

TfidfVectorizer будет l-2 нормализовать выходную матрицу по умолчанию, как последний шаг расчета. Нормализовав его, он будет иметь только веса между 0 и 1.


точная формула вычисления приведена в docs:

фактическая формула, используемая для tf-idf, - tf * (idf + 1) = tf + TF * idf, а не TF * idf

и

сгладить веса idf, добавив один к частотам документа, как будто дополнительный документ был замечен, содержащий каждый термин в коллекции ровно один раз.

что означает 1.51082562 получается 1.51082562=1+ln((4+1)/(2+1))


from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from collections import Counter
corpus = [
     'This is the first document.',
     'This document is the second document.',
     'And this is the third one.',
     'Is this the first document?',
 ]
print(corpus)
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())

z=X.toarray()
#term frequency is printed
print(z)

vectorizer1 = TfidfVectorizer(min_df=1)
X1 = vectorizer1.fit_transform(corpus)
idf = vectorizer1.idf_
print (dict(zip(vectorizer1.get_feature_names(), idf)))
#printing idf
print(X1.toarray())
#printing tfidf

#formula 
# df = 2
# N = 4
# idf = ln(N + 1 / df + 1) + 1 = log (5 / 3) + 1 = 1.5108256238

#formula
# tfidf(0,4) = tf * idf = 1 * 1.5108256238 = 1.5108256238