Как 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))] .