Gensim se anuncia como un paquete de Procesamiento del Lenguaje Natural que hace ‘Modelado de Temas para Humanos’. Pero es prácticamente mucho más que eso. Es un paquete líder y de vanguardia para procesar textos, trabajar con modelos de vectores de palabras (como Word2Vec, FastText, etc.) y para construir modelos de temas.
Tutorial de Gensim – Una guía completa para principiantes. Foto de Jasmin Schreiber
- Contenidos
- Introducción
- ¿Qué es un diccionario y un corpus?
- ¿Cómo crear un Diccionario a partir de una lista de frases?
- ¿Cómo crear un diccionario a partir de uno o más archivos de texto?
- ¿Cómo crear un corpus de bolsa de palabras en gensim?
- 6. ¿Cómo crear un corpus de bolsa de palabras a partir de un archivo de texto?
- ¿Cómo guardar un diccionario gensim y corpus en el disco y cargarlos de nuevo?
- ¿Cómo crear la matriz TFIDF (corpus) en gensim?
- ¿Cómo utilizar la API de descarga de gensim para cargar conjuntos de datos?
- ¿Cómo crear bigramas y trigramas utilizando modelos Phraser?
- ¿Cómo crear modelos temáticos con LDA?
- ¿Cómo interpretar la salida del Modelo Temático LDA?
- ¿Cómo crear un modelo tópico LSI usando gensim?
- ¿Cómo entrenar el modelo Word2Vec usando gensim?
- ¿Cómo actualizar un modelo Word2Vec existente con nuevos datos?
- ¿Cómo extraer vectores de palabras utilizando pre-entrenado Word2Vec y FastText modelos?
- ¿Cómo crear vectores de documentos usando Doc2Vec?
- ¿Cómo calcular las métricas de similitud como la similitud del coseno y la similitud del coseno suave?
- ¿Cómo resumir documentos de texto?
- Conclusión
Contenidos
1. Introducción
2. ¿Qué es un diccionario y un corpus?
3. ¿Cómo crear un diccionario a partir de una lista de oraciones?
4. ¿Cómo crear un diccionario a partir de uno o varios archivos de texto?
5. ¿Cómo crear un corpus de bolsa de palabras en gensim?
6. ¿Cómo crear un corpus de bolsa de palabras a partir de un archivo de texto externo?
7. ¿Cómo guardar un diccionario y un corpus de gensim en el disco y cargarlos de nuevo?
8. ¿Cómo crear la matriz TFIDF (corpus) en gensim?
9. ¿Cómo utilizar la API del descargador de gensim para cargar conjuntos de datos?
10. ¿Cómo crear bigramas y trigramas usando modelos Phraser?
11. ¿Cómo crear modelos temáticos con LDA?
12. ¿Cómo interpretar la salida del modelo temático LDA?
13. ¿Cómo crear un modelo tópico LSI usando gensim?
14. ¿Cómo entrenar un modelo Word2Vec utilizando gensim?
15. ¿Cómo actualizar un modelo Word2Vec existente con nuevos datos?
16. ¿Cómo extraer vectores de palabras utilizando modelos Word2Vec y FastText preentrenados?
17. ¿Cómo crear vectores de documentos utilizando Doc2Vec?
18. ¿Cómo calcular métricas de similitud como la similitud del coseno y la similitud del coseno suave?
19. ¿Cómo resumir documentos de texto?
20. Conclusión
Introducción
¿Qué es gensim?
Gensim se anuncia como un paquete de Procesamiento del Lenguaje Natural que hace ‘Topic Modeling for Humans’. Pero es prácticamente mucho más que eso.
Si no está familiarizado con el modelado de temas, es una técnica para extraer los temas subyacentes de grandes volúmenes de texto. Gensim proporciona algoritmos como LDA y LSI (que veremos más adelante en este post) y la sofisticación necesaria para construir modelos temáticos de alta calidad.
Puedes argumentar que los modelos temáticos y la incrustación de palabras están disponibles en otros paquetes como scikit, R, etc. Pero la amplitud y el alcance de las facilidades para construir y evaluar modelos temáticos no tienen parangón en gensim, además de muchas más facilidades convenientes para el procesamiento de textos.
Es un gran paquete para procesar textos, trabajar con modelos de vectores de palabras (como Word2Vec, FastText, etc) y para construir modelos temáticos.
Además, otra ventaja significativa con gensim es: le permite manejar grandes archivos de texto sin tener que cargar todo el archivo en la memoria.
Este post pretende dar una visión práctica de las casi todas las características principales, explicadas de una manera simple y fácil de entender.
Al final de este tutorial, usted sabrá:
- ¿Cuáles son los conceptos básicos en gensim?
- ¿Qué es el diccionario y el corpus, por qué son importantes y dónde utilizarlos?
- ¿Cómo crear y trabajar con el diccionario y el corpus?
- Cómo cargar y trabajar con datos de texto desde múltiples archivos de texto de forma eficiente en memoria
- Crear modelos temáticos con LDA e interpretar los resultados
- Crear modelo TFIDF, bigramas, trigramas, modelo Word2Vec, modelo Doc2Vec
- Calcular métricas de similitud
- Y mucho más.
Comencemos.
¿Qué es un diccionario y un corpus?
Para poder trabajar con documentos de texto, Gensim requiere que las palabras (aka tokens) se conviertan en ids únicos. Para conseguirlo, Gensim permite crear un objeto Dictionary
que asigna cada palabra a un id único.
Veremos cómo hacer esto en la siguiente sección.
¿Pero por qué se necesita el objeto diccionario y dónde se puede utilizar?
El objeto diccionario se utiliza normalmente para crear un Corpus de «bolsa de palabras». Es este diccionario y la bolsa de palabras (Corpus) que se utilizan como entradas para el modelado de temas y otros modelos en los que Gensim se especializa.
Bien, ¿qué tipo de entradas de texto puede manejar Gensim? El texto de entrada suele venir en 3 formas diferentes:
- Como oraciones almacenadas en el objeto de lista nativo de python
- Como un solo archivo de texto, pequeño o grande.
- En múltiples archivos de texto.
Ahora, cuando su entrada de texto es grande, usted necesita ser capaz de crear el objeto diccionario sin tener que cargar todo el archivo de texto.
La buena noticia es que Gensim le permite leer el texto y actualizar el diccionario, una línea a la vez, sin cargar todo el archivo de texto en la memoria del sistema. Vamos a ver cómo hacerlo en las próximas 2 secciones.
Pero, antes de entrar, vamos a entender algo de la jerga de la PNL.
Un ‘token’ normalmente significa una ‘palabra’. Un «documento» puede referirse normalmente a una «frase» o «párrafo» y un «corpus» es normalmente una «colección de documentos como una bolsa de palabras». Es decir, para cada documento, un corpus contiene la identificación de cada palabra y su recuento de frecuencia en ese documento. Como resultado, se pierde la información del orden de las palabras.
Si todo está claro hasta ahora, vamos a mojarnos las manos y ver cómo crear el diccionario a partir de una lista de frases.
¿Cómo crear un Diccionario a partir de una lista de frases?
En gensim, el diccionario contiene un mapa de todas las palabras (tokens) con su id único.
Se puede crear un diccionario a partir de un párrafo de frases, de un archivo de texto que contenga varias líneas de texto y de varios archivos de texto de este tipo contenidos en un directorio. Para el segundo y el tercer caso, lo haremos sin cargar todo el archivo en la memoria, de modo que el diccionario se actualiza a medida que se lee el texto línea por línea.
Comencemos con la entrada ‘Lista de oraciones’.
Cuando se tienen múltiples oraciones, es necesario convertir cada oración en una lista de palabras. La comprensión de listas es una forma común de hacer esto.
Como dice el diccionario tiene 34 tokens únicos (o palabras). Veamos los ids únicos para cada uno de estos tokens.
Hemos creado con éxito un objeto Diccionario. Gensim utilizará este diccionario para crear un corpus de bolsa de palabras en el que las palabras de los documentos se reemplazan con su respectivo id proporcionado por este diccionario.
Si obtiene nuevos documentos en el futuro, también es posible actualizar un diccionario existente para incluir las nuevas palabras.
¿Cómo crear un diccionario a partir de uno o más archivos de texto?
También puede crear un diccionario a partir de un archivo de texto o de un directorio de archivos de texto.
El siguiente ejemplo lee un archivo línea por línea y utiliza simple_preprocess
de gensim para procesar una línea del archivo a la vez.
La ventaja aquí es que le permite leer un archivo de texto completo sin cargar el archivo en la memoria de una sola vez.
Usemos un archivo sample.txt para demostrar esto.
Hemos creado un diccionario a partir de un solo archivo de texto. Bien!
Ahora, ¿cómo leer una línea a la vez de múltiples archivos?
Suponiendo que tienes todos los archivos de texto en el mismo directorio, necesitas definir una clase con un método __iter__
. El método __iter__()
debe iterar a través de todos los archivos en un directorio dado y producir la lista procesada de tokens de palabras.
Definamos una clase de este tipo con el nombre ReadTxtFiles
, que toma en la ruta al directorio que contiene los archivos de texto. Estoy usando este directorio de documentos de comida deportiva como entrada.
Esta entrada del blog da una buena visión general para entender el concepto de iteradores y generadores.
¿Cómo crear un corpus de bolsa de palabras en gensim?
Ahora ya sabes cómo crear un diccionario a partir de una lista y de un archivo de texto.
El siguiente objeto importante con el que debes familiarizarte para trabajar en gensim es el Corpus (una Bolsa de Palabras). Es decir, es un objeto corpus que contiene el id de la palabra y su frecuencia en cada documento. Puedes pensar en él como el equivalente de gensim a una matriz Documento-Término.
Una vez que tienes el diccionario actualizado, todo lo que necesitas hacer para crear un corpus de bolsa de palabras es pasar la lista tokenizada de palabras al Dictionary.doc2bow()
Creemos s Corpus para una lista simple (my_docs
) que contiene 2 frases.
¿Cómo interpretar el corpus anterior?
El (0, 1) en la línea 1 significa, la palabra con id=0 aparece una vez en el 1er documento.
De la misma manera, el (4, 4) en el segundo elemento de la lista significa que la palabra con id 4 aparece 4 veces en el segundo documento. Y así sucesivamente.
Bueno, esto no es legible para los humanos. Para convertir los id’s en palabras, necesitarás el diccionario para hacer la conversión.
Veamos cómo recuperar los textos originales.
word_counts = , count) for id, count in line] for line in mycorpus]pprint(word_counts)#> , ]
Nota, el orden de las palabras se pierde. Sólo se conserva la palabra y su información de frecuencia.
6. ¿Cómo crear un corpus de bolsa de palabras a partir de un archivo de texto?
La lectura de palabras a partir de una lista de python es bastante sencilla porque todo el texto ya estaba en memoria.
Sin embargo, es posible que tengas un archivo de gran tamaño que no quieras cargar todo el archivo en memoria.
Puedes importar tales archivos línea a línea definiendo una clase y la función __iter__
que lee iterativamente el archivo línea a línea y produce un objeto corpus. Pero, ¿cómo crear el objeto corpus?
El __iter__()
de BoWCorpus
lee una línea del archivo, la procesa a una lista de palabras usando simple_preprocess()
y pasa eso al dictionary.doc2bow()
. ¿Puedes relacionar cómo esto es similar y diferente de la clase ReadTxtFiles
que creamos antes?
Además, fíjate que estoy usando el paquete smart_open()
de smart_open
porque, te permite abrir y leer archivos grandes línea por línea desde una variedad de fuentes como S3, HDFS, WebHDFS, HTTP, o archivos locales y comprimidos. Eso es bastante impresionante por cierto!
Sin embargo, si usted había utilizado open()
para un archivo en su sistema, funcionará perfectamente archivo también.
¿Cómo guardar un diccionario gensim y corpus en el disco y cargarlos de nuevo?
Esto es bastante sencillo. Vea los ejemplos siguientes.
Hemos guardado los objetos diccionario y corpus. Vamos a cargarlos de nuevo.
¿Cómo crear la matriz TFIDF (corpus) en gensim?
La Frecuencia de Términos – Frecuencia Inversa de Documentos (TF-IDF) es también un modelo de bolsa de palabras, pero a diferencia del corpus regular, TFIDF pondera hacia abajo los tokens (palabras) que aparecen frecuentemente a través de los documentos.
¿Cómo se calcula TFIDF?
El Tf-Idf se calcula multiplicando un componente local como la frecuencia de términos (TF) por un componente global, es decir, la frecuencia inversa de documentos (IDF) y, opcionalmente, normalizando el resultado a la unidad de longitud.
Como resultado de esto, las palabras que aparecen con frecuencia en los documentos se ponderan a la baja.
Existen múltiples variaciones de fórmulas para TF e IDF. Gensim utiliza el sistema de recuperación de información SMART que puede ser utilizado para implementar estas variaciones. Se puede especificar qué fórmula utilizar especificando el parámetro smartirs
en el TfidfModel
. Ver help(models.TfidfModel)
para más detalles.
¿Cómo obtener los pesos TFIDF?
Entrenando el corpus con models.TfidfModel()
. A continuación, aplicar el corpus dentro de los corchetes del modelo entrenado tfidf
. Véase el ejemplo siguiente.
Nota la diferencia de pesos de las palabras entre el corpus original y el corpus ponderado con tfidf.
Las palabras ‘es’ y ‘el’ aparecen en dos documentos y fueron ponderadas. La palabra «esto», que aparece en los tres documentos, se eliminó por completo. En términos sencillos, las palabras que aparecen con más frecuencia en los documentos obtienen pesos más pequeños.
¿Cómo utilizar la API de descarga de gensim para cargar conjuntos de datos?
Gensim proporciona una API incorporada para descargar conjuntos de datos de texto populares y modelos de incrustación de palabras.
Aquí se mantiene una lista completa de conjuntos de datos y modelos disponibles.
Utilizar la API para descargar el conjunto de datos es tan sencillo como llamar al método api.load()
con los datos o el nombre del modelo adecuados.
El siguiente ejemplo muestra cómo descargar el modelo ‘glove-wiki-gigaword-50’.
¿Cómo crear bigramas y trigramas utilizando modelos Phraser?
Ahora ya sabes cómo descargar conjuntos de datos y modelos preentrenados con gensim.
Descarguemos el conjunto de datos text8
, que no es otra cosa que los «Primeros 100.000.000 bytes de texto plano de Wikipedia». Entonces, a partir de esto, generaremos bigramas y trigramas.
¿Pero qué son los bigramas y los trigramas? y ¿por qué son importantes?
En los párrafos, ciertas palabras siempre tienden a aparecer en pares (bigramas) o en grupos de tres (trigramas). Porque las dos palabras combinadas forman la entidad real. Por ejemplo: La palabra ‘francés’ se refiere a la lengua o región y la palabra ‘revolución’ puede referirse a la revolución planetaria. Pero combinándolas, ‘Revolución Francesa’, se refiere a algo completamente diferente.
Es bastante importante formar bigramas y trigramas a partir de oraciones, especialmente cuando se trabaja con modelos de bolsa de palabras.
Entonces, ¿cómo crear los bigramas?
Es bastante fácil y eficiente con el modelo Phrases
de gensim. El modelo Phrases
creado permite la indexación, por lo que, basta con pasar el texto original (lista) al modelo Phrases
construido para formar los bigramas. A continuación se muestra un ejemplo:
Los bigramas están listos. ¿Puedes adivinar cómo crear un trigrama?
Bueno, simplemente enjuague y repita el mismo procedimiento a la salida del modelo de bigramas. Una vez que haya generado los bigramas, puede pasar la salida para entrenar un nuevo modelo Phrases
. A continuación, aplique el corpus de bigramas al modelo de trigramas entrenado. ¿Se ha confundido? Mira el ejemplo de abajo.
¿Cómo crear modelos temáticos con LDA?
El objetivo de los modelos temáticos es extraer los temas subyacentes de una colección dada de documentos de texto. Cada documento del texto se considera una combinación de temas y cada tema se considera una combinación de palabras relacionadas.
El modelado de temas puede realizarse mediante algoritmos como el Latent Dirichlet Allocation (LDA) y el Latent Semantic Indexing (LSI).
En ambos casos es necesario proporcionar el número de temas como entrada. El modelo de temas, a su vez, proporcionará las palabras clave de cada tema y el porcentaje de contribución de los temas en cada documento.
La calidad de los temas depende en gran medida de la calidad del procesamiento del texto y del número de temas que proporcione al algoritmo. El post anterior sobre cómo construir los mejores modelos de temas explica el procedimiento con más detalle. Sin embargo, recomiendo entender los pasos básicos involucrados y la interpretación en el ejemplo siguiente.
Paso 0: Cargar los paquetes necesarios e importar las palabras de parada.
Paso 1: Importar el conjunto de datos. Voy a utilizar el conjunto de datos text8
que se puede descargar utilizando la API de descarga de gensim.
# Step 1: Import the dataset and get the text and real topic of each news articledataset = api.load("text8")data =
Paso 2: Preparar los datos descargados eliminando las palabras de parada y lematizarlos. Para la lematización, gensim requiere el paquete pattern
. Por lo tanto, asegúrese de hacer pip install pattern
en su terminal o prompt antes de ejecutar esto. He configurado la lematización de tal manera que sólo se conservan los sustantivos (NN), los adjetivos (JJ) y los pronombres (RB). Porque prefiero que sólo esas palabras vayan como palabras clave del tema. Esta es una elección personal.
El data_processed
se procesa ahora como una lista de palabras. Ahora puede usar esto para crear el Dictionary
y el Corpus
, que luego se usarán como entradas para el modelo LDA.
Tenemos el Diccionario y el Corpus creados. Vamos a construir un modelo de temas LDA con 7 temas, utilizando LdaMulticore()
. 7 temas es una elección arbitraria por ahora.
El lda_model.print_topics
muestra qué palabras contribuyeron a cada uno de los 7 temas, junto con el peso de la contribución de la palabra a ese tema.
Puede ver las palabras como ‘también’, ‘muchos’ que vienen a través de diferentes temas. Así que yo añadiría esas palabras a la lista stop_words
para eliminarlas y afinar aún más el modelo de temas para un número óptimo de temas.
LdaMulticore()
soporta el procesamiento paralelo. Alternativamente, también podría probar y ver qué temas da el LdaModel()
.
¿Cómo interpretar la salida del Modelo Temático LDA?
El objeto lda_model
soporta la indexación. Es decir, si pasas un documento (lista de palabras) al lda_model
, éste proporciona 3 cosas:
- El tema(s) al que pertenece ese documento junto con el porcentaje.
- El tema(s) al que pertenece cada palabra de ese documento.
- El tema(s) al que pertenece cada palabra de ese documento Y los valores phi.
¿Qué es el valor phi?
El valor phi es la probabilidad de que la palabra pertenezca a ese tema en particular. Y la suma de los valores phi para una palabra dada suma el número de veces que esa palabra ocurrió en ese documento.
Por ejemplo, en la salida de abajo para el documento 0, la palabra con id=0 pertenece al tema número 6 y el valor phi es 3.999. Esto significa que la palabra con id=0 apareció 4 veces en el documento 0.
¿Cómo crear un modelo tópico LSI usando gensim?
La sintaxis para usar un modelo LSI es similar a cómo construimos el modelo LDA, excepto que usaremos el LsiModel()
.
¿Cómo entrenar el modelo Word2Vec usando gensim?
Un modelo de incrustación de palabras es un modelo que puede proporcionar vectores numéricos para una palabra dada. Usando la API de descarga de Gensim, puedes descargar modelos de incrustación de palabras pre-construidos como word2vec, fasttext, GloVe y ConceptNet. Estos modelos se basan en grandes corpus de datos de texto de uso común, como Wikipedia, Google News, etc.
Sin embargo, si se trabaja en un nicho especializado, como los documentos técnicos, es posible que no se puedan obtener incrustaciones de palabras para todas las palabras. Por lo tanto, en estos casos es deseable entrenar su propio modelo.
La implementación de Word2Vec
Gensim le permite entrenar su propio modelo de incrustación de palabras para un corpus dado.
Hemos entrenado y guardado un modelo Word2Vec para nuestro documento. Sin embargo, cuando llega un nuevo conjunto de datos, quieres actualizar el modelo para tener en cuenta las nuevas palabras.
¿Cómo actualizar un modelo Word2Vec existente con nuevos datos?
En un modelo Word2Vec
existente, llama al método build_vocab()
en el nuevo conjunto de datos y luego llama al método train()
. build_vocab()
se llama primero porque el modelo tiene que ser informado de lo que las nuevas palabras para esperar en el corpus de entrada.
¿Cómo extraer vectores de palabras utilizando pre-entrenado Word2Vec y FastText modelos?
Acabamos de ver cómo obtener los vectores de palabras para Word2Vec modelo que acabamos de entrenar. Sin embargo, gensim permite descargar modelos preentrenados de última generación a través de la API del downloader. Veamos cómo extraer los vectores de palabras de un par de estos modelos.
Tenemos 3 modelos de incrustación diferentes. Puedes evaluar cuál de ellos rinde más usando el evaluate_word_analogies()
del modelo respectivo en un conjunto de datos de analogías estándar.
¿Cómo crear vectores de documentos usando Doc2Vec?
A diferencia de Word2Vec
, un modelo Doc2Vec
proporciona una representación vectorizada de un grupo de palabras tomadas colectivamente como una sola unidad. No es una simple media de los vectores de las palabras de la frase.
Utilicemos el conjunto de datos text8
para entrenar el Doc2Vec
.
import gensimimport gensim.downloader as api# Download datasetdataset = api.load("text8")data =
Los datos de entrenamiento para el Doc2Vec
deben ser una lista de TaggedDocument
s. Para crear uno, pasamos una lista de palabras y un entero único como entrada al models.doc2vec.TaggedDocument()
.
La entrada está preparada. Para entrenar el modelo, hay que inicializar el modelo Doc2Vec
, construir el vocabulario y finalmente entrenar el modelo.
Para obtener el vector de documentos de una frase, pásalo como una lista de palabras al método infer_vector()
.
¿Cómo calcular las métricas de similitud como la similitud del coseno y la similitud del coseno suave?
La similitud del coseno suave es similar a la similitud del coseno pero además considera la relación semántica entre las palabras a través de su representación vectorial.
Para calcular los cosenos suaves, necesitarás un modelo de incrustación de palabras como Word2Vec o FastText. Primero, calcule el similarity_matrix
. A continuación, convierta las frases de entrada en un corpus de bolsas de palabras y páselas al softcossim()
junto con la matriz de similitud.
A continuación se muestran algunas métricas de similitud y distancia útiles basadas en los modelos de incrustación de palabras como fasttext y GloVe. Ya hemos descargado estos modelos utilizando la API de descarga.
¿Cómo resumir documentos de texto?
Gensim implementa el resumen de textrank utilizando la función summarize()
del módulo summarization
. Todo lo que necesita hacer es pasar en la cadena tet junto con el resumen de salida ratio
o el máximo count
de palabras en la salida resumida.
No hay necesidad de dividir la oración en una lista tokenizada porque gensim hace la división utilizando el método incorporado split_sentences()
en el módulo gensim.summarization.texcleaner
.
Vamos a resumir el recorte de un nuevo artículo en sample.txt.
Para más información sobre el resumen con gensim, consulte este tutorial.
Conclusión
Hemos cubierto un montón de terreno sobre las diversas características de gensim y obtener una buena comprensión de cómo trabajar con y manipular los textos. Los ejemplos anteriores deben servir como plantillas agradables para empezar y construir sobre varias tareas de PNL. Espero que lo encuentres útil y te sientas cómodo para usar gensim más a menudo en tus proyectos de PNL.