Python para NLP: Tokenización, Acometida y Lemmatización con la Biblioteca SpaCy

En el artículo anterior , comenzamos nuestra discusión sobre cómo realizar el procesamiento de lenguaje natural con Python. Vimos cómo leer y escribir texto y archivos PDF. En este artículo, comenzaremos a trabajar con la biblioteca spaCy para realizar algunas tareas básicas de PNL, como la tokenización , la derivación y la lematización .

Introducción a SpaCy

La biblioteca spaCy es una de las bibliotecas de PNL 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 utilizando NLTK en lugar de spaCy.

Instalación de spaCy

Si usa el instalador pip para instalar sus bibliotecas de Python, vaya a la línea de comandos 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. Vamos a utilizar 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 idioma:
$ 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 la spacybiblioteca 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 anterior, usamos la loadfunción de la spacybiblioteca para cargar el modelo de idioma inglés principal. El modelo se almacena en la spvariable.
Ahora vamos a crear un documento pequeño usando este modelo. Un documento puede ser una oración o un grupo de oraciones y puede tener una longitud ilimitada. El siguiente script crea un simple documento de spaCy.
sentence = sp(u'Manchester United is looking to sign a forward for $90 million')  
SpaCy rompe automáticamente su documento en tokens cuando se crea un documento utilizando el modelo.
Un token simplemente se refiere a una parte individual de una oración que tiene algún valor semántico. Veamos qué fichas tenemos en nuestro documento:
for word in sentence:  
    print(word.text)
La salida de la secuencia de comandos anterior se ve así:
Manchester  
United  
is  
looking  
to  
sign  
a  
forward  
for  
$
90  
million  
Puedes ver que tenemos los siguientes tokens en nuestro documento. También podemos ver las partes del habla de cada uno de estos tokens utilizando 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 cada palabra o token en nuestra oración ha sido asignada una parte del discurso. Por ejemplo, "Manchester" se ha etiquetado como un nombre propio, "Mirar" se ha etiquetado como un verbo, y así sucesivamente.
Finalmente, además de las partes del discurso, también podemos ver las dependencias.
Vamos a crear otro documento:
sentence2 = sp(u"Manchester United isn't looking to sign any forward.")  
Para el análisis de dependencia, 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
Desde la salida, puedes ver que spaCy es lo suficientemente inteligente como para encontrar la dependencia entre los tokens, por ejemplo, en la oración en que teníamos una palabra is'ntEl analizador de dependencia lo ha dividido en dos palabras y especifica que en n'trealidad es la negación de la palabra anterior.
Para una comprensión detallada del análisis de dependencia, consulte este artículo .
Además de imprimir las palabras, también puede imprimir oraciones de un documento.
document = sp(u'Hello from Stackabuse. 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 Stackabuse.  
The site with the best Python Tutorials.  
What are you looking for?  
También puede verificar si una oración comienza con un token particular o no. Puede obtener tokens individuales utilizando un índice y los corchetes, como una matriz:
document[4]  
En el script anterior, estamos buscando 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ías ver:
The  
Ahora para ver si alguna oración en el documento comienza con The, podemos usar el is_sent_startatributo como se muestra a continuación:
document[4].is_sent_start  
En la salida, verá Trueque el token These usa al comienzo de la segunda oración.
En esta sección, vimos algunas operaciones básicas de la biblioteca de spaCy. Ahora profundicemos y veamos en detalle Tokenization, Stemming y Lemmatization.

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 en detalle la tokenización del spa. Crea un nuevo documento usando el siguiente script:
sentence3 = sp(u'"They\'re leaving U.K. for U.S.A."')  
print(sentence3)  
Puedes ver que la oración contiene citas al principio y al final. También contiene signos de puntuación en las abreviaturas "UK" y "USA"
Veamos como 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 simbolizado las comillas dobles de inicio y finalización. 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 abc-xyz@gmai.com")  
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 tokenize esto:
for word in sentence4:  
    print(word.text)
Salida:
Hello  
,
I  
am  
non  
-
vegetarian  
,
email  
me  
the  
menu  
at  
abc-xyz@gmai.com  
Es evidente a partir de la salida 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ás 14, que es el número de tokens en el sentence4.

Entidades de detección

Además de tokenizing los documentos a las 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 nombrada:
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 ser identificada 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 el reconocimiento de la entidad nombrada viene a jugar. Para obtener las entidades nombradas de un documento, debe usar el entsatributo. Vamos a recuperar las entidades nombradas de la oración anterior. Ejecuta 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 la entidad nombrada de spaCy ha reconocido con éxito "Manchester United" como organización, "Harry Kane" como persona y "$ 90 millones" como valor de moneda.

Detección de Sustantivos

Además de detectar entidades nombradas, también se pueden detectar sustantivos. Para ello, noun_chunksse utiliza el atributo. Considera la siguiente oración:
sentence5 = sp(u'Latest Rumours: Manchester United is looking to sign Harry Kane for $90 million')  
Tratemos de encontrar los sustantivos de esta oración:
for noun in sentence5.noun_chunks:  
    print(noun.text)
Salida:
Latest Rumours  
Manchester United  
Harry Kane  
Desde la salida, puede ver que un sustantivo también puede ser una entidad con nombre y viceversa.

Tallo

Detener se refiere a reducir una palabra a su forma de raíz. Al realizar tareas de procesamiento de 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 de raíz por uniformidad. Aquí es donde entra el juego para jugar.
Puede que sea sorprendente para usted, pero spaCy no contiene ninguna función para la derivación ya que solo se basa en la lematización. Por lo tanto, en esta sección, usaremos NLTK para la derivación.
Hay dos tipos de stemmers en NLTK: Porter Stemmer y Snowball stemmers . Ambos se han implementado utilizando diferentes algoritmos.

Porter Stemmer

Veamos porter stemmer en acción:
import nltk

from nltk.stem.porter import *  
Vamos a crear una clase de PorterStemmer.
stemmer = PorterStemmer()  
Supongamos que tenemos la siguiente lista y queremos reducir estas palabras para que surjan:
tokens = ['compute', 'computer', 'computed', 'computing']  
La siguiente secuencia de comandos encuentra la raíz de las palabras en la lista con el uso de porter stemmer:
for token in tokens:  
    print(token + ' --> ' + stemmer.stem(token))
La salida es la siguiente:
compute --> comput  
computer --> comput  
computed --> comput  
computing --> comput  
Puede ver que todas las 4 palabras se han reducido a "comput" que en realidad no es una palabra en absoluto.

Stemmer bola de nieve

El stemmer Snowball es una versión ligeramente mejorada del stemter Porter y generalmente se prefiere a este último. Vamos a ver la bola de nieve stemmer 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 la secuencia de comandos anterior, utilizamos 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 el vástago. De nuevo, esta palabra "comput" en realidad no es una palabra del diccionario.
Aquí es donde la lematización es útil. La lematización reduce la palabra a su raíz tal como aparece en el diccionario. Los tallos devueltos a través de la lematización son palabras reales del diccionario y se completan semánticamente a diferencia de las palabras devueltas por stemmer.

Lemmatizació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 de 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 de spaCy de la siguiente manera:
for word in sentence6:  
    print(word.text,  word.lemma_)
La salida de la secuencia de comandos anterior se ve así:
compute compute  
computer computer  
computed compute  
computing computing  
Puedes ver que, a diferencia de la raíz 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 variantes de primera 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  
Se puede ver claramente en la salida que las palabras en segunda y tercera forma, como "escrito", "liberado", etc. se han convertido a la primera forma, es decir, "escribir" y "liberar".

Conclusión

Tokenization, Stemming y Lemmatization son algunas de las tareas de procesamiento de lenguaje natural más fundamentales. En este artículo, vimos cómo podemos realizar Tokenization y Lemmatization usando la biblioteca de spaCy. También vimos cómo se puede usar NLTK para la derivación. En el próximo artículo, comenzaremos nuestra discusión sobre el vocabulario y la concordancia de frases en Python.

Acerca de: Programator

Somos Instinto Programador

0 comentarios:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Con tecnología de Blogger.