Python para PNL: tokenizaci贸n, derivaci贸n y lematizaci贸n con la biblioteca SpaCy

    En el art铆culo anterior, comenzamos nuestra discusi贸n sobre c贸mo hacer procesamiento de lenguaje natural con Python. Vimos c贸mo leer y escribir archivos de texto y PDF. En este art铆culo, comenzaremos a trabajar con espacio biblioteca para realizar algunas tareas m谩s b谩sicas de PNL, como tokenizaci贸n, derivaci贸n y lematizaci贸n.

    Introducci贸n a SpaCy

    La biblioteca spaCy es una de las bibliotecas NLP m谩s populares junto con NLTK. La diferencia b谩sica entre las dos bibliotecas es el hecho de que NLTK contiene una amplia variedad de algoritmos para resolver un problema, mientras que spaCy contiene solo uno, pero el mejor algoritmo para resolver un problema.

    NLTK se lanz贸 en 2001, mientras que spaCy es relativamente nuevo y se desarroll贸 en 2015. En esta serie de art铆culos sobre PNL, nos ocuparemos principalmente de spaCy, debido a su naturaleza de vanguardia. Sin embargo, tambi茅n tocaremos NLTK cuando sea m谩s f谩cil realizar una tarea usando NLTK en lugar de spaCy.

    Instalaci贸n de spaCy

    Si usa el instalador de pip para instalar sus bibliotecas de Python, vaya a la l铆nea de comando y ejecute la siguiente declaraci贸n:

    $ pip install -U spacy
    

    De lo contrario, si est谩 utilizando Anaconda, debe ejecutar el siguiente comando en el indicador de Anaconda:

    $ conda install -c conda-forge spacy
    

    Una vez que descargue e instale spaCy, el siguiente paso es descargar el modelo de idioma. Usaremos el modelo de idioma ingl茅s. El modelo de lenguaje se utiliza para realizar una variedad de tareas de PNL, que veremos en una secci贸n posterior.

    El siguiente comando descarga el modelo de lenguaje:

    $ python -m spacy download en
    

    Funcionalidad b谩sica

    Antes de profundizar en las diferentes funciones de SpaCy, veamos brevemente c贸mo trabajar con 茅l.

    Como primer paso, debe importar el spacy biblioteca de la siguiente manera:

    import spacy
    

    A continuaci贸n, necesitamos cargar el modelo de lenguaje spaCy.

    sp = spacy.load('en_core_web_sm')
    

    En el script de arriba usamos el load funci贸n de la spacy biblioteca para cargar el modelo b谩sico del idioma ingl茅s. El modelo se almacena en el sp variable.

    Creemos ahora un peque帽o documento usando este modelo. Un documento puede ser una oraci贸n o un grupo de oraciones y puede tener una extensi贸n ilimitada. La siguiente secuencia de comandos crea un documento spaCy simple.

    sentence = sp(u'Manchester United is looking to sign a forward for $90 million')
    

    SpaCy divide autom谩ticamente su documento en tokens cuando se crea un documento utilizando el modelo.

    Una ficha simplemente se refiere a una parte individual de una oraci贸n que tiene alg煤n valor sem谩ntico. Veamos qu茅 tokens tenemos en nuestro documento:

    for word in sentence:
        print(word.text)
    

    La salida del script anterior se ve as铆:

    Manchester
    United
    is
    looking
    to
    sign
    a
    forward
    for
    $
    90
    million
    

    Puede ver que tenemos los siguientes tokens en nuestro documento. Tambi茅n podemos ver el partes de la oraci贸n de cada uno de estos tokens usando el .pos_ atributo que se muestra a continuaci贸n:

    for word in sentence:
        print(word.text,  word.pos_)
    

    Salida:

    Manchester PROPN
    United PROPN
    is VERB
    looking VERB
    to PART
    sign VERB
    a DET
    forward NOUN
    for ADP
    $ SYM
    90 NUM
    million NUM
    

    Puede ver que a cada palabra o s铆mbolo de nuestra oraci贸n se le ha asignado una parte del discurso. Por ejemplo, “Manchester” ha sido etiquetado como un nombre propio, “Looking” ha sido etiquetado como un verbo, y as铆 sucesivamente.

    Finalmente, adem谩s de las partes del discurso, tambi茅n podemos ver las dependencias.

    Creemos otro documento:

    sentence2 = sp(u"Manchester United isn't looking to sign any forward.")
    

    Para el an谩lisis de dependencias, el atributo dep_ se utiliza como se muestra a continuaci贸n:

    for word in sentence2:
        print(word.text,  word.pos_, word.dep_)
    

    La salida se ve as铆:

    Manchester PROPN compound
    United PROPN nsubj
    is VERB aux
    n't ADV neg
    looking VERB ROOT
    to PART aux
    sign VERB xcomp
    any DET advmod
    forward ADV advmod
    . PUNCT punct
    

    En la salida, puede ver que spaCy es lo suficientemente inteligente como para encontrar la dependencia entre los tokens, por ejemplo, en la oraci贸n ten铆amos una palabra is'nt. El analizador de dependencias lo ha dividido en dos palabras y especifica que el n't es en realidad la negaci贸n de la palabra anterior.

    Para obtener una comprensi贸n detallada del an谩lisis de dependencias, consulte Este art铆culo.

    Adem谩s de imprimir las palabras, tambi茅n puede imprimir frases de un documento.

    document = sp(u'Hello from Pharos.sh. The site with the best Python Tutorials. What are you looking for?')
    

    Ahora, podemos iterar a trav茅s de cada oraci贸n usando el siguiente script:

    for sentence in document.sents:
        print(sentence)
    

    La salida del script se ve as铆:

    Hello from Pharos.sh.
    The site with the best Python Tutorials.
    What are you looking for?
    

    Tambi茅n puede verificar si una oraci贸n comienza con un token en particular o no. Puede obtener tokens individuales usando un 铆ndice y los corchetes, como una matriz:

    document[4]
    

    En la secuencia de comandos anterior, buscamos la quinta palabra en el documento. Tenga en cuenta que el 铆ndice comienza desde cero y el per铆odo cuenta como un token. En la salida deber铆a ver:

    The
    

    Ahora para ver si alguna oraci贸n en el documento comienza con The, podemos usar el is_sent_start atributo como se muestra a continuaci贸n:

    document[4].is_sent_start
    

    En la salida, ver谩 True desde el token The se utiliza al comienzo de la segunda oraci贸n.

    En esta secci贸n, vimos algunas operaciones b谩sicas de la biblioteca spaCy. Ahora profundicemos y veamos la tokenizaci贸n, la derivaci贸n y la lematizaci贸n en detalle.

    Tokenizaci贸n

    Como se explic贸 anteriormente, la tokenizaci贸n es el proceso de dividir un documento en palabras, signos de puntuaci贸n, d铆gitos num茅ricos, etc.

    Veamos la tokenizaci贸n de spaCy en detalle. Cree un nuevo documento usando el siguiente script:

    sentence3 = sp(u'"They're leaving U.K. for U.S.A."')
    print(sentence3)
    

    Puede ver que la oraci贸n contiene comillas al principio y al final. Tambi茅n contiene signos de puntuaci贸n en las abreviaturas “Reino Unido” y “EE. UU.”

    Veamos c贸mo spaCy tokeniza esta oraci贸n.

    for word in sentence3:
        print(word.text)
    

    Salida:

    "
    They
    're
    leaving
    U.K.
    for
    U.S.A.
    "
    

    En la salida, puede ver que spaCy ha tokenizado las comillas dobles inicial y final. Sin embargo, es lo suficientemente inteligente como para no simbolizar el punto de puntuaci贸n utilizado entre las abreviaturas como Reino Unido y EE. UU.

    Veamos otro ejemplo de tokenizaci贸n:

    sentence4 = sp(u"Hello, I am non-vegetarian, email me the menu at [email聽protected]")
    print(sentence4)
    

    Aqu铆, en la oraci贸n anterior, tenemos un gui贸n en la palabra “no vegetariano” y en la direcci贸n de correo electr贸nico. Veamos c贸mo spaCy tokenizar谩 esto:

    for word in sentence4:
        print(word.text)
    

    Salida:

    Hello
    ,
    I
    am
    non
    -
    vegetarian
    ,
    email
    me
    the
    menu
    at
    [email聽protected]
    

    Es evidente por el resultado que spaCy fue capaz de detectar el correo electr贸nico y no lo tokeniz贸 a pesar de tener un “-“. Por otro lado, la palabra “no vegetariano” fue tokenizada.

    Veamos ahora c贸mo podemos contar las palabras en el documento:

    len(sentence4)
    

    En la salida, ver谩 14, que es el n煤mero de tokens en el sentence4.

    Detectando Entidades

    Adem谩s de convertir los documentos en palabras, tambi茅n puede encontrar si la palabra es una entidad como una empresa, lugar, edificio, moneda, instituci贸n, etc.

    Veamos un ejemplo simple de reconocimiento de entidad con nombre:

    sentence5 = sp(u'Manchester United is looking to sign Harry Kane for $90 million')  
    

    Primero intentemos simplemente tokenizarlo:

    for word in sentence5:
        print(word.text)
    

    Salida:

    Manchester
    United
    is
    looking
    to
    sign
    Harry
    Kane
    for
    $
    90
    million
    

    Sabemos que “Manchester United” es una sola palabra, por lo tanto, no debe dividirse en dos palabras. De manera similar, “Harry Kane” es el nombre de una persona y “$ 90 millones” es un valor monetario. Estos tampoco deben ser tokenizados.

    Aqu铆 es donde reconocimiento de entidad nombrada viene a jugar. Para obtener las entidades nombradas de un documento, debe usar el ents atributo. Recuperemos las entidades nombradas de la oraci贸n anterior. Ejecute el siguiente script:

    for entity in sentence.ents:
        print(entity.text + ' - ' + entity.label_ + ' - ' + str(spacy.explain(entity.label_)))
    

    En el script anterior, imprimimos el texto de la entidad, la etiqueta de la entidad y el detalle de la entidad. La salida se ve as铆:

    Salida:

    Manchester United - ORG - Companies, agencies, institutions, etc.
    Harry Kane - PERSON - People, including fictional
    $90 million - MONEY - Monetary values, including unit
    

    Puede ver que el reconocedor de entidades con nombre de spaCy ha reconocido con 茅xito al “Manchester United” como organizaci贸n, a “Harry Kane” como persona y “$ 90 millones” como valor monetario.

    Detectar sustantivos

    Adem谩s de detectar entidades con nombre, tambi茅n se pueden detectar sustantivos. Para hacerlo, el noun_chunks se utiliza el atributo. Considere la siguiente oraci贸n:

    sentence5 = sp(u'Latest Rumours: Manchester United is looking to sign Harry Kane for $90 million')  
    

    Intentemos encontrar los sustantivos de esta oraci贸n:

    for noun in sentence5.noun_chunks:
        print(noun.text)
    

    Salida:

    Latest Rumours
    Manchester United
    Harry Kane
    

    En la salida, puede ver que un sustantivo tambi茅n puede ser una entidad con nombre y viceversa.

    Derivado

    La ra铆z se refiere a reducir una palabra a su forma ra铆z. Mientras realiza tareas de procesamiento del lenguaje natural, encontrar谩 varios escenarios en los que encontrar谩 diferentes palabras con la misma ra铆z. Por ejemplo, computaci贸n, computaci贸n, computaci贸n, computaci贸n, etc. Es posible que desee reducir las palabras a su forma ra铆z en aras de la uniformidad. Aqu铆 es donde entra en juego la derivaci贸n.

    Puede resultarle sorprendente, pero spaCy no contiene ninguna funci贸n para derivar, ya que se basa 煤nicamente en la lematizaci贸n. Por lo tanto, en esta secci贸n usaremos NLTK para derivar.

    Hay dos tipos de lematizadores en NLTK: Porter Stemmer y Levantadores de bolas de nieve. Ambos se han implementado utilizando diferentes algoritmos.

    Porter Stemmer

    Veamos a Porter Stemmer en acci贸n:

    import nltk
    
    from nltk.stem.porter import *
    

    Creemos una clase de PorterStemmer.

    stemmer = PorterStemmer()
    

    Supongamos que tenemos la siguiente lista y queremos reducir estas palabras a la ra铆z:

    tokens = ['compute', 'computer', 'computed', 'computing']
    

    La siguiente secuencia de comandos busca la ra铆z de las palabras de la lista utilizando porter stemmer:

    for token in tokens:
        print(token + ' --> ' + stemmer.stem(token))
    

    El resultado es el siguiente:

    compute --> comput
    computer --> comput
    computed --> comput
    computing --> comput
    

    Puede ver que las 4 palabras se han reducido a “comput”, que en realidad no es una palabra en absoluto.

    V谩stago de bola de nieve

    La despalilladora de bola de nieve es una versi贸n ligeramente mejorada de la podadora Porter y generalmente se prefiere sobre esta 煤ltima. Veamos el tallador de bolas de nieve en acci贸n:

    from nltk.stem.snowball import SnowballStemmer
    
    stemmer = SnowballStemmer(language="english")
    
    tokens = ['compute', 'computer', 'computed', 'computing']
    
    for token in tokens:
        print(token + ' --> ' + stemmer.stem(token))
    

    En el gui贸n anterior, usamos Snowball Stemmer para encontrar la ra铆z de las mismas 4 palabras que usamos con Porter Stemmer. La salida se ve as铆:

    compute --> comput
    computer --> comput
    computed --> comput
    computing --> comput
    

    Puedes ver que los resultados son los mismos. Todav铆a tenemos “comput” como ra铆z. Nuevamente, esta palabra “comput” en realidad no es una palabra de diccionario.

    Aqu铆 es donde la lematizaci贸n resulta 煤til. La lematizaci贸n reduce la palabra a su ra铆z tal como aparece en el diccionario. Las ra铆ces devueltas a trav茅s de la lematizaci贸n son palabras reales del diccionario y est谩n sem谩nticamente completas a diferencia de las palabras devueltas por la ra铆z.

    Lematizaci贸n

    Aunque no pudimos realizar la derivaci贸n con spaCy, podemos realizar la lematizaci贸n usando spaCy.

    Para hacerlo, necesitamos usar el lemma_ atributo en el documento spaCy. Supongamos que tenemos la siguiente oraci贸n:

    sentence6 = sp(u'compute computer computed computing')
    

    Podemos encontrar las ra铆ces de todas las palabras usando la lematizaci贸n espacial de la siguiente manera:

    for word in sentence6:
        print(word.text,  word.lemma_)
    

    La salida del script anterior se ve as铆:

    compute compute
    computer computer
    computed compute
    computing computing
    

    Puede ver que, a diferencia de las ra铆ces donde la ra铆z que obtuvimos fue “comput”, las ra铆ces que obtuvimos aqu铆 son palabras reales en el diccionario.

    La lematizaci贸n convierte las palabras en la segunda o tercera forma a sus primeras variantes de forma. Mira el siguiente ejemplo:

    sentence7 = sp(u'A letter has been written, asking him to be released')
    
    for word in sentence7:
        print(word.text + '  ===>', word.lemma_)
    

    Salida:

    A ===> a
    letter ===> letter
    has ===> have
    been ===> be
    written ===> write
    , ===> ,
    asking ===> ask
    him ===> -PRON-
    to ===> to
    be ===> be
    released ===> release
    

    Puede ver claramente en el resultado que las palabras en la segunda y tercera forma, como “escrito”, “liberado”, etc., se han convertido a la primera forma, es decir, “escribir” y “liberar”.

    Conclusi贸n

    La tokenizaci贸n, la derivaci贸n y la lematizaci贸n son algunas de las tareas de procesamiento del lenguaje natural m谩s fundamentales. En este art铆culo, vimos c贸mo podemos realizar Tokenizaci贸n y Lematizaci贸n usando la biblioteca spaCy. Tambi茅n vimos c贸mo se puede usar NLTK para derivar. En el pr贸ximo art铆culo, comenzaremos nuestra discusi贸n sobre Vocabulario y Concordancia de frases en Python.

     

    Etiquetas:

    Deja una respuesta

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