Implementación de Word2Vec con la biblioteca Gensim en Python

I

Introducción

Los seres humanos tienen una capacidad natural para comprender lo que otras personas están diciendo y qué decir en respuesta. Esta habilidad se desarrolla al interactuar constantemente con otras personas y la sociedad durante muchos años. El idioma juega un papel muy importante en cómo interactúan los humanos. Los lenguajes que los humanos usan para interactuar se denominan lenguajes naturales.

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

Los lenguajes naturales son muy flexibles. Suponga que está conduciendo un automóvil y su amigo dice una de estas tres expresiones: “Deténgase”, “Detenga el automóvil”, “Deténgase”. De inmediato comprende que le está pidiendo que detenga el automóvil. 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 unos 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 informáticos siguen una sintaxis estricta. Si desea decirle a una computadora que imprima algo en la pantalla, hay un comando especial para eso. La tarea del procesamiento del lenguaje natural es hacer que las computadoras comprendan y generen el lenguaje humano de una manera similar a los humanos.

Esta es una tarea enorme y hay muchos obstáculos involucrados. Esta conferencia en video 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 de 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 contras.

Enfoques de inserció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 comprender 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 palabras.

Actualmente existen varios enfoques de inserción de palabras y todos tienen sus pros y sus contras. Discutiremos tres de ellos aquí:

  • Bolsa de palabras
  • Esquema TF-IDF
  • Word2Vec

Bolsa de palabras

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

Veremos cómo se acercan las incrustaciones de palabras generadas por la bolsa de palabras con la ayuda de un ejemplo. Suponga que tiene un corpus con tres oraciones.

  • S1 = Amo la lluvia
  • S2 = lluvia lluvia se va
  • S3 = estoy lejos

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

  • Cree un diccionario de palabras únicas del corpus. En el corpus anterior, tenemos las siguientes palabras únicas: [I, love, rain, go, away, am]
  • Analiza la oración. Para cada palabra de 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 (Amo la lluvia), se ve así: [1, 1, 1, 0, 0, 0]. De manera similar, para S2 y S3, el conjunto de representaciones de palabras son [0, 0, 2, 1, 1, 0] y [1, 0, 0, 0, 1, 1], respectivamente.

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

Pros y contras 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 se 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, el modelo de una bolsa de palabras no es muy complejo.

Un gran inconveniente 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.

Imagínese un corpus con miles de artículos. En tal 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 aún contendrá un 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 frases “La botella está en el coche” y “El coche está en la botella” por igual, 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, 2 gramos para la oración “No eres feliz”, son “Tú 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 de bolsa donde 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 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: frecuencia de término (TF) y frecuencia de documento inverso (IDF).

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

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

Por ejemplo, si miramos la oración S1 de la sección anterior, es decir, “Me encanta la lluvia”, cada palabra de la oración aparece una vez y, por lo tanto, tiene una frecuencia de 1. Por el contrario, para S2, es decir, “la lluvia, la lluvia desaparece”, el 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:

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 log(3/2)lo tanto es 0.1760. Por otro lado, si miras 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.

Pros y contras de TF-IDF

Aunque TF-IDF es una mejora con respecto al 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 mucho más cálculo que el enfoque simple de la bolsa de palabras.

Word2Vec

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

Word2Vec devuelve algunos resultados asombrosos. La capacidad de Word2Vec para mantener la relación semántica se refleja en un ejemplo clásico en el que si tienes un vector para la palabra “Rey” y eliminas el vector representado por la palabra “Hombre” del “Rey” y le agregas “Mujeres”, obtenga 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 versiones: modelo de omisión de gramo y modelo de bolsa continua de palabras (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 de omisión de gramo predecirá “amor” y “baile” dada la palabra “a” como entrada.

Por el contrario, el modelo CBOW predecirá “a”, si las palabras de contexto “amor” y “baile” se alimentan como entrada al 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 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 de incrustación es muy pequeño. Cada dimensión del vector de inserción 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 documento: 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

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

Antes de que podamos resumir los artículos de Wikipedia, debemos buscarlos. Para ello usaremos un par de bibliotecas. La primera biblioteca que necesitamos descargar es la biblioteca Beautiful Soup , que es una utilidad de Python muy útil para el raspado 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 . Escribamos un script de Python para extraer el artículo de Wikipedia:

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 usando el urlopenmétodo de la requestclase de la urllibbiblioteca. Luego leemos el contenido del artículo y lo analizamos usando un objeto de la BeautifulSoupclase. Wikipedia almacena el contenido de texto del artículo dentro de petiquetas. Usamos la find_allfunción del BeautifulSoupobjeto para buscar 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 article_textvariable para su uso posterior.

Preprocesamiento

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

# 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 se entrena en una colección de palabras. Primero, necesitamos convertir nuestro artículo en oraciones. Utilizamos la nltk.sent_tokenizeutilidad para convertir nuestro artículo en frases. Para convertir oraciones en palabras, utilizamos la nltk.word_tokenizeutilidad. Como último paso previo al procesamiento, eliminamos todas las palabras vacías del texto.

Una vez que el guión completa su ejecución, el all_wordsobjeto contiene la lista de todas las palabras del artículo. Usaremos 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 Word2Vecclase del gensim.modelspaquete. Necesitamos especificar el valor del min_countparámetro. Un valor de 2 para min_countespecifica que se incluyan solo aquellas palabras en el modelo Word2Vec que aparecen al menos dos veces en el corpus. El siguiente script crea el modelo Word2Vec utilizando el artículo de Wikipedia que raspamos.

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:

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 del modelo

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.

v1 = word2vec.wv['artificial']

El vector v1contiene 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 sido producido por 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 ocurrencia se establece en 1, el tamaño de el 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

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

Eche un vistazo al siguiente guión:

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

Si imprime la sim_wordsvariable en la consola, verá las palabras más similares a “inteligencia” como se muestra a continuación:

('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, que en realidad tiene sentido. De manera similar, palabras como “humano” y “artificial” a menudo coexisten 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, 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 inserción de palabras más utilizados junto con sus pros y contras como una comparación con Word2Vec.

Le sugiero que cree su propio modelo 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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad