Gensim - Creación de matriz TF-IDF

Aquí, aprenderemos a crear una matriz de frecuencia de documento inversa de frecuencia de término (TF-IDF) con la ayuda de Gensim.

¿Qué es TF-IDF?

Es el modelo de Frecuencia de Término-Frecuencia de Documento Inversa que también es un modelo de bolsa de palabras. Es diferente del corpus regular porque reduce el peso de los tokens, es decir, las palabras que aparecen con frecuencia en los documentos. Durante la inicialización, este algoritmo del modelo tf-idf espera un corpus de entrenamiento con valores enteros (como el modelo Bag-of-Words).

Luego, después de eso, en el momento de la transformación, toma una representación vectorial y devuelve otra representación vectorial. El vector de salida tendrá la misma dimensionalidad, pero se incrementará el valor de las características raras (en el momento del entrenamiento). Básicamente, convierte vectores con valores enteros en vectores con valores reales.

¿Cómo se calcula?

El modelo TF-IDF calcula tfidf con la ayuda de dos sencillos pasos:

Paso 1: multiplicar el componente local y global

En este primer paso, el modelo multiplicará un componente local como TF (frecuencia de término) con un componente global como IDF (frecuencia de documento inverso).

Paso 2: normaliza el resultado

Una vez hecho esto con la multiplicación, en el siguiente paso, el modelo TFIDF normalizará el resultado a la unidad de longitud.

Como resultado de estos dos pasos anteriores, las palabras que aparecen con frecuencia en los documentos se reducirán.

¿Cómo obtener pesos TF-IDF?

Aquí, implementaremos un ejemplo para ver cómo podemos obtener pesos TF-IDF. Básicamente, para obtener pesos TF-IDF, primero necesitamos entrenar el corpus y luego aplicar ese corpus dentro del modelo tfidf.

Entrena al Corpus

Como se dijo anteriormente, para obtener el TF-IDF, primero debemos entrenar nuestro corpus. Primero, necesitamos importar todos los paquetes necesarios de la siguiente manera:

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

Ahora proporcione la lista que contiene las oraciones. Tenemos tres frases en nuestra lista:

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

A continuación, realice la tokenización de las oraciones de la siguiente manera:

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

Crea un objeto de corpora.Dictionary() como sigue -

dictionary = corpora.Dictionary()

Ahora pase estas oraciones simbólicas a dictionary.doc2bow() objeto de la siguiente manera:

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

A continuación, obtendremos los identificadores de palabras y sus frecuencias en nuestros documentos.

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

Salida

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

De esta forma hemos entrenado nuestro corpus (corpus Bag-of-Word).

A continuación, debemos aplicar este corpus entrenado dentro del modelo tfidf models.TfidfModel().

Primero importe el paquete numpay -

import numpy as np

Ahora aplicando nuestro corpus entrenado (BoW_corpus) dentro de los corchetes de models.TfidfModel()

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

A continuación, obtendremos los identificadores de palabras y sus frecuencias en nuestro corpus modelado tfidf:

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

Salida

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

De los resultados anteriores, vemos la diferencia en las frecuencias de las palabras en nuestros documentos.

Ejemplo de implementación 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])

Diferencia de peso de palabras

Como se mencionó anteriormente, las palabras que aparecerán con más frecuencia en el documento obtendrán los pesos más pequeños. Entendamos la diferencia en el peso de las palabras de los dos resultados anteriores. La palabra‘are’ocurre en dos documentos y se han reducido. Del mismo modo, la palabra‘you’ que aparecen en todos los documentos y se eliminan por completo.