Implementación de Word2Vec con la librería Gensim en Python

Introducción

Los humanos tienen una habilidad natural para entender lo que otras personas están diciendo y qué decir en respuesta. Esta capacidad se desarrolla al interactuar constantemente con otras personas y con la sociedad durante muchos años. El lenguaje desempeña un papel muy importante en la forma en que los humanos interactúan. Los lenguajes que los humanos utilizan para interactuar se denominan lenguajes naturales.

Las reglas de los distintos lenguajes naturales son diferentes. Sin embargo, hay una cosa en común en los lenguajes naturales: la flexibilidad y la evolución.

Los lenguajes naturales son altamente muy flexibles. Supongamos que estás conduciendo un coche y tu amigo dice una de estas tres frases: «Deténgase», «Detenga el coche», «Deténgase». Inmediatamente entiendes que te está pidiendo que pares el coche. Esto se debe a que las lenguas naturales son extremadamente flexibles. Hay múltiples formas de decir una cosa.

Otro aspecto importante de las lenguas naturales es el hecho de que evolucionan constantemente. Por ejemplo, hace unos años no existía un término como «Google it», que se refiere a la búsqueda de algo en el motor de búsqueda de Google. Los lenguajes naturales están siempre en evolución.

Por el contrario, los lenguajes informáticos siguen una sintaxis estricta. Si quieres decirle a un ordenador que imprima algo en la pantalla, hay un comando especial para ello. La tarea del Procesamiento del Lenguaje Natural es hacer que los ordenadores entiendan y generen el lenguaje humano de una manera similar a la de los humanos.

Esta es una tarea enorme y hay muchos obstáculos involucrados. Esta video conferencia de la Universidad de Michigan contiene una muy buena explicación de por qué el PLN es tan difícil.

En este artículo implementaremos la técnica de incrustación de palabras Word2Vec utilizada para crear vectores de palabras con la biblioteca Gensim de Python. Sin embargo, antes de pasar directamente a la sección de codificación, primero repasaremos brevemente algunas de las técnicas de incrustación de palabras más utilizadas, junto con sus pros y sus contras.

Enfoques de incrustación de palabras

Una de las razones por las que el Procesamiento del Lenguaje Natural es un problema difícil de resolver es el hecho de que, a diferencia de los seres humanos, los ordenadores sólo pueden entender números. Tenemos que representar las palabras en un formato numérico que sea comprensible para los ordenadores. La incrustación de palabras se refiere a las representaciones numéricas de las palabras.

Actualmente existen varios enfoques de incrustación de palabras y todos ellos tienen sus pros y sus contras. Aquí discutiremos tres de ellos:

  1. Bolsa de palabras
  2. Esquema TF-IDF
  3. Word2Vec

Bolsa de palabras

El enfoque de la bolsa de palabras es uno de los enfoques de incrustación de palabras más simples. Los siguientes son los pasos para generar incrustaciones de palabras utilizando el enfoque de bolsa de palabras.

Veremos las incrustaciones de palabras generadas por el enfoque de bolsa de palabras con la ayuda de un ejemplo. Suponga que tiene un corpus con tres frases.

  • S1 = Me encanta la lluvia
  • S2 = la lluvia se va
  • S3 = estoy lejos

Para convertir las frases anteriores en sus correspondientes representaciones de incrustación de palabras utilizando el enfoque de bolsa de palabras, tenemos que realizar los siguientes pasos:

Nótese que para S2 hemos añadido 2 en lugar de «lluvia» en el diccionario; esto se debe a que S2 contiene «lluvia» dos veces.

Pros y contras de la bolsa de palabras

El enfoque de la bolsa de palabras tiene tanto pros como contras. La principal ventaja del enfoque de bolsa de palabras es que no se necesita un corpus muy grande de palabras para obtener buenos resultados. Puede ver que construimos un modelo de bolsa de palabras muy básico con tres frases. Desde el punto de vista computacional, un modelo de bolsa de palabras no es muy complejo.

Una de las principales desventajas del enfoque de la bolsa de palabras es el hecho de que tenemos que crear enormes vectores con espacios vacíos para representar un número (matriz dispersa), lo que consume memoria y espacio. En el ejemplo anterior, sólo teníamos 3 frases. Sin embargo, puedes ver tres ceros en cada vector.

Imagina un corpus con miles de artículos. En ese caso, el número de palabras únicas en un diccionario puede ser de miles. Si un documento contiene el 10% de las palabras únicas, el vector de incrustación correspondiente seguirá conteniendo el 90% de ceros.

Otro problema importante del enfoque de bolsa de palabras es el hecho de que no mantiene ninguna información de contexto. No le importa el orden en que aparecen las palabras en una frase. Por ejemplo, trata por igual las frases «La botella está en el coche» y «El coche está en la botella», que son frases totalmente diferentes.

Un tipo de enfoque de bolsa de palabras, conocido como n-gramas, puede ayudar a mantener la relación entre las palabras. N-grama se refiere a una secuencia contigua de n palabras. Por ejemplo, los n-gramas para la frase «No eres feliz», son «Eres», «no eres» y «no eres feliz». Aunque el enfoque de n-gramas es capaz de capturar las relaciones entre las palabras, el tamaño del conjunto de características crece exponencialmente con demasiados n-gramas.

Esquema TF-IDF

El esquema TF-IDF es un tipo de enfoque de bolsa de palabras en el que en lugar de añadir ceros y unos en el vector de incrustación, se añaden números flotantes que contienen más información útil en comparación con los ceros y los unos. La idea que subyace al esquema TF-IDF es el hecho de que las palabras que tienen una alta frecuencia de aparición en un documento, y menos frecuencia de aparición en todos los demás documentos, son más cruciales para la clasificación.

TF-IDF es un producto de dos valores: La frecuencia de términos (TF) y la frecuencia inversa del documento (IDF).

La frecuencia de términos se refiere al número de veces que una palabra aparece en el documento y puede calcularse como:

Term frequence = (Number of Occurences of a word)/(Total words in the document)

Por ejemplo, si observamos la frase S1 de la sección anterior, es decir, «me encanta la lluvia», cada palabra de la frase aparece una vez y, por tanto, tiene una frecuencia de 1. Por el contrario, para S2, es decir «rain rain go away», la frecuencia de «rain» es dos mientras que para el resto de las palabras es 1.

IDF se refiere al logaritmo del número total de documentos dividido por el número de documentos en los que existe la palabra, y se puede calcular como:

IDF(word) = Log((Total number of documents)/(Number of documents containing the word))

Por ejemplo, el valor de IDF para la palabra «rain» es 0,1760, ya que el número total de documentos es 3 y rain aparece en 2 de ellos, por lo tanto log(3/2) es 0,1760. Por otro lado, si nos fijamos en la palabra «amor» de la primera frase, aparece en uno de los tres documentos y, por tanto, su valor IDF es log(3), que es 0,4771.

Pros y contras de TF-IDF

Aunque TF-IDF es una mejora con respecto al enfoque de bolsa de palabras simple y produce mejores resultados para las tareas comunes de PNL, los pros y los contras generales siguen siendo los mismos. Seguimos necesitando crear una enorme matriz dispersa, que también requiere mucho más cálculo que el enfoque de la bolsa de palabras simple.

Word2Vec

El enfoque de incrustación Target=»_blank rel=»nofollow»» href=»https://en.wikipedia.org/wiki/Word2vec»>Word2Vec, desarrollado por Tomas Mikolov, se considera el estado del arte. El enfoque Word2Vec utiliza técnicas basadas en el aprendizaje profundo y las redes neuronales para convertir las palabras en vectores correspondientes de tal manera que los vectores semánticamente similares se acerquen entre sí en un espacio N-dimensional, donde N se refiere a las dimensiones del vector.

Word2Vec devuelve algunos resultados sorprendentes. La capacidad de Word2Vec para mantener la relación semántica se refleja en un ejemplo clásico en el que si se tiene un vector para la palabra «Rey» y se elimina el vector representado por la palabra «Hombre» del «Rey» y se le añade «Mujer», se obtiene un vector que está cerca del vector «Reina». Esta relación se representa comúnmente como:

King - Man + Women = Queen

El modelo Word2Vec viene en dos sabores: Modelo Skip Gram y Modelo Continuous Bag of Words (CBOW).

En el modelo Skip Gram, las palabras del contexto se predicen utilizando la palabra base. Por ejemplo, dada una frase «Me encanta bailar bajo la lluvia», el modelo Skip Gram predecirá «amor» y «bailar» dada la palabra «a» como entrada.

Por el contrario, el modelo CBOW predecirá «a», si las palabras de contexto «amor» y «bailar» se introducen como entrada en el modelo. El modelo aprende estas relaciones utilizando redes neuronales profundas.

Pros y contras de Word2Vec

Word2Vec tiene varias ventajas sobre la bolsa de palabras y el esquema IF-IDF. Word2Vec conserva el significado semántico de las diferentes palabras de un documento. La información de contexto no se pierde. Otra gran ventaja del enfoque Word2Vec es que el tamaño del vector de incrustación es muy pequeño. Cada dimensión del vector de incrustación contiene información sobre un aspecto de la palabra. No necesitamos enormes vectores dispersos, a diferencia de los enfoques de bolsa de palabras y TF-IDF.

Nota: Los detalles matemáticos de cómo funciona Word2Vec implican una explicación de las redes neuronales y la probabilidad softmax, que está fuera del alcance de este artículo. Si quieres entender los fundamentos matemáticos de Word2Vec, por favor lee este artículo: https://arxiv.org/abs/1301.3781

Word2Vec en Python con la biblioteca Gensim

En esta sección, implementaremos el modelo Word2Vec con la ayuda de la biblioteca Gensim de Python. Siga estos pasos:

Creación del corpus

Hemos comentado anteriormente que para crear un modelo Word2Vec, necesitamos un corpus. En las aplicaciones de la vida real, los modelos Word2Vec se crean utilizando miles de millones de documentos. Por ejemplo, el modelo Word2Vec de Google se entrena con 3 millones de palabras y frases. Sin embargo, en aras de la simplicidad, crearemos un modelo Word2Vec utilizando un único artículo de Wikipedia. Nuestro modelo no será tan bueno como el de Google. Sin embargo, es lo suficientemente bueno para explicar cómo se puede implementar el modelo Word2Vec utilizando la biblioteca Gensim.

Antes de que podamos resumir los artículos de Wikipedia, tenemos que recuperarlos. Para ello utilizaremos un par de librerías. La primera biblioteca que necesitamos descargar es la biblioteca Beautiful Soup, que es una utilidad de Python muy útil para el raspado de la web. Ejecute el siguiente comando en el símbolo del sistema para descargar la utilidad Beautiful Soup.

$ pip install beautifulsoup4

Otra biblioteca importante que necesitamos para analizar XML y HTML es la biblioteca lxml. Ejecute el siguiente comando en el símbolo del sistema para descargar lxml:

$ pip install lxml

El artículo que vamos a raspar es el artículo de Wikipedia sobre Inteligencia Artificial. Vamos a escribir un Script en Python para scrapear el artículo de Wikipedia:

En el script anterior, primero descargamos el artículo de Wikipedia utilizando el método urlopen de la clase request de la librería urllib. A continuación, leemos el contenido del artículo y lo analizamos utilizando un objeto de la clase BeautifulSoup. Wikipedia almacena el contenido del texto del artículo dentro de las etiquetas p. Utilizamos la función find_all del objeto BeautifulSoup para obtener todo el contenido de las etiquetas de párrafo del artículo.

Por último, unimos todos los párrafos y almacenamos el artículo raspado en la variable article_text para su uso posterior.

Preprocesamiento

En este punto ya hemos importado el artículo. El siguiente paso es preprocesar el contenido para el modelo Word2Vec. El siguiente script preprocesa el texto:

En el script anterior, convertimos todo el texto a minúsculas y luego eliminamos todos los dígitos, caracteres especiales y espacios extra del texto. Tras el preprocesamiento, sólo nos quedan las palabras.

El modelo Word2Vec se entrena con una colección de palabras. Primero, tenemos que convertir nuestro artículo en frases. Utilizamos la utilidad nltk.sent_tokenize para convertir nuestro artículo en frases. Para convertir las frases en palabras, utilizamos la utilidad nltk.word_tokenize. Como último paso de preprocesamiento, eliminamos todas las palabras de parada del texto.

Después de que el script complete su ejecución, el objeto all_words contiene la lista de todas las palabras del artículo. Utilizaremos esta lista para crear nuestro modelo Word2Vec con la biblioteca Gensim.

Creación del modelo Word2Vec

Con Gensim, es extremadamente sencillo crear el modelo Word2Vec. La lista de palabras se pasa a la clase Word2Vec del paquete gensim.models. Tenemos que especificar el valor del parámetro min_count. Un valor de 2 para min_count especifica que se incluyan en el modelo Word2Vec sólo las palabras que aparecen al menos dos veces en el corpus. El siguiente script crea el modelo Word2Vec utilizando el artículo de Wikipedia que hemos raspado.

from gensim.models import Word2Vecword2vec = Word2Vec(all_words, min_count=2)

Para ver el diccionario de palabras únicas que existen al menos dos veces en el corpus, ejecute el siguiente script:

vocabulary = word2vec.wv.vocabprint(vocabulary)

Cuando se ejecute el script anterior, verá una lista de todas las palabras únicas que aparecen al menos dos veces.

Análisis del modelo

Hemos creado con éxito nuestro modelo Word2Vec en la última sección. Ahora es el momento de explorar lo que hemos creado.

Búsqueda de vectores para una palabra

Sabemos que el modelo Word2Vec convierte las palabras en sus correspondientes vectores. Veamos cómo podemos ver la representación vectorial de una palabra concreta.

v1 = word2vec.wv

El vector v1 contiene la representación vectorial para la palabra «artificial». Por defecto, un vector de cien dimensiones es creado por Gensim Word2Vec. Se trata de un vector mucho, mucho más pequeño en comparación con lo que habría producido la bolsa de palabras. Si utilizamos el enfoque de bolsa de palabras para incrustar el artículo, la longitud del vector para cada uno será de 1206, ya que hay 1206 palabras únicas con una frecuencia mínima de 2. Si la frecuencia mínima de aparición se establece en 1, el tamaño del vector de bolsa de palabras aumentará aún más. Por otro lado, los vectores generados a través de Word2Vec no se ven afectados por el tamaño del vocabulario.

Encontrar palabras similares

Antes dijimos que la información contextual de las palabras no se pierde utilizando el enfoque Word2Vec. Podemos comprobarlo encontrando todas las palabras similares a la palabra «inteligencia».

Echa un vistazo al siguiente script:

sim_words = word2vec.wv.most_similar('intelligence')

Si imprimes la variable sim_words en la consola, verás las palabras más parecidas a «inteligencia» como se muestra a continuación:

Desde la salida, puedes ver las palabras similares a «inteligencia» junto con su índice de similitud. Según el modelo, la palabra «ai» es la más parecida a «inteligencia», lo cual tiene sentido. Asimismo, palabras como «humano» y «artificial» suelen coexistir con la palabra «inteligencia». Nuestro modelo ha capturado con éxito estas relaciones utilizando un solo artículo de Wikipedia.

Conclusión

En este artículo, hemos implementado un modelo de incrustación de palabras Word2Vec con la biblioteca Gensim de Python. Lo hicimos raspando un artículo de Wikipedia y construimos nuestro modelo Word2Vec usando el artículo como corpus. También revisamos brevemente los enfoques de incrustación de palabras más utilizados junto con sus ventajas y desventajas como una comparación con Word2Vec.

Te sugeriría crear un modelo Word2Vec propio con la ayuda de cualquier corpus de texto y ver si puedes obtener mejores resultados en comparación con el enfoque de bolsa de palabras.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.