Gensim - Создание матрицы TF-IDF

Здесь мы узнаем о создании матрицы частотно-обратной частоты документов (TF-IDF) с помощью Gensim.

Что такое TF-IDF?

Это модель термина «частота-обратная частота документа», которая также является моделью набора слов. Он отличается от обычного корпуса, поскольку снижает вес токенов, то есть слов, часто встречающихся в документах. Во время инициализации этот алгоритм модели tf-idf ожидает, что обучающий корпус будет иметь целочисленные значения (например, модель Bag-of-Words).

Затем, после этого, во время преобразования он принимает векторное представление и возвращает другое векторное представление. Выходной вектор будет иметь такую ​​же размерность, но значение редких функций (во время обучения) будет увеличено. Он в основном преобразует целочисленные векторы в действительные векторы.

Как это вычисляется?

Модель TF-IDF вычисляет tfidf с помощью следующих двух простых шагов:

Шаг 1. Умножение локальной и глобальной составляющей

На этом первом этапе модель умножит локальный компонент, такой как TF (Term Frequency), на глобальный компонент, такой как IDF (Inverse Document Frequency).

Шаг 2: нормализовать результат

После выполнения умножения на следующем этапе модель TFIDF нормализует результат до единичной длины.

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

Как получить веса TF-IDF?

Здесь мы собираемся реализовать пример, чтобы увидеть, как мы можем получить веса TF-IDF. По сути, чтобы получить веса TF-IDF, сначала нам нужно обучить корпус, а затем применить этот корпус в модели tfidf.

Обучите корпус

Как было сказано выше, чтобы получить TF-IDF, нам сначала нужно обучить наш корпус. Во-первых, нам нужно импортировать все необходимые пакеты следующим образом:

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

Теперь предоставьте список, содержащий предложения. В нашем списке три предложения -

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

Затем сделайте токенизацию предложений следующим образом:

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

Создать объект corpora.Dictionary() следующим образом -

dictionary = corpora.Dictionary()

Теперь передайте эти токенизированные предложения dictionary.doc2bow() объект следующим образом -

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

Затем мы получим идентификаторы слов и их частоту в наших документах.

for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])

Вывод

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

Таким образом мы обучили наш корпус (корпус Bag-of-Word).

Затем нам нужно применить этот обученный корпус в модели tfidf. models.TfidfModel().

Сначала импортируйте пакет numpay -

import numpy as np

Теперь применяем наш обученный корпус (BoW_corpus) в квадратных скобках models.TfidfModel()

tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')

Затем мы получим идентификаторы слов и их частоты в нашем корпусе, смоделированном с помощью tfidf -

for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

Вывод

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

Из приведенных выше результатов мы видим разницу в частотах слов в наших документах.

Полный пример реализации

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])
import numpy as np
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

Разница в весе слов

Как обсуждалось выше, слова, которые будут встречаться в документе чаще, получат меньший вес. Давайте поймем разницу в весе слов из двух вышеупомянутых выводов. Слово‘are’встречается в двух документах и ​​были уменьшены. Точно так же слово‘you’ фигурирует во всех документах и ​​вообще удаляется.