Почему значение TF-IDF отличается от IDF_? - PullRequest
2 голосов
/ 18 июня 2019

Почему значение векторизованного корпуса отличается от значения, полученного с помощью атрибута idf_? Разве атрибут idf_ не должен просто возвращать частоту инверсии документа (IDF) так же, как он выглядит в векторизованном корпусе?

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

print(corpus)

Корпус векторизация:

  (0, 2)    0.6300993445179441
  (0, 4)    0.44832087319911734
  (0, 0)    0.44832087319911734
  (0, 3)    0.44832087319911734
  (1, 1)    0.6300993445179441
  (1, 4)    0.44832087319911734
  (1, 0)    0.44832087319911734
  (1, 3)    0.44832087319911734

Словарь и idf_ значения:

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

Выход:

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

Словарь словарный запас:

print(vectorizer.vocabulary_)

Выход:

{'this': 3, 
 'is': 0, 
 'very': 4, 
 'strange': 2, 
 'nice': 1}

Почему значение IDF слова this составляет 0.44 в корпусе и 1.0 при получении idf_?

1 Ответ

2 голосов
/ 18 июня 2019

Это из-за нормализации l2, которая применяется по умолчанию в TfidfVectorizer(). Если вы установите для параметра norm значение None, вы получите те же значения, что и idf_.


>>> vectorizer = TfidfVectorizer(norm=None)

#output

  (0, 2)    1.4054651081081644
  (0, 4)    1.0
  (0, 0)    1.0
  (0, 3)    1.0
  (1, 1)    1.4054651081081644
  (1, 4)    1.0
  (1, 0)    1.0
  (1, 3)    1.0

Кроме того, ваш способ вычисления соответствующих значений idf компонента неправильный, поскольку dict не сохраняет порядок.

использование:

 >>>> print(dict(zip(vectorizer.get_feature_names(), vectorizer.idf_)))

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