Python para PNL: trabajar con la biblioteca Gensim (Parte 1)

    Este es el d茅cimo art铆culo de mi serie de art铆culos sobre Python para PNL. En mi art铆culo anterior, expliqu茅 c贸mo StanfordCoreNLP La biblioteca se puede utilizar para realizar diferentes tareas de PNL.

    En este art铆culo, exploraremos el Gensim library, que es otra biblioteca de PNL extremadamente 煤til para Python. Gensim se desarroll贸 principalmente para modelar temas. Sin embargo, ahora admite una variedad de otras tareas de PNL, como convertir palabras en vectores (word2vec), documentos en vectores (doc2vec), encontrar similitudes de texto y res煤menes de texto.

    En este art铆culo y en el pr贸ximo art铆culo de la serie, veremos c贸mo se utiliza la biblioteca Gensim para realizar estas tareas.

    Instalaci贸n de Gensim

    Si usa el instalador pip para instalar sus bibliotecas de Python, puede usar el siguiente comando para descargar la biblioteca de Gensim:

    $ pip install gensim
    

    Alternativamente, si usa la distribuci贸n Anaconda de Python, puede ejecutar el siguiente comando para instalar la biblioteca Gensim:

    $ conda install -c anaconda gensim
    

    Veamos ahora c贸mo podemos realizar diferentes tareas de PNL usando la biblioteca Gensim.

    Crear diccionarios

    Los algoritmos estad铆sticos funcionan con n煤meros, sin embargo, los lenguajes naturales contienen datos en forma de texto. Por lo tanto, se necesita un mecanismo para convertir palabras en n煤meros. De manera similar, despu茅s de aplicar diferentes tipos de procesos en los n煤meros, necesitamos convertir los n煤meros nuevamente en texto.

    Una forma de lograr este tipo de funcionalidad es crear un diccionario que asigne un ID num茅rico a cada palabra 煤nica del documento. El diccionario se puede usar para encontrar el equivalente num茅rico de una palabra y viceversa.

    Creaci贸n de diccionarios utilizando objetos en memoria

    Es muy f谩cil crear diccionarios que mapeen palabras a ID utilizando la biblioteca Gensim de Python. Mira el siguiente gui贸n:

    import gensim
    from gensim import corpora
    from pprint import pprint
    
    text = ["""In computer science, artificial intelligence (AI),
                 sometimes called machine intelligence, is intelligence
                 demonstrated by machines, in contrast to the natural intelligence
                 displayed by humans and animals. Computer science defines
                 AI research as the study of intelligent agents: any device that
                 perceives its environment and takes actions that maximize its chance
                 of successfully achieving its goals."""]
    
    tokens = [[token for token in sentence.split()] for sentence in text]
    gensim_dictionary = corpora.Dictionary(tokens)
    
    print("The dictionary has: " +str(len(gensim_dictionary)) + " tokens")
    
    for k, v in gensim_dictionary.token2id.items():
        print(f'{k:{15}} {v:{10}}')
    

    En el script anterior, primero importamos el gensim biblioteca junto con la corpora m贸dulo de la biblioteca. A continuaci贸n, tenemos un texto (que es la primera parte del primer p谩rrafo del art铆culo de Wikipedia sobre Inteligencia Artificial) almacenado en el text variable.

    Para crear un diccionario, necesitamos una lista de palabras de nuestro texto (tambi茅n conocidas como tokens). En la siguiente l铆nea, dividimos nuestro documento en oraciones y luego las oraciones en palabras.

    tokens = [[token for token in sentence.split()] for sentence in text]
    

    Ahora estamos listos para crear nuestro diccionario. Para hacerlo, podemos usar el Dictionary objeto de la corpora m贸dulo y pasarle la lista de tokens.

    Finalmente, para imprimir el contenido del diccionario reci茅n creado, podemos usar el token2id objeto de la Dictionary clase. La salida del script anterior se ve as铆:

    The dictionary has: 46 tokens
    (AI),                    0
    AI                       1
    Computer                 2
    In                       3
    achieving                4
    actions                  5
    agents:                  6
    and                      7
    animals.                 8
    any                      9
    artificial              10
    as                      11
    by                      12
    called                  13
    chance                  14
    computer                15
    contrast                16
    defines                 17
    demonstrated            18
    device                  19
    displayed               20
    environment             21
    goals.                  22
    humans                  23
    in                      24
    intelligence            25
    intelligence,           26
    intelligent             27
    is                      28
    its                     29
    machine                 30
    machines,               31
    maximize                32
    natural                 33
    of                      34
    perceives               35
    research                36
    science                 37
    science,                38
    sometimes               39
    study                   40
    successfully            41
    takes                   42
    that                    43
    the                     44
    to                      45
    

    La salida muestra cada palabra 煤nica en nuestro texto junto con el ID num茅rico que se le ha asignado a la palabra. La palabra o token es la clave del diccionario y el ID es el valor. Tambi茅n puede ver el ID asignado a la palabra individual usando el siguiente script:

    print(gensim_dictionary.token2id["study"])
    

    En el gui贸n anterior, pasamos la palabra “estudiar” como clave de nuestro diccionario. En la salida, deber铆a ver el valor correspondiente, es decir, el ID de la palabra “estudio”, que es 40.

    Del mismo modo, puede utilizar el siguiente script para encontrar la clave o la palabra de una identificaci贸n espec铆fica.

    print(list(gensim_dictionary.token2id.keys())[list(gensim_dictionary.token2id.values()).index(40)])
    

    Para imprimir los tokens y sus ID correspondientes, usamos un bucle for. Sin embargo, puede imprimir directamente los tokens y sus ID imprimiendo el diccionario, como se muestra aqu铆:

    print(gensim_dictionary.token2id)
    

    El resultado es el siguiente:

    {'(AI),': 0, 'AI': 1, 'Computer': 2, 'In': 3, 'achieving': 4, 'actions': 5, 'agents:': 6, 'and': 7, 'animals.': 8, 'any': 9, 'artificial': 10, 'as': 11, 'by': 12, 'called': 13, 'chance': 14, 'computer': 15, 'contrast': 16, 'defines': 17, 'demonstrated': 18, 'device': 19, 'displayed': 20, 'environment': 21, 'goals.': 22, 'humans': 23, 'in': 24, 'intelligence': 25, 'intelligence,': 26, 'intelligent': 27, 'is': 28, 'its': 29, 'machine': 30, 'machines,': 31, 'maximize': 32, 'natural': 33, 'of': 34, 'perceives': 35, 'research': 36, 'science': 37, 'science,': 38, 'sometimes': 39, 'study': 40, 'successfully': 41, 'takes': 42, 'that': 43, 'the': 44, 'to': 45}
    

    Es posible que el resultado no sea tan claro como el que se imprimi贸 utilizando el bucle, aunque todav铆a cumple su prop贸sito.

    Veamos ahora c贸mo podemos agregar m谩s tokens a un diccionario existente usando un nuevo documento. Mira el siguiente gui贸n:

    text = ["""Colloquially, the term "artificial intelligence" is used to
               describe machines that mimic "cognitive" functions that humans
               associate with other human minds, such as "learning" and "problem solving"""]
    
    tokens = [[token for token in sentence.split()] for sentence in text]
    gensim_dictionary.add_documents(tokens)
    
    print("The dictionary has: " + str(len(gensim_dictionary)) + " tokens")
    print(gensim_dictionary.token2id)
    

    En el gui贸n de arriba tenemos un nuevo documento que contiene la segunda parte del primer p谩rrafo del art铆culo de Wikipedia sobre Inteligencia Artificial. Dividimos el texto en tokens y luego simplemente llamamos al add_documents m茅todo para agregar los tokens a nuestro diccionario existente. Finalmente, imprimimos el diccionario actualizado en la consola.

    La salida del c贸digo se ve as铆:

    The dictionary has: 65 tokens
    {'(AI),': 0, 'AI': 1, 'Computer': 2, 'In': 3, 'achieving': 4, 'actions': 5, 'agents:': 6, 'and': 7, 'animals.': 8, 'any': 9, 'artificial': 10, 'as': 11, 'by': 12, 'called': 13, 'chance': 14, 'computer': 15, 'contrast': 16, 'defines': 17, 'demonstrated': 18, 'device': 19, 'displayed': 20, 'environment': 21, 'goals.': 22, 'humans': 23, 'in': 24, 'intelligence': 25, 'intelligence,': 26, 'intelligent': 27, 'is': 28, 'its': 29, 'machine': 30, 'machines,': 31, 'maximize': 32, 'natural': 33, 'of': 34, 'perceives': 35, 'research': 36, 'science': 37, 'science,': 38, 'sometimes': 39, 'study': 40, 'successfully': 41, 'takes': 42, 'that': 43, 'the': 44, 'to': 45, '"artificial': 46, '"cognitive"': 47, '"learning"': 48, '"problem': 49, 'Colloquially,': 50, 'associate': 51, 'describe': 52, 'functions': 53, 'human': 54, 'intelligence"': 55, 'machines': 56, 'mimic': 57, 'minds,': 58, 'other': 59, 'solving': 60, 'such': 61, 'term': 62, 'used': 63, 'with': 64}
    

    Puede ver que ahora tenemos 65 tokens en nuestro diccionario, mientras que anteriormente ten铆amos 45 tokens.

    Crear diccionarios usando archivos de texto

    En la secci贸n anterior, ten铆amos texto en memoria. 驴Qu茅 pasa si queremos crear un diccionario leyendo un archivo de texto del disco duro? Para hacerlo, podemos usar el simple_process m茅todo del gensim.utils biblioteca. La ventaja de utilizar este m茅todo es que lee el archivo de texto l铆nea por l铆nea y devuelve los tokens en la l铆nea. No tiene que cargar el archivo de texto completo en la memoria para crear un diccionario.

    Antes de ejecutar el siguiente ejemplo, cree un archivo “file1.txt” y agregue el siguiente texto al archivo (esta es la primera mitad del primer p谩rrafo del art铆culo de Wikipedia sobre el calentamiento global).

    Global warming is a long-term rise in the average temperature of the Earth's climate system, an aspect of climate change shown by temperature measurements and by multiple effects of the warming. Though earlier geological periods also experienced episodes of warming, the term commonly refers to the observed and continuing increase in average air and ocean temperatures since 1900 caused mainly by emissions of greenhouse gasses in the modern industrial economy.
    

    Ahora creemos un diccionario que contendr谩 tokens del archivo de texto “file1.txt”:

    from gensim.utils import simple_preprocess
    from smart_open import smart_open
    import os
    
    gensim_dictionary = corpora.Dictionary(simple_preprocess(sentence, deacc=True) for sentence in open(r'E:\text files\file1.txt', encoding='utf-8'))
    
    print(gensim_dictionary.token2id)
    

    En el script de arriba leemos el archivo de texto “file1.txt” l铆nea por l铆nea usando el simple_preprocess m茅todo. El m茅todo devuelve tokens en cada l铆nea del documento. Luego, los tokens se utilizan para crear el diccionario. En la salida, deber铆a ver los tokens y sus ID correspondientes, como se muestra a continuaci贸n:

    {'average': 0, 'climate': 1, 'earth': 2, 'global': 3, 'in': 4, 'is': 5, 'long': 6, 'of': 7, 'rise': 8, 'system': 9, 'temperature': 10, 'term': 11, 'the': 12, 'warming': 13, 'an': 14, 'and': 15, 'aspect': 16, 'by': 17, 'change': 18, 'effects': 19, 'measurements': 20, 'multiple': 21, 'shown': 22, 'also': 23, 'earlier': 24, 'episodes': 25, 'experienced': 26, 'geological': 27, 'periods': 28, 'though': 29, 'air': 30, 'commonly': 31, 'continuing': 32, 'increase': 33, 'observed': 34, 'ocean': 35, 'refers': 36, 'temperatures': 37, 'to': 38, 'caused': 39, 'economy': 40, 'emissions': 41, 'gasses': 42, 'greenhouse': 43, 'industrial': 44, 'mainly': 45, 'modern': 46, 'since': 47}
    

    Del mismo modo, podemos crear un diccionario leyendo varios archivos de texto. Cree otro archivo “file2.txt” y agregue el siguiente texto al archivo (la segunda parte del primer p谩rrafo del art铆culo de Wikipedia sobre el calentamiento global):

    In the modern context the terms global warming and climate change are commonly used interchangeably, but climate change includes both global warming and its effects, such as changes to precipitation and impacts that differ by region.[7][8] Many of the observed warming changes since the 1950s are unprecedented in the instrumental temperature record, and in historical and paleoclimate proxy records of climate change over thousands to millions of years.
    

    Guarde el “archivo2.txt” en el mismo directorio que el “archivo1.txt”.

    La siguiente secuencia de comandos lee ambos archivos y luego crea un diccionario basado en el texto de los dos archivos:

    from gensim.utils import simple_preprocess
    from smart_open import smart_open
    import os
    
    class ReturnTokens(object):
        def __init__(self, dir_path):
            self.dir_path = dir_path
    
        def __iter__(self):
            for file_name in os.listdir(self.dir_path):
                for sentence in open(os.path.join(self.dir_path, file_name), encoding='utf-8'):
                    yield simple_preprocess(sentence)
    
    path_to_text_directory = r"E:text files"
    gensim_dictionary = corpora.Dictionary(ReturnTokens(path_to_text_directory))
    
    print(gensim_dictionary.token2id)
    

    En el script de arriba tenemos un m茅todo ReturnTokens, que toma la ruta del directorio que contiene “file1.txt” y “file2.txt” como 煤nico par谩metro. Dentro del m茅todo iteramos a trav茅s de todos los archivos en el directorio y luego leemos cada archivo l铆nea por l铆nea. los simple_preprocess El m茅todo crea tokens para cada l铆nea. Los tokens de cada l铆nea se devuelven a la funci贸n de llamada utilizando la palabra clave “yield”.

    En el resultado, deber铆a ver los siguientes tokens junto con sus ID:

    {'average': 0, 'climate': 1, 'earth': 2, 'global': 3, 'in': 4, 'is': 5, 'long': 6, 'of': 7, 'rise': 8, 'system': 9, 'temperature': 10, 'term': 11, 'the': 12, 'warming': 13, 'an': 14, 'and': 15, 'aspect': 16, 'by': 17, 'change': 18, 'effects': 19, 'measurements': 20, 'multiple': 21, 'shown': 22, 'also': 23, 'earlier': 24, 'episodes': 25, 'experienced': 26, 'geological': 27, 'periods': 28, 'though': 29, 'air': 30, 'commonly': 31, 'continuing': 32, 'increase': 33, 'observed': 34, 'ocean': 35, 'refers': 36, 'temperatures': 37, 'to': 38, 'caused': 39, 'economy': 40, 'emissions': 41, 'gasses': 42, 'greenhouse': 43, 'industrial': 44, 'mainly': 45, 'modern': 46, 'since': 47, 'are': 48, 'context': 49, 'interchangeably': 50, 'terms': 51, 'used': 52, 'as': 53, 'both': 54, 'but': 55, 'changes': 56, 'includes': 57, 'its': 58, 'precipitation': 59, 'such': 60, 'differ': 61, 'impacts': 62, 'instrumental': 63, 'many': 64, 'record': 65, 'region': 66, 'that': 67, 'unprecedented': 68, 'historical': 69, 'millions': 70, 'over': 71, 'paleoclimate': 72, 'proxy': 73, 'records': 74, 'thousands': 75, 'years': 76}
    

    Creando el Corpus de Bolsa de Palabras

    Los diccionarios contienen asignaciones entre palabras y sus valores num茅ricos correspondientes. Los corpus de la bolsa de palabras de la biblioteca de Gensim se basan en diccionarios y contienen el ID de cada palabra junto con la frecuencia de aparici贸n de la palabra.

    Creaci贸n de un corpus de bolsa de palabras a partir de objetos en memoria

    Mira el siguiente gui贸n:

    import gensim
    from gensim import corpora
    from pprint import pprint
    
    text = ["""In computer science, artificial intelligence (AI),
               sometimes called machine intelligence, is intelligence
               demonstrated by machines, in contrast to the natural intelligence
               displayed by humans and animals. Computer science defines
               AI research as the study of intelligent agents: any device that
               perceives its environment and takes actions that maximize its chance
               of successfully achieving its goals."""]
    
    tokens = [[token for token in sentence.split()] for sentence in text]
    
    gensim_dictionary = corpora.Dictionary()
    gensim_corpus = [gensim_dictionary.doc2bow(token, allow_update=True) for token in tokens]
    
    print(gensim_corpus)
    

    En el script anterior, tenemos texto que dividimos en tokens. A continuaci贸n, inicializamos un Dictionary objeto del corpora m贸dulo. El objeto contiene un m茅todo doc2bow, que b谩sicamente realiza dos tareas:

    • Repite todas las palabras del texto, si la palabra ya existe en el corpus, incrementa el recuento de frecuencia de la palabra.
    • De lo contrario, inserta la palabra en el corpus y establece su recuento de frecuencia en 1

    La salida del script anterior se ve as铆:

    [[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 2), (8, 1), (9, 1), (10, 1), (11, 1), (12, 2), (13, 1), (14, 1), (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1), (25, 3), (26, 1), (27, 1), (28, 1), (29, 3), (30, 1), (31, 1), (32, 1), (33, 1), (34, 2), (35, 1), (36, 1), (37, 1), (38, 1), (39, 1), (40, 1), (41, 1), (42, 1), (43, 2), (44, 2), (45, 1)]]
    

    Es posible que la salida no tenga sentido para usted. D茅jame explicarte. La primera tupla (0,1) b谩sicamente significa que la palabra con ID 0 apareci贸 1 vez en el texto. De manera similar, (25, 3) significa que la palabra con ID 25 apareci贸 tres veces en el documento.

    Imprimamos ahora la palabra y la frecuencia para aclarar las cosas. Agregue las siguientes l铆neas de c贸digo al final del script anterior:

    word_frequencies = [[(gensim_dictionary[id], frequence) for id, frequence in couple] for couple in gensim_corpus]
    print(word_frequencies)
    

    La salida se ve as铆:

    [[('(AI),', 1), ('AI', 1), ('Computer', 1), ('In', 1), ('achieving', 1), ('actions', 1), ('agents:', 1), ('and', 2), ('animals.', 1), ('any', 1), ('artificial', 1), ('as', 1), ('by', 2), ('called', 1), ('chance', 1), ('computer', 1), ('contrast', 1), ('defines', 1), ('demonstrated', 1), ('device', 1), ('displayed', 1), ('environment', 1), ('goals.', 1), ('humans', 1), ('in', 1), ('intelligence', 3), ('intelligence,', 1), ('intelligent', 1), ('is', 1), ('its', 3), ('machine', 1), ('machines,', 1), ('maximize', 1), ('natural', 1), ('of', 2), ('perceives', 1), ('research', 1), ('science', 1), ('science,', 1), ('sometimes', 1), ('study', 1), ('successfully', 1), ('takes', 1), ('that', 2), ('the', 2), ('to', 1)]]
    

    En el resultado, puede ver que la palabra “inteligencia” aparece tres veces. Del mismo modo, la palabra “eso” aparece dos veces.

    Creaci贸n de un corpus de bolsa de palabras a partir de archivos de texto

    Como los diccionarios, tambi茅n podemos crear un bolsa de palabras corpus leyendo un archivo de texto. Mira el siguiente c贸digo:

    from gensim.utils import simple_preprocess
    from smart_open import smart_open
    import os
    
    tokens = [simple_preprocess(sentence, deacc=True) for sentence in open(r'E:text filesfile1.txt', encoding='utf-8')]
    
    gensim_dictionary = corpora.Dictionary()
    gensim_corpus = [gensim_dictionary.doc2bow(token, allow_update=True) for token in tokens]
    word_frequencies = [[(gensim_dictionary[id], frequence) for id, frequence in couple] for couple in gensim_corpus]
    
    print(word_frequencies)
    

    En el script anterior, creamos una bolsa de corpus de palabras usando “file1.txt”. En el resultado, deber铆a ver las palabras en el primer p谩rrafo del art铆culo sobre calentamiento global en Wikipedia.

    [[('average', 1), ('climate', 1), ('earth', 1), ('global', 1), ('in', 1), ('is', 1), ('long', 1), ('of', 1), ('rise', 1), ('system', 1), ('temperature', 1), ('term', 1), ('the', 2), ('warming', 1)], [('climate', 1), ('of', 2), ('temperature', 1), ('the', 1), ('warming', 1), ('an', 1), ('and', 1), ('aspect', 1), ('by', 2), ('change', 1), ('effects', 1), ('measurements', 1), ('multiple', 1), ('shown', 1)], [('of', 1), ('warming', 1), ('also', 1), ('earlier', 1), ('episodes', 1), ('experienced', 1), ('geological', 1), ('periods', 1), ('though', 1)], [('average', 1), ('in', 1), ('term', 1), ('the', 2), ('and', 2), ('air', 1), ('commonly', 1), ('continuing', 1), ('increase', 1), ('observed', 1), ('ocean', 1), ('refers', 1), ('temperatures', 1), ('to', 1)], [('in', 1), ('of', 1), ('the', 1), ('by', 1), ('caused', 1), ('economy', 1), ('emissions', 1), ('gasses', 1), ('greenhouse', 1), ('industrial', 1), ('mainly', 1), ('modern', 1), ('since', 1)]]
    

    La salida muestra que las palabras como “de”, “el”, “por” y “y” aparecen dos veces.

    Del mismo modo, puede crear un corpus de bolsa de palabras utilizando varios archivos de texto, como se muestra a continuaci贸n:

    from gensim.utils import simple_preprocess
    from smart_open import smart_open
    import os
    
    class ReturnTokens(object):
        def __init__(self, dir_path):
            self.dir_path = dir_path
    
        def __iter__(self):
            for file_name in os.listdir(self.dir_path):
                for sentence in open(os.path.join(self.dir_path, file_name), encoding='utf-8'):
                    yield simple_preprocess(sentence)
    
    path_to_text_directory = r"E:text files"
    
    gensim_dictionary = corpora.Dictionary()
    gensim_corpus = [gensim_dictionary.doc2bow(token, allow_update=True) for token in ReturnTokens(path_to_text_directory)]
    word_frequencies = [[(gensim_dictionary[id], frequence) for id, frequence in couple] for couple in gensim_corpus]
    
    print(word_frequencies)
    

    La salida del script anterior se ve as铆:

    [[('average', 1), ('climate', 1), ('earth', 1), ('global', 1), ('in', 1), ('is', 1), ('long', 1), ('of', 1), ('rise', 1), ('system', 1), ('temperature', 1), ('term', 1), ('the', 2), ('warming', 1)], [('climate', 1), ('of', 2), ('temperature', 1), ('the', 1), ('warming', 1), ('an', 1), ('and', 1), ('aspect', 1), ('by', 2), ('change', 1), ('effects', 1), ('measurements', 1), ('multiple', 1), ('shown', 1)], [('of', 1), ('warming', 1), ('also', 1), ('earlier', 1), ('episodes', 1), ('experienced', 1), ('geological', 1), ('periods', 1), ('though', 1)], [('average', 1), ('in', 1), ('term', 1), ('the', 2), ('and', 2), ('air', 1), ('commonly', 1), ('continuing', 1), ('increase', 1), ('observed', 1), ('ocean', 1), ('refers', 1), ('temperatures', 1), ('to', 1)], [('in', 1), ('of', 1), ('the', 1), ('by', 1), ('caused', 1), ('economy', 1), ('emissions', 1), ('gasses', 1), ('greenhouse', 1), ('industrial', 1), ('mainly', 1), ('modern', 1), ('since', 1)], [('climate', 1), ('global', 1), ('in', 1), ('the', 2), ('warming', 1), ('and', 1), ('change', 1), ('commonly', 1), ('modern', 1), ('are', 1), ('context', 1), ('interchangeably', 1), ('terms', 1), ('used', 1)], [('climate', 1), ('global', 1), ('warming', 1), ('and', 2), ('change', 1), ('effects', 1), ('to', 1), ('as', 1), ('both', 1), ('but', 1), ('changes', 1), ('includes', 1), ('its', 1), ('precipitation', 1), ('such', 1)], [('in', 1), ('of', 1), ('temperature', 1), ('the', 3), ('warming', 1), ('by', 1), ('observed', 1), ('since', 1), ('are', 1), ('changes', 1), ('differ', 1), ('impacts', 1), ('instrumental', 1), ('many', 1), ('record', 1), ('region', 1), ('that', 1), ('unprecedented', 1)], [('climate', 1), ('in', 1), ('of', 2), ('and', 2), ('change', 1), ('to', 1), ('historical', 1), ('millions', 1), ('over', 1), ('paleoclimate', 1), ('proxy', 1), ('records', 1), ('thousands', 1), ('years', 1)]]
    

    Creaci贸n de TF-IDF Corpus

    El enfoque de la bolsa de palabras funciona bien para convertir texto en n煤meros. Sin embargo, tiene un inconveniente. Asigna una puntuaci贸n a una palabra en funci贸n de su aparici贸n en un documento en particular. No tiene en cuenta el hecho de que la palabra tambi茅n puede tener una alta frecuencia de apariciones en otros documentos. TF-IDF resuelve este problema.

    El t茅rmino frecuencia se calcula como:

    Term frequency = (Frequency of the word in a document)/(Total words in the document)
    

    Y la frecuencia inversa del documento se calcula como:

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

    Usando la biblioteca Gensim, podemos crear f谩cilmente un corpus TF-IDF:

    import gensim
    from gensim import corpora
    from pprint import pprint
    
    text = ["I like to play Football",
           "Football is the best game",
           "Which game do you like to play ?"]
    
    tokens = [[token for token in sentence.split()] for sentence in text]
    
    gensim_dictionary = corpora.Dictionary()
    gensim_corpus = [gensim_dictionary.doc2bow(token, allow_update=True) for token in tokens]
    
    from gensim import models
    import numpy as np
    
    tfidf = models.TfidfModel(gensim_corpus, smartirs="ntc")
    
    for sent in tfidf[gensim_corpus]:
        print([[gensim_dictionary[id], np.around(frequency, decimals=2)] for id, frequency in sent])
    

    Para encontrar el valor de TF-IDF, podemos usar el TfidfModel clase de la models m贸dulo de la biblioteca Gensim. Simplemente tenemos que pasar la bolsa de corpus de palabras como par谩metro al constructor del TfidfModel clase. En la salida, ver谩 todas las palabras en las tres oraciones, junto con sus valores TF-IDF:

    [['Football', 0.3], ['I', 0.8], ['like', 0.3], ['play', 0.3], ['to', 0.3]]
    [['Football', 0.2], ['best', 0.55], ['game', 0.2], ['is', 0.55], ['the', 0.55]]
    [['like', 0.17], ['play', 0.17], ['to', 0.17], ['game', 0.17], ['?', 0.47], ['Which', 0.47], ['do', 0.47], ['you', 0.47]]
    

    Descarga de modelos y conjuntos de datos integrados de Gensim

    Gensim viene con una variedad de conjuntos de datos integrados y modelos de incrustaci贸n de palabras que se pueden usar directamente.

    Para descargar un modelo o conjunto de datos incorporado, podemos usar el downloader clase de la gensim biblioteca. Luego podemos llamar al m茅todo de carga en el downloader class para descargar el paquete deseado. Mira el siguiente c贸digo:

    import gensim.downloader as api
    
    w2v_embedding = api.load("glove-wiki-gigaword-100")
    

    Con los comandos anteriores, descargamos el modelo de incrustaci贸n de palabras “glove-wiki-gigaword-100”, que se basa b谩sicamente en el texto de Wikipedia y tiene 100 dimensiones. Intentemos encontrar las palabras similares a “toyota” usando nuestro modelo de incrustaci贸n de palabras. Utilice el siguiente c贸digo para hacerlo:

    w2v_embedding.most_similar('toyota')
    

    En la salida, deber铆a ver los siguientes resultados:

    [('honda', 0.8739858865737915),
     ('nissan', 0.8108116984367371),
     ('automaker', 0.7918163537979126),
     ('mazda', 0.7687169313430786),
     ('bmw', 0.7616022825241089),
     ('ford', 0.7547588348388672),
     ('motors', 0.7539199590682983),
     ('volkswagen', 0.7176680564880371),
     ('prius', 0.7156582474708557),
     ('chrysler', 0.7085398435592651)]
    

    Puedes ver que todos los resultados son muy relevantes para la palabra “toyota”. El n煤mero de la fracci贸n corresponde al 铆ndice de similitud. Un 铆ndice de similitud m谩s alto significa que la palabra es m谩s relevante.

    Conclusi贸n

    La biblioteca Gensim es una de las bibliotecas de Python m谩s populares para NLP. En este art铆culo, exploramos brevemente c贸mo se puede usar la biblioteca Gensim para realizar tareas como la creaci贸n de un diccionario y un corpus. Tambi茅n vimos c贸mo descargar m贸dulos incorporados de Gensim. En nuestro pr贸ximo art铆culo, veremos c贸mo realizar el modelado de temas a trav茅s de la biblioteca Gensim.

    Etiquetas:

    Deja una respuesta

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