Gensim - Transformaciones
Este capítulo le ayudará a conocer las distintas transformaciones de Gensim. Comencemos por comprender los documentos transformadores.
Transformar documentos
Transformar documentos significa representar el documento de tal manera que el documento se pueda manipular matemáticamente. Además de deducir la estructura latente del corpus, la transformación de documentos también servirá para los siguientes objetivos:
Descubre la relación entre palabras.
Destaca la estructura oculta en el corpus.
Describe los documentos de una manera nueva y más semántica.
Hace que la representación de los documentos sea más compacta.
Mejora la eficiencia porque la nueva representación consume menos recursos.
Mejora la eficacia porque en la nueva representación se ignoran las tendencias de datos marginales.
El ruido también se reduce en la representación de nuevos documentos.
Veamos los pasos de implementación para transformar los documentos de una representación de espacio vectorial a otra.
Pasos de implementación
Para transformar documentos, debemos seguir los siguientes pasos:
Paso 1: creación del corpus
El primer paso básico es crear el corpus a partir de los documentos. Ya hemos creado el corpus en ejemplos anteriores. Creemos otro con algunas mejoras (eliminando palabras comunes y las palabras que aparecen solo una vez) -
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
Ahora proporcione los documentos para crear el corpus:
t_corpus = ["CNTK antes conocido como Computational Network Toolkit", "es un juego de herramientas de código abierto de grado comercial y fácil de usar", "que nos permite entrenar algoritmos de aprendizaje profundo para aprender como el cerebro humano.", " Puede encontrar su tutorial gratuito en tutorialspoint.com "," Tutorialspoint.com también proporciona los mejores tutoriales técnicos sobre tecnologías como el aprendizaje automático de aprendizaje profundo de inteligencia artificial de forma gratuita "]
A continuación, necesitamos hacer tokenise y, junto con él, también eliminaremos las palabras comunes:
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[
word for word in document.lower().split() if word not in stoplist
]
for document in t_corpus
]
La siguiente secuencia de comandos eliminará las palabras que solo aparecen:
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
Salida
[
['toolkit'],
['free', 'toolkit'],
['deep', 'learning', 'like'],
['free', 'on', 'tutorialspoint.com'],
['tutorialspoint.com', 'on', 'like', 'deep', 'learning', 'learning', 'free']
]
Ahora páselo al corpora.dictionary() objeto para obtener los objetos únicos en nuestro corpus -
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Salida
Dictionary(7 unique tokens: ['toolkit', 'free', 'deep', 'learning', 'like']...)
A continuación, la siguiente línea de códigos creará el modelo Bag of Word para nuestro corpus:
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
Salida
[
[(0, 1)],
[(0, 1), (1, 1)],
[(2, 1), (3, 1), (4, 1)],
[(1, 1), (5, 1), (6, 1)],
[(1, 1), (2, 1), (3, 2), (4, 1), (5, 1), (6, 1)]
]
Paso 2: crear una transformación
Las transformaciones son algunos objetos estándar de Python. Podemos inicializar estas transformaciones, es decir, objetos de Python utilizando un corpus entrenado. Aquí vamos a utilizartf-idf modelo para crear una transformación de nuestro corpus entrenado, es decir BoW_corpus.
Primero, necesitamos importar el paquete de modelos desde gensim.
from gensim import models
Ahora, necesitamos inicializar el modelo de la siguiente manera:
tfidf = models.TfidfModel(BoW_corpus)
Paso 3: Transformar vectores
Ahora, en este último paso, los vectores se convertirán de la representación anterior a la nueva representación. Como hemos inicializado el modelo tfidf en el paso anterior, el tfidf ahora se tratará como un objeto de solo lectura. Aquí, al usar este objeto tfidf, convertiremos nuestro vector de representación de bolsa de palabras (representación anterior) a pesos de valor real Tfidf (nueva representación).
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW]
Salida
[(1, 0.4869354917707381), (3, 0.8734379353188121)]
Aplicamos la transformación en dos valores de corpus, pero también podemos aplicarla a todo el corpus de la siguiente manera:
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
Salida
[(0, 1.0)]
[(0, 0.8734379353188121), (1, 0.4869354917707381)]
[(2, 0.5773502691896257), (3, 0.5773502691896257), (4, 0.5773502691896257)]
[(1, 0.3667400603126873), (5, 0.657838022678017), (6, 0.657838022678017)]
[
(1, 0.19338287240886842), (2, 0.34687949360312714), (3, 0.6937589872062543),
(4, 0.34687949360312714), (5, 0.34687949360312714), (6, 0.34687949360312714)
]
Ejemplo de implementación completo
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
t_corpus = [
"CNTK formerly known as Computational Network Toolkit",
"is a free easy-to-use open-source commercial-grade toolkit",
"that enable us to train deep learning algorithms to learn like the human brain.",
"You can find its free tutorial on tutorialspoint.com",
"Tutorialspoint.com also provide best technical tutorials on
technologies like AI deep learning machine learning for free"
]
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[word for word in document.lower().split() if word not in stoplist]
for document in t_corpus
]
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW])
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
Varias transformaciones en Gensim
Usando Gensim, podemos implementar varias transformaciones populares, es decir, algoritmos del modelo de espacio vectorial. Algunos de ellos son los siguientes:
Tf-Idf (término frecuencia-frecuencia inversa del documento)
Durante la inicialización, este algoritmo de 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. A continuación se muestra la sintaxis de la transformación Tf-idf:
Model=models.TfidfModel(corpus, normalize=True)
LSI (indexación semántica latente)
El algoritmo del modelo LSI puede transformar el documento de un modelo vectorial con valores enteros (como el modelo Bag-of-Words) o del espacio ponderado Tf-Idf en un espacio latente. El vector de salida será de menor dimensionalidad. A continuación se muestra la sintaxis de la transformación LSI:
Model=models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=300)
LDA (asignación de Dirichlet latente)
El algoritmo del modelo LDA es otro algoritmo que transforma el documento del espacio modelo Bag-of-Words en un espacio temático. El vector de salida será de menor dimensionalidad. A continuación se muestra la sintaxis de la transformación LSI:
Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)
Proyecciones aleatorias (RP)
RP, un enfoque muy eficiente, tiene como objetivo reducir la dimensionalidad del espacio vectorial. Este enfoque es básicamente una aproximación de las distancias Tf-Idf entre los documentos. Hace esto agregando un poco de aleatoriedad.
Model=models.RpModel(tfidf_corpus, num_topics=500)
Proceso de Dirichlet jerárquico (HDP)
HDP es un método bayesiano no paramétrico que es una nueva incorporación a Gensim. Deberíamos tener cuidado al usarlo.
Model=models.HdpModel(corpus, id2word=dictionary