Implementaci贸n de Word2Vec con la biblioteca Gensim en Python

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *