Blog
Curso de procesamiento de textos – Gensim & Python
- Publicado por: DrPablo
- Categoría: Gensim Procesamiento de texto

Explorar los conceptos básicos de Gensim y su instalación
Explorar los conceptos básicos de word2vec
Inteligencia artificial aplicada al análisis de textos
¿Cuál dirías que es el resultado de la siguiente operación matemática?
ron + cola
No hace falta ser aficionado a los jeroglíficos (o a la bebida), para pensar en cubalibre. Por otro lado, ¿qué palabra crees que se ajusta mejor a la siguiente operación?
gato – maullar + ladrar
Supongo que tú también estás entre perro y avestruz. Y por último, ¿cuál de las siguientes palabras crees que está fuera de lugar?
perro, coche, gato, zorro
Podemos resolver estas operaciones rápidamente, de forma intuitiva. Sin embargo, ¿sería posible resolver estas operaciones con una máquina?
Éste es un problema conocido en Inteligencia Artificial, que se engloba en el Procesamiento del Lenguaje Natural (NLP, por sus siglas en inglés). En este tutorial vamos a hablar de una librería disponible en Python que es capaz de resolver esas operaciones, y también puede usarse para muchas otras aplicaciones: Gensim.
¿Gensim?
Gensim es un robusto kit de herramientas de modelado de vectores de código abierto y tópicos implementado en Python. Utiliza NumPy, SciPy y opcionalmente Cython para el rendimiento. Gensim está específicamente diseñado para manejar grandes colecciones de texto, utilizando el flujo de datos y algoritmos incrementales eficientes, que lo diferencian de la mayoría de los otros paquetes de software científicos que sólo se enfocan en el procesamiento por lotes y en memoria.
Caracerísticas de Gensim
Gensim incluye implementaciones de algoritmos tf-idf, proyecciones aleatorias, algoritmos word2vec y document2vec, procesos jerárquicos Dirichlet (HDP), análisis semántico latente (LSA) y asignación de Dirichlet latente (LDA), incluyendo versiones paralelas distribuidas.
Algunos de los algoritmos en línea en Gensim también fueron publicados en la disertación doctoral de 2011 Scalability of Semantic Analysis in Natural Language Processing de Radim Řehůřek, el creador de Gensim.
Usos de gensim
Gensim ha sido utilizado y citado en más de 500 aplicaciones comerciales y académicas.El software ha sido tratado en varios nuevos artículos, podcasts y entrevistas desde 2009
Empezamos ?
En particular, vamos a poner a prueba la herramienta llamada word2vec. Una explicación detallada de sus orígenes, con enlaces a los artículos originales (está aquí). En nuestro tutorial sólo vamos a dar una pincelada de lo que hace word2vec, y lanzarnos a un ejemplo práctico de cómo usarlo.
Palabra → Vector (word2vec)
A grandes rasgos, word2vec toma una lista de palabras y devuelve un vector para cada palabra. Es decir, convierte la palabra
cerveza
en el vector
array([ 0.2340236 , 0.20879558, -0.45595449, … ])
Esta representación de palabras en forma vectorial es lo que se llama un “embedding”. Como ya te puedes imaginar, hay algo de matemáticas detrás de todo esto. Si te interesa puedes ojear los artículos citados en el enlace anterior, o este otro, donde se explican de forma un poco más pedagógica los algoritmos que usa word2vec, y el entrenamiento de redes neuronales). Vamos a ver ahora una manera simple de entender cómo construir embeddings de palabras:
La idea básica es la siguiente: palabras similares suelen tener contextos similares. Aquí, un “contexto” es una palabra vecina (o un conjunto de palabras vecinas). El número de palabras de un contexto es lo que se llama la “ventana”. Por ejemplo, considera la siguiente frase:
“Homer quiere beber cerveza fría”
Si usamos una ventana de 1 palabra, los contextos de la palabra “cerveza” son “beber”, y “fría”. Es lógico que “beber” va a ser contexto de “cerveza” más veces que la palabra “comer”, y muchísimas más veces que “esternocleidomastoideo”. Lo que hacen distintos algoritmos (como Continuous Bag-of-Words, o Skip-Gram) es usar el recuento de palabras y contextos para asignar vectores a palabras, de forma que el vector de “cerveza” apunte a una región más próxima a “beber” que a “comer”, y muy distante de “esternocleidomastoideo”.
Word2vec es por tanto una herramienta de aprendizaje de máquina (machine learning) de tipo no supervisado. Esto significa que no tienes que decirle a la máquina qué es una cerveza, un plátano, o un esternocleidomastoideo, sino que word2vec agrupará automáticamente palabras de una forma inteligente, a partir de los textos con los que se haya entrenado. Como de costumbre, el resultado de word2vec dependerá de cómo entrenes al modelo:
- Cantidad: la máquina necesitará suficiente cantidad de texto para poder entrenarse bien, y encontrar suficientes ejemplos de palabras y contextos.
- Calidad: si entrenas el modelo con texto informativo y factual como la wikipedia (cuyo texto en español más actual se puede descargar aquí), encontrarás que China y Pekín son palabras cercanas. Por otro lado, si entrenas el modelo con Tweets de Donald Trump, puede que China termine más cerca de Irán y de Obama.
Librería Gensim
Instalación de Gensim
La librería gensim se puede instalar fácilmente desde el navegador de Anaconda, o desde la terminal:
conda install -c anaconda gensim
o bien usando pip:
pip install --upgrade gensim
Guía básica de Gensim
Para empezar, probemos algunos de los ejemplos del tutorial oficial de Gensim. Para cargar word2vec desde Python (o IPython, o Jupyter Notebook):
from gensim.models import Word2Vec
Entrenar un modelo de word2vec es sencillo. Vamos a usar unas cuantas frases como ejemplo:
frases=[["escribir","tutoriales","es","gratificante"],["pero","comer","papas","bravas","es","mucho","mejor"]] modelo = Word2Vec(frases,min_count=1)
Hay muchos parámetros con los que jugar, dentro de la función Word2Vec, por ejemplo Word2Vec(frases, size=300) hará que los vectores de las palabras tengan 300 dimensiones. En concreto, el parámetro “min_count” el el número mínimo de veces que cada palabra tiene que aparecer en el texto de entrenamiento (de modo que palabras que se repitan menos de “min_count” veces serán descartadas). Dado el pequeño texto de entrenamiento que estamos usando, es necesario incluir “min_count=1”, para evitar que el vocabulario esté vacío. Para obtener más información sobre estos parámetros, como de costumbre, puedes hacer desde IPython:
Word2Vec?
¡Ya tenemos un modelo entrenado! Si queremos guardarlo, basta con hacer:
modelo.save("./nombre_del_modelo")
Y para abrirlo más tarde sin necesidad de volver a entrenarlo:
nuevo_modelo=Word2Vec.load("./nombre_de_modelo")
Llegados a este punto es menester usar un modelo bien entrenado (que sepa algo más que de tutoriales y papas bravas). En Internet puedes encontrar varios modelos entrenados de Word2Vec en inglés. En castellano, sin embargo, sólo he encontrado uno, “Spanish Billion Word Corpus and Embeddings” (SBWCE), por Cristian Cardellino. Puedes descargar un modelo ya entrenado (1.21 GB) aquí. Para cargar este modelo, Word2Vec.load() no funciona; dado que está en formato C binario, hay que hacerlo de la siguiente forma:
from gensim.models.keyedvectors import KeyedVectors modelo = KeyedVectors.load_word2vec_format("./sbw_vectors.bin", binary=True)
Tardará unos 30 segundos en cargarlo (más o menos, dependiendo de tu ordenador). Una vez este paso está terminado, ya por fin podemos llevar a cabo las operaciones que mencionamos al principio del tutorial:
modelo.most_similar(positive=["ron","cola"],topn=1)
Te muestra la palabra correspondiente al vector más cercano a la suma del vector “ron” más el vector “cola”. Del mismo modo podemos encontrar la palabra más cercana al resultado de gato-maullar+ladrar:
modelo.most_similar(positive=["gato","ladrar"],negative=["maullar"],topn=1)
Y podemos encontrar qué palabra se parece menos de una lista:
modelo.doesnt_match(["perro","coche","gato","zorro"])
¡Misión cumplida!
Aparte de esas operaciones, puedes probar algunos otros ejemplos, como el clásico:
modelo.most_similar(positive=["rey","mujer"],negative=["hombre"],topn=1)
encontrar sinónimos de una palabra:
modelo.most_similar("garaje")
obtener el grado de semejanza entre dos palabras:
modelo.similarity("hombre","mujer")
Si quieres obtener el vector correspondiente a una palabra:
gato_vector=modelo.word_vec("gato") maullar_vector=modelo.word_vec("maullar") ladrar_vector=modelo.word_vec("ladrar")
De modo que, una forma alternativa de resolver la operación “gato-maullar+ladrar” sería:
modelo.similar_by_vector(gato_vector-maullar_vector+ladrar_vector)
Que te dará la lista de palabras más cercanas al vector resultante.
Por último, un par de comentarios sobre el modelo SBWCE:
- Parece haber sido entrenado teniendo con palabras acentuadas, así como mayúsculas y minúsculas. De modo que la palabra “Lápiz” dará distintos resultados que “lápiz” o “lapiz”.
- Si estás usando Python 2, puede que tengas problemas al usar palabras con tilde, por ejemplo:
modelo.most_similar("lápiz")
Para evitarlo, puedes hacer lo siguiente:
modelo.most_similar("lápiz".decode("utf8"))
Otras aplicaciones de Gensim
El modelo SBWCE que hemos usado en este tutorial es apropiado para practicar y divertirse un poco con word2vec. Pero si lo que quieres es utilizar word2vec para usarlo en alguna aplicación, por ejemplo, hacer análisis de sentimiento de emails o tweets, clasificación de documentos, etc., lo más recomendable es que construyas tú mismo un set de entrenamiento (así como de testeo y validación) que se ajuste a tus necesidades.
El texto (o “corpus”) que uses para el entrenamiento de tu aplicación tiene que ser convertido en una lista ordenada de palabras (el “vocabulario”). Para ello es aconsejable eliminar símbolos (comas, puntos, etc. así como tildes), convertir todas las palabras a minúsculas. Otro paso aconsejable es eliminar todas las palabras vacías (stop words) del texto.
Una vez construido un vocabulario y entrenado el modelo de word2vec, puedes extraer los vectores de todas las palabras, y utilizar otras herramientas de aprendizaje de máquina para clasificar esos vectores o hacer predicciones.
Por último, si word2vec te ha alegrado el día, te gustará saber que existen muchas otras herramientas de aprendizaje de máquina para el análisis de textos disponibles en la red, como por ejemplo la llamada doc2vec (¡adivina qué hace!). Así que, si quieres seguir explorando el mundo del NLP…
array([ 1.51475191e-01, 4.77988534e-02, 2.07517087e-01, 9.90231931e-02, -3.47936183e-01, -7.00673833e-02, -1.06638797e-01, 2.02836230e-01, 1.12128578e-01, -2.02852953e-02, 4.69276644e-02, -6.69473186e-02, 2.21404620e-02, 1.41302384e-02, -1.05308361e-01, 1.15319341e-01, -2.17205852e-01, -5.07978648e-02, -2.80305356e-01, 3.03023428e-01, -4.54990678e-02, -1.11505784e-01, 3.80909722e-03, -2.12197006e-02, -2.48370543e-01, -3.53637487e-01, -1.55483531e-02, 1.93523020e-01, -5.48870087e-01, -6.30441830e-02, -4.76207621e-02, -1.10397208e-02, -1.16989896e-01, -3.08334321e-01, 7.61090368e-02, -3.08937609e-01, 1.24237932e-01, -7.14462474e-02, 1.82852939e-01, -1.03900976e-01, 1.05683673e-02, 3.29227209e-01, 4.68312465e-02, -6.09327964e-02, -4.29462455e-03, -5.04458286e-02, 8.54226109e-03, -3.33699077e-01, -7.17517436e-02, 2.38868698e-01, 1.39576644e-01, 1.81708813e-01, -9.05100629e-02, 3.63972634e-01, -7.50960484e-02, 1.04897311e-02, -2.71079838e-01, -1.99300617e-01, 9.56633389e-02, 1.40808225e-01, 3.25359046e-01, 5.26248403e-02, 8.42677131e-02, -1.76994979e-01, 4.39685583e-02, 1.21701628e-01, -3.00875574e-01, 2.72744715e-01, -2.23628357e-01, -1.06250562e-01, -5.30555472e-02, 1.25666503e-02, -1.16767935e-01, 3.24130386e-01, 1.70754772e-02, 1.92181215e-01, 1.87380970e-01, 1.82394236e-01, -1.86843678e-01, -1.33757487e-01, 3.42863388e-02, -9.39683467e-02, -4.50785644e-02, -1.75355569e-01, -5.87525219e-02, 9.39135775e-02, -1.18043870e-01, -1.67513207e-01, 1.86191857e-01, 8.11006501e-02, 6.98754042e-02, 2.96212345e-01, 1.07249290e-01, -7.94754028e-02, -3.01897097e-02, -1.69241071e-01, 1.16538599e-01, 2.94642970e-02, 1.67019948e-01, -4.87223491e-02, -2.08211124e-01, -1.01412944e-01, -3.35297883e-01, 1.43257109e-03, -9.52705517e-02, 5.86086251e-02, 1.17156573e-01, -5.29823340e-02, 1.44525161e-02, 1.03694059e-01, 2.08559722e-01, -1.85320843e-02, 7.65603483e-02, 2.43469641e-01, 8.89441520e-02, -2.28701010e-02, 3.03467244e-01, 8.36532563e-03, 1.05700247e-01, -1.29439116e-01, 6.30485788e-02, 5.72386198e-03, -3.37366939e-01, -1.66130438e-01, 1.48967318e-02, 8.94984826e-02, 1.05314940e-01, -2.13829745e-02, -5.30646741e-02, -1.48923099e-01, 1.23036422e-01, 1.28507158e-02, -5.76724112e-02, 3.59097794e-02, -3.83380890e-01, 3.53811264e-01, -1.36834085e-01, -2.80849487e-01, -1.37324771e-02, -1.02800794e-01, -9.77869853e-02, 4.32889387e-02, 4.52874377e-02, -6.58213533e-03, -1.20481186e-01, 7.73916617e-02, -1.73006386e-01, -5.75030111e-02, 3.82464647e-01, -9.00760666e-02, -1.82431087e-01, -1.01715818e-01, -3.85229215e-02, -2.09561840e-01, -1.59040660e-01, 1.66111186e-01, 4.30522971e-02, 5.94143718e-02, 1.03201464e-01, -9.02572721e-02, -3.11981309e-02, -1.97890714e-01, 2.09759519e-01, -2.01957569e-01, 7.68964961e-02, 1.53659759e-02, 5.12529816e-03, 2.72028387e-01, 2.40359500e-01, -7.22637475e-02, -7.63023868e-02, 1.80790916e-01, 5.96460141e-02, -2.96855569e-01, 3.17716360e-01, -6.70238659e-02, -2.57284522e-01, -1.68579310e-01, 7.00383484e-02, -1.02270119e-01, 2.99075902e-01, 2.42183685e-01, -6.28368631e-02, -3.78126264e-01, -1.89365521e-01, 1.63532719e-01, -1.78423539e-01, 2.45752230e-01, 1.24095358e-01, 4.30432595e-02, -2.56407052e-01, -5.58385812e-02, 3.06400120e-01, -3.83865893e-01, -2.63931215e-01, 3.89825031e-02, 2.78572381e-01, 1.75669834e-01, 9.47382823e-02, -3.65822136e-01, -4.44265097e-01, 3.07302833e-01, -2.03133658e-01, 4.40904424e-02, 4.05125506e-02, 1.08836591e-02, 3.74202907e-01, 1.80295575e-02, -1.86928250e-02, -5.78051917e-02, -1.90830037e-01, -2.36425072e-01, -1.99033737e-01, 3.28308851e-01, 3.94172877e-01, -7.20678270e-02, -1.72487535e-02, 3.88918012e-01, -1.35755911e-01, -8.62550437e-02, -3.42964893e-04, -9.67185348e-02, 1.62180945e-01, -1.68821573e-01, -2.79364198e-01, -1.71159923e-01, -5.93499914e-02, -5.56568019e-02, -1.02123000e-01, 9.17021558e-02, 4.59187105e-02, -3.70852917e-01, 4.45782632e-01, -1.35977283e-01, -8.89692083e-03, 2.31331196e-02, 1.36116788e-01, 1.93821024e-02, -1.87079296e-01, 1.44459978e-01, 1.43313274e-01, -1.54450372e-01, -1.63480684e-01, 2.65551847e-03, -1.02507547e-01, -6.75980002e-02, -1.99274287e-01, -1.72267944e-01, -1.97988361e-01, 1.04932129e-01, -1.54179335e-01, -1.14486001e-01, 8.47853273e-02, 2.09497809e-01, 2.46300131e-01, 2.95806602e-02, -1.05739370e-01, -1.02022238e-01, -3.71927530e-01, 2.34858498e-01, 2.24832684e-01, 4.40248281e-01, 6.32976741e-02, 8.44155699e-02, -1.91056028e-01, -1.42388552e-01, -2.45097592e-01, 1.21090740e-01, 1.07781380e-01, -2.61779800e-02, 1.65640920e-01, 7.10607693e-02, -2.85666049e-01, 1.06302656e-01, -3.51145238e-01, 1.41256779e-01, 1.21410161e-01, 2.48844579e-01, 1.47512183e-01, -7.56587088e-02, -2.75987923e-01, -2.09930509e-01, -7.70544559e-02, -7.76188727e-03, 1.85123131e-01, 1.03970412e-02, 2.73186892e-01, 1.20027080e-01, -1.39552653e-01, -1.70047969e-01, -1.44604281e-01, 2.54715830e-01, -7.11432844e-02, 3.86513993e-02, -1.22426920e-01, 2.65537947e-01, 1.06854632e-01, 1.44702211e-01, -8.19202662e-02, 1.59373507e-01])
¡Excelente! Con estos conceptos básicos podrás realizar este curso ? pasa a la siguiente lección del curso de Procesamiento de Textos en Python para aprender sobre Análisis de Sentimientos en Python:
muy buen tutorial
muchas gracias
me encantaria que me explicaran como poder ver
este word embedding en el embedding projector
hice mi propio modelo con un texto propio, de pura casualidad lo logre ver en el embedding projector
solamente una vez, despues ya no lo pude visualizar
gracias por su atencion
[…] Curso de procesamiento de textos – Gensim: […]
[…] Curso de procesamiento de textos – Gensim […]
[…] Curso de procesamiento de textos – Gensim […]
[…] Curso de procesamiento de textos – Gensim […]
[…] este campo son el muestreo negativo y la inserción de palabras. La incrustación de palabras, como word2vec, puede considerarse como una capa de representación en una arquitectura de aprendizaje profundo […]
[…] Curso de procesamiento de textos – Gensim […]
[…] Curso de procesamiento de textos – Gensim […]
[…] Curso de procesamiento de textos – Gensim […]
[…] Curso de procesamiento de textos – Gensim […]
[…] Curso de procesamiento de textos – Gensim […]
[…] Curso de procesamiento de textos – Gensim […]