Как TF-IDF реализован в инструменте gensim в python? - PullRequest
3 голосов
/ 27 февраля 2012

Из документов, которые я обнаружил в сети, я понял, что выражение, используемое для определения весов терминов в корпусе терминов «Частота и обратный документ», составляет

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 ]

4 голосов
/ 07 апреля 2012

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

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

Из источника gensim строки 126-127:

if self.normalize:
        vector = matutils.unitvec(vector)
0 голосов
/ 13 июня 2015

В сумке слов (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))].

...