Implementando Word2Vec con Gensim Library en Python

Los seres humanos tienen una capacidad natural para comprender lo que otras personas dicen y qué decir en respuesta. Esta habilidad se desarrolla interactuando constantemente con...

Introducción

Los seres humanos tienen una capacidad natural para comprender lo que otras personas dicen y qué decir en respuesta. Esta habilidad se desarrolla interactuando consistentemente con otras personas y la sociedad durante muchos años. El lenguaje juega un papel muy importante en la forma en que los humanos interactúan. Los lenguajes que los humanos usan para la interacción se llaman lenguajes naturales.

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

Los lenguajes naturales son muy, muy flexibles. Suponga que está conduciendo un automóvil y su amigo dice uno de estos tres enunciados: "Deténgase", "Detenga el automóvil", "Alto". Inmediatamente comprendes que te está pidiendo que detengas el auto. Esto se debe a que los lenguajes naturales son extremadamente flexibles. Hay varias formas de decir una cosa.

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

Por el contrario, los lenguajes de programación siguen una sintaxis estricta. Si quiere decirle a una computadora que imprima algo en la pantalla, hay un comando especial para eso. La tarea del Procesamiento natural del lenguaje es hacer que las computadoras entiendan y generen el lenguaje humano de forma similar a los humanos.

Esta es una tarea enorme y hay muchos obstáculos involucrados. Esta videoconferencia de la Universidad de Michigan contiene una muy buena explicación de por qué la PNL 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 Gensim de Python. biblioteca gensim/). Sin embargo, antes de saltar directamente a la sección de codificación, primero revisaremos brevemente algunas de las técnicas de incrustación de palabras más utilizadas, junto con sus ventajas y desventajas.

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, las computadoras solo pueden entender números. Tenemos que representar las palabras en un formato numérico que sea comprensible para las computadoras. 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í hablaremos de 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 pasos para generar incrustaciones de palabras utilizando el enfoque de bolsa de palabras.

Veremos las incrustaciones de palabras generadas por el enfoque de la bolsa de palabras con la ayuda de un ejemplo. Supongamos que tienes un cuerpo con tres oraciones.

  • S1 = Me encanta la lluvia
  • S2 = lluvia lluvia desaparecer
  • S3 = estoy fuera

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

  1. Crear un diccionario de palabras únicas del corpus. En el corpus anterior, tenemos las siguientes palabras únicas: [I, love, rain, go, away, am]
  2. Analice la oración. Para cada palabra en la oración, agregue 1 en lugar de la palabra en el diccionario y agregue cero para todas las demás palabras que no existen en el diccionario. Por ejemplo, la representación de la bolsa de palabras para la oración S1 (Me encanta la lluvia), se ve así: [1, 1, 1, 0, 0, 0]. De manera similar, para S2 y S3, las representaciones de la bolsa de palabras son [0, 0, 2, 1, 1, 0] y [1, 0, 0, 0, 1, 1], respectivamente.

Note que para S2 agregamos 2 en lugar de "lluvia" en el diccionario; esto se debe a que S2 contiene "lluvia" dos veces.

Ventajas y desventajas de Bag of Words

El enfoque de la bolsa de palabras tiene pros y contras. La principal ventaja del enfoque de la bolsa de palabras es que no necesita un gran corpus de palabras para obtener buenos resultados. Puedes ver que construimos un modelo de bolsa de palabras muy básico con tres oraciones. Computacionalmente, un modelo de bolsa de palabras no es muy complejo.

Una desventaja importante del enfoque de la bolsa de palabras es el hecho de que necesitamos crear vectores enormes con espacios vacíos para representar un número (matriz dispersa) que consume memoria y espacio. En el ejemplo anterior, solo teníamos 3 oraciones. Sin embargo, puedes ver tres ceros en cada vector.

Imagina un corpus con miles de artículos. En tal caso, la cantidad 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 con el enfoque de la 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 oración. Por ejemplo, trata las oraciones "La botella está en el carro" y "El carro está en la botella" por igual, que son oraciones 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, 2 gramos para la oración "No eres feliz", son "Eres", "no eres" y "no eres feliz". Aunque el enfoque de n-gramas es capaz de capturar relaciones entre 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 palabras clave en el que, en lugar de agregar ceros y unos en el vector de incrustación, agrega números flotantes que contienen información más útil en comparación con ceros y unos. La idea detrás del esquema TF-IDF es el hecho de que las palabras que tienen una alta frecuencia de aparición en un documento y una menor 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: Frecuencia de término (TF) y Frecuencia de documento inversa (IDF).

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

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

Por ejemplo, si observamos la oración S1 de la sección anterior, es decir, "Me encanta la lluvia", cada palabra de la oración ocurre una vez y, por lo tanto, tiene una frecuencia de 1. Por el contrario, para S2, es decir, "lluvia, lluvia, vete ", la frecuencia de "lluvia" es dos mientras que para el resto de las palabras es 1.

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

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

Por ejemplo, el valor IDF para la palabra "lluvia" es 0,1760, ya que el número total de documentos es 3 y la lluvia aparece en 2 de ellos, por lo que log(3/2) es 0,1760. Por otro lado, si observa la palabra "amor" en la primera oración, aparece en uno de los tres documentos y, por lo tanto, su valor IDF es log(3), que es 0.4771.

Ventajas y desventajas de TF-IDF

Aunque TF-IDF es una mejora sobre el enfoque simple de la bolsa de palabras y produce mejores resultados para las tareas comunes de PNL, los pros y los contras generales siguen siendo los mismos. Todavía necesitamos crear una enorme matriz dispersa, que también requiere muchos más cálculos que el enfoque de una simple bolsa de palabras.

Palabra2Vec

El enfoque de incorporación de <a target="_blank rel="nofollow"" href="https://en.wikipedia.org/wiki/Word2vec">Word2Vec, desarrollado por [Tomás Mikolov] (https://research.fb.com/people/mikolov-tomas/), se considera el estado del arte. El enfoque de Word2Vec utiliza técnicas basadas en aprendizaje profundo y redes neuronales para convertir palabras en vectores correspondientes de tal manera que los vectores semánticamente similares estén cerca uno del otro 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 tiene un vector para la palabra "Rey" y elimina el vector representado por la palabra "Hombre" del "Rey" y le agregas "Mujeres", obtienes un vector que está cerca del vector "Reina". Esta relación se representa comúnmente como:

1
King - Man + Women = Queen

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

En el modelo Skip Gram, las palabras de contexto se predicen utilizando la palabra base. Por ejemplo, dada una oración "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 "baile" se introducen como entrada al modelo. El modelo aprende estas relaciones utilizando redes neuronales profundas.

Ventajas y desventajas de Word2Vec

Word2Vec tiene varias ventajas sobre la bolsa de palabras y el esquema IF-IDF. Word2Vec conserva el significado semántico de diferentes palabras en un documento. La información de contexto no se pierde. Otra gran ventaja del enfoque de Word2Vec es que el tamaño del vector incrustado es muy pequeño. Cada dimensión del vector incrustado contiene información sobre un aspecto de la palabra. No necesitamos enormes vectores dispersos, a diferencia de la bolsa de palabras y los enfoques 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á más allá del alcance de este artículo. Si desea comprender los fundamentos matemáticos de Word2Vec, lea 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. Sigue estos pasos:

Creando Corpus

Discutimos anteriormente que para crear un modelo de Word2Vec, necesitamos un corpus. En las aplicaciones de la vida real, los modelos de Word2Vec se crean utilizando miles de millones de documentos. Por ejemplo Modelo Word2Vec de Google se entrena usando 3 millones de palabras y frases. Sin embargo, en aras de la simplicidad, crearemos un modelo de Word2Vec utilizando un único artículo de Wikipedia. Nuestro modelo no será tan bueno como el de Google. Aunque, 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, debemos buscarlos. Para ello utilizaremos un par de bibliotecas. La primera biblioteca que necesitamos descargar es la biblioteca hermosa sopa, que es una utilidad de Python muy útil para el web scraping. Ejecute el siguiente comando en el símbolo del sistema para descargar la utilidad Beautiful Soup.

1
$ 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:

1
$ pip install lxml

El artículo que vamos a raspar es el artículo de Wikipedia sobre [inteligencia artificial] (https://en.wikipedia.org/wiki/Artificial_intelligence). Escribamos un script de Python para raspar el artículo de Wikipedia:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import bs4 as bs
import urllib.request
import re
import nltk

scrapped_data = urllib.request.urlopen('https://en.wikipedia.org/wiki/Artificial_intelligence')
article = scrapped_data .read()

parsed_article = bs.BeautifulSoup(article,'lxml')

paragraphs = parsed_article.find_all('p')

article_text = ""

for p in paragraphs:
    article_text += p.text

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

Finalmente, 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Cleaing the text
processed_article = article_text.lower()
processed_article = re.sub('[^a-zA-Z]', ' ', processed_article )
processed_article = re.sub(r'\s+', ' ', processed_article)

# Preparing the dataset
all_sentences = nltk.sent_tokenize(processed_article)

all_words = [nltk.word_tokenize(sent) for sent in all_sentences]

# Removing Stop Words
from nltk.corpus import stopwords
for i in range(len(all_words)):
    all_words[i] = [w for w in all_words[i] if w not in stopwords.words('english')]

En el script anterior, convertimos todo el texto a minúsculas y luego eliminamos todos los dígitos, caracteres especiales y espacios adicionales del texto. Después del preprocesamiento, solo nos quedan las palabras.

El modelo Word2Vec está entrenado en una colección de palabras. Primero, necesitamos convertir nuestro artículo en oraciones. Usamos la utilidad nltk.sent_tokenize para convertir nuestro artículo en oraciones. Para convertir oraciones en palabras, usamos la utilidad nltk.word_tokenize. Como último paso de preprocesamiento, eliminamos todas las palabras vacías del texto.

Una vez que el script completa su ejecución, el objeto all_words contiene la lista de todas las palabras del artículo. Usaremos esta lista para crear nuestro modelo Word2Vec con la biblioteca Gensim.

Creando el modelo Word2Vec

Con Gensim, es extremadamente sencillo crear un modelo Word2Vec. La lista de palabras se pasa a la clase Word2Vec del paquete gensim.models. Necesitamos especificar el valor para el parámetro min_count. Un valor de 2 para min_count especifica incluir solo aquellas palabras en el modelo Word2Vec que aparecen al menos dos veces en el corpus. El siguiente script crea el modelo Word2Vec usando el artículo de Wikipedia que raspamos.

1
2
3
from gensim.models import Word2Vec

word2vec = 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:

1
2
vocabulary = word2vec.wv.vocab
print(vocabulary)

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

Análisis de modelos {#análisis de modelos}

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

Encontrar vectores para una palabra

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

1
v1 = word2vec.wv['artificial']

El vector v1 contiene la representación vectorial de la palabra "artificial". Por defecto, Gensim Word2Vec crea un vector de cien dimensiones. Este es un vector mucho, mucho más pequeño en comparación con lo que habría producido una bolsa de palabras. Si usamos el enfoque de bolsa de palabras para incrustar el artículo, la longitud del vector para cada uno será 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 de el vector de la 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.

Búsqueda de palabras similares

Anteriormente dijimos que la información contextual de las palabras no se pierde usando el enfoque de Word2Vec. Podemos verificar esto encontrando todas las palabras similares a la palabra "inteligencia".

Echa un vistazo al siguiente script:

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

Si imprime la variable sim_words en la consola, verá las palabras más similares a "intelligence" como se muestra a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
('ai', 0.7124934196472168)
('human', 0.6869025826454163)
('artificial', 0.6208730936050415)
('would', 0.583903431892395)
('many', 0.5610555410385132)
('also', 0.5557990670204163)
('learning', 0.554862380027771)
('search', 0.5522681474685669)
('language', 0.5408136248588562)
('include', 0.5248900055885315)

En el resultado, puede ver las palabras similares a "inteligencia" junto con su índice de similitud. La palabra "ai" es la palabra más similar a "inteligencia" según el modelo, lo que en realidad tiene sentido. Del mismo modo, palabras como "humano" y "artificial" a menudo coexisten con la palabra "inteligencia". Nuestro modelo ha capturado con éxito estas relaciones usando solo un artículo de Wikipedia.

Yendo más lejos: proyecto de extremo a extremo portátil

¿Tu naturaleza inquisitiva te hace querer ir más allá? Recomendamos consultar nuestro Proyecto guiado: ["Subtítulos de imágenes con CNN y Transformers con Keras"](https://wikihtp.com/courses/image-captioning-with-cnns-and -transformadores-con-keras/#cta){target="_blank"}.

En este proyecto guiado, aprenderá a crear un modelo de subtítulos de imágenes, que acepta una imagen como entrada y produce un subtítulo de texto como salida.

Aprenderás a:

  • Preprocesar texto
  • Vectorizar la entrada de texto fácilmente
  • Trabaje con la API tf.data y cree conjuntos de datos de alto rendimiento
  • Cree Transformers desde cero con TensorFlow/Keras y KerasNLP: la adición horizontal oficial a Keras para crear modelos NLP de última generación
  • Cree arquitecturas híbridas donde la salida de una red se codifica para otra

¿Cómo enmarcamos los subtítulos de las imágenes? La mayoría lo considera un ejemplo de aprendizaje profundo generativo, porque estamos enseñando a una red a generar descripciones. Sin embargo, me gusta verlo como una instancia de traducción automática neuronal: estamos traduciendo las características visuales de una imagen en palabras. A través de la traducción, estamos generando una nueva representación de esa imagen, en lugar de simplemente generar un nuevo significado. Verlo como traducción, y solo por generación de extensión, enfoca la tarea bajo una luz diferente y la hace un poco más intuitiva.

Enmarcar el problema como uno de traducción hace que sea más fácil averiguar qué arquitectura querremos usar. Los transformadores solo de codificador son excelentes para comprender el texto (análisis de opinión, clasificación, etc.) porque los codificadores codifican representaciones significativas. Los modelos de solo decodificador son excelentes para la generación (como GPT-3), ya que los decodificadores pueden inferir representaciones significativas en otra secuencia con el mismo significado. La traducción generalmente se realiza mediante una arquitectura de codificador-decodificador, donde los codificadores codifican una representación significativa de una oración (o imagen, en nuestro caso) y los decodificadores aprenden a convertir esta secuencia en otra representación significativa que es más interpretable para nosotros (como una oración).

Conclusión

En este artículo, implementamos un modelo de incrustación de palabras de Word2Vec con la biblioteca Gensim de Python. Hicimos esto 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 en comparación con Word2Vec.

Le sugiero que cree un modelo propio de Word2Vec con la ayuda de cualquier corpus de texto y vea si puede obtener mejores resultados en comparación con el enfoque de la bolsa de palabras. bras.