Как TF-IDF реализован в инструменте gensim в python?

Из документов, которые я обнаружил в сети, я выяснил выражение, используемое для определения весовых коэффициентов терминов в корпусе, которые должны быть

tf-idf(wt)= tf * log(|N|/d);

Я проходил реализацию tf-idf, упомянутую в gensim. Пример, приведенный в документации

>>> doc_bow = [(0, 1), (1, 1)]
>>> print tfidf[doc_bow] # step 2 -- use the model to transform vectors
[(0, 0.70710678), (1, 0.70710678)] 

Что, видимо, не соответствует стандартной реализации Tf-IDF. В чем разница между обеими моделями?

Примечание: 0.70710678 - это значение 2^(-1/2), которое обычно используется при расчете собственного значения. Так как же собственное значение входит в модель TF-IDF?

2 ответа

Из Википедии:

Количество терминов в данном документе - это просто число раз, когда данный термин появляется в этом документе. Этот счет обычно нормализуется, чтобы предотвратить смещение к более длинным документам (которые могут иметь более высокий счет срока независимо от фактической важности этого термина в документе)

Из строк источника Генсим 126-127:

if self.normalize:
        vector = matutils.unitvec(vector)

В сумке слов (doc_bow) есть два токена, t0 и t1. Мы не знаем, появляются ли t0 и t1 в документе или в двух документах. И мы даже не знаем, построена ли модель (tfidf) поверх документов, содержащих токены. Сумка, doc_bow - это просто запрос (тестовые данные) и модель, построенная из обучающих данных, которые могут содержать или не содержать какие-либо из t0 или t1.

Итак, давайте сделаем предположение. Модель tfidf построена на 2 документах, d0 и d1, и d0 содержит t0, d1 содержит t1. Таким образом, общее количество документов (N) равно 2, частота терминов и частота документов t0 и t1 становятся равными 1.

Gensim использует базу 2 журналов для расчета IDF по умолчанию (см. Функцию df2idf), и преобразованный вектор tfidf из doc_bow будет выглядеть как [(0, 1), (0, 1)]. (напр., tfidf(t0) = 1 * log_2(|2|/1) = 1)

Кроме того, нам нужно учитывать нормализацию L2, выполняемую по умолчанию, и конечный результат становится [(0, 1 / 2^(1/2)), (0, 1 / 2^(1/2))] .

Другие вопросы по тегам