Gensim - Criando Matriz TF-IDF

Aqui, aprenderemos como criar a matriz de frequência de documento inverso de frequência (TF-IDF) com a ajuda de Gensim.

O que é TF-IDF?

É o modelo Term Frequency-Inverse Document Frequency, que também é um modelo de saco de palavras. É diferente do corpus regular porque diminui o peso dos tokens, ou seja, palavras que aparecem com frequência nos documentos. Durante a inicialização, este algoritmo de modelo tf-idf espera um corpus de treinamento com valores inteiros (como o modelo Bag-of-Words).

Depois disso, no momento da transformação, ele pega uma representação vetorial e retorna outra representação vetorial. O vetor de saída terá a mesma dimensionalidade, mas o valor dos recursos raros (no momento do treinamento) será aumentado. Ele basicamente converte vetores de valor inteiro em vetores de valor real.

Como é calculado?

O modelo TF-IDF calcula tfidf com a ajuda de seguir duas etapas simples -

Etapa 1: Multiplicando o componente local e global

Nesta primeira etapa, o modelo multiplicará um componente local como TF (Term Frequency) por um componente global como IDF (Inverse Document Frequency).

Etapa 2: normalizar o resultado

Uma vez feita a multiplicação, na próxima etapa o modelo TFIDF normalizará o resultado para o comprimento da unidade.

Como resultado dessas duas etapas acima, as palavras ocorridas com frequência nos documentos serão reduzidas.

Como obter pesos TF-IDF?

Aqui, iremos implementar um exemplo para ver como podemos obter pesos TF-IDF. Basicamente, para obter pesos TF-IDF, primeiro precisamos treinar o corpus e depois aplicar esse corpus dentro do modelo tfidf.

Treine o Corpus

Como dito acima, para obter o TF-IDF, primeiro precisamos treinar nosso corpus. Primeiro, precisamos importar todos os pacotes necessários da seguinte forma -

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

Agora forneça a lista contendo as frases. Temos três frases em nossa lista -

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

Em seguida, faça a tokenização das sentenças da seguinte forma -

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

Crie um objeto de corpora.Dictionary() como segue -

dictionary = corpora.Dictionary()

Agora passe essas frases tokenizadas para dictionary.doc2bow() objeto da seguinte forma -

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

A seguir, obteremos as palavras ids e suas frequências em nossos documentos.

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

Resultado

[['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]]

Assim treinamos nosso corpus (Bag-of-Word corpus).

Em seguida, precisamos aplicar este corpus treinado dentro do modelo tfidf models.TfidfModel().

Primeiro importe o pacote numpay -

import numpy as np

Agora aplicando nosso corpus treinado (BoW_corpus) dentro dos colchetes de models.TfidfModel()

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

A seguir, obteremos as palavras ids e suas frequências em nosso corpus modelado tfidf -

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

Resultado

[['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]]

A partir das saídas acima, vemos a diferença nas frequências das palavras em nossos documentos.

Exemplo de implementação completo

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])

Diferença no peso das palavras

Conforme discutido acima, as palavras que ocorrerão com mais frequência no documento terão os pesos menores. Vamos entender a diferença nos pesos das palavras das duas saídas acima. A palavra‘are’ocorre em dois documentos e foram ponderados. Da mesma forma, a palavra‘you’ aparecendo em todos os documentos e removidos por completo.