title | description | prev | next | type | id |
---|---|---|---|---|---|
Capítulo 3: Pipelines de procesamiento |
En este capítulo aprenderás todo lo que necesitas saber sobre el pipeline de procesamiento de spaCy. Aprenderás lo que sucede cuando procesas un texto, cómo escribir tus propios componentes y añadirlos al pipeline y cómo usar atributos personalizados para añadir tus propios metadatos a los documentos, spans y tokens. |
/chapter2 |
/chapter4 |
chapter |
3 |
¿Qué hace spaCy cuando llamas a nlp
sobre un string de texto?
doc = nlp("Esto es una frase.")
El tokenizer siempre se corre antes que todos los demás componentes del
pipeline, porque transforma el string de texto en un objeto Doc
. El pipeline
tampoco tiene que estar compuesto por el tagger, el parser y el entity
recognizer.
El tokenizer convierte un string de texto en un objeto Doc
. Luego, spaCy
aplica en orden cada componente del pipeline sobre el documento.
spaCy calcula todo en la máquina y no necesita conectarse con un servidor.
Cuando llamas a spacy.load()
para cargar un modelo, spaCy inicializará el
lenguaje, añadirá el pipeline y cargará los parámetros binarios. Cuándo llamas
al objeto nlp
sobre un texto, el modelo ya está cargado.
¡Inspeccionemos el pipeline del modelo pequeño de español!
- Carga el modelo
es_core_news_sm
y crea el objetonlp
. - Imprime en pantalla los nombres de los componentes del pipeline usando
nlp.pipe_names
. - Imprime en pantalla el pipeline entero de tuples
(name, component)
usandonlp.pipeline
.
La lista de los nombres de los componentes está disponible como el atributo
nlp.pipe_names
. El pipeline entero, compuesto de los tuples de
(name, component)
, está disponible como nlp.pipeline
.
¿Cuáles de estos problemas pueden ser resueltos por los componentes personalizados del pipeline? ¡Escoge todos los que apliquen!
- Actualizar los modelos pre-entrenados y mejorar sus predicciones
- Calcular tus propios valores basados en los tokens y sus atributos
- Añadir entidades nombradas, por ejemplo, basadas en un diccionario
- Implementar soporte para un lenguaje adicional
Los componentes personalizados solo pueden modificar al Doc
y no pueden ser
usados para actualizar los parámetros de los otros componentes directamente.
Los componentes personalizados solo pueden modificar al Doc
y no pueden ser
usados para actualizar los parámetros de los otros componentes directamente.
Los componentes personalizados solo pueden modificar al Doc
y no pueden ser
usados para actualizar los parámetros de los otros componentes directamente.
También son añadidos al pipeline después de que se inicializa la clase de
lenguaje y después de la conversión a tokens, así que no son adecuados para
añadir nuevos lenguajes.
Los componentes personalizados son excelentes para añadir valores personalizados
a los documentos, tokens y spans y para personalizar los doc.ents
.
Los componentes personalizados son añadidos al pipeline después de que se inicializa la clase de lenguaje y después de la conversión a tokens, así que no son adecuados para añadir nuevos lenguajes.
Los componentes personalizados son añadidos al pipeline después de que se inicializa la clase de lenguaje y después de la conversión a tokens, así que no son adecuados para añadir nuevos lenguajes.
El ejemplo muestra un componente personalizado que imprime la longitud de un documento. ¿Puedes completarlo?
- Completa la función del componente con la longitud del
doc
. - Añade el
length_component
al pipeline existente como el primer componente. - Prueba el nuevo pipeline y procesa cualquier texto con el objeto
nlp
- por ejemplo, "Esto es una frase."
- Para obtener la longitud del objeto
Doc
, puedes llamar la función integrada de Python,len()
, sobre él. - Usa el método
nlp.add_pipe
para añadir el componente al pipeline. Recuerda ponerTrue
en el argumento keywordfirst
, para asegurarte de que se añada antes que los demás componentes. - Para procesar un texto, llama al objeto
nlp
sobre él.
En este ejercicio escribirás un componente personalizado que use el
PhraseMatcher
para encontrar nombres de animales en el documento y añada los
spans resultantes a los doc.ents
. En la variable matcher
ya se creó un
PhraseMatcher
con los patrones de animales.
- Define el componente personalizado y aplica el
matcher
aldoc
. - Crea un
Span
para cada resultado, asígnale el label ID para"ANIMAL"
y sobrescribe losdoc.ents
con los nuevos spans. - Añade el nuevo componente al pipeline después del componente
"ner"
. - Procesa el texto e imprime en pantalla el texto de la entidad y los entity
labels de las entidades en
doc.ents
.
- Recuerda que los resultados son una lista de tuples
(match_id, start, end)
. - La clase
Span
toma 4 argumentos: eldoc
padre, el índice de inicio, el índice del final y el label. - Para añadir el componente después de otro usa el argumento keyword
after
denlp.add_pipe
.
Vamos a practicar añadiendo algunas extensiones de atributos.
- Usa
Token.set_extension
para registrar"is_country"
(por defectoFalse
). - Actualízalo para
"España"
e imprímelo en pantalla para todos los tokens.
Recuerda que los atributos que fueron extendidos están disponibles a través de
la propiedad ._
. Por ejemplo, doc._.has_color
.
- Usa
Token.set_extension
para registrar"reversed"
(función getterget_reversed
). - Imprime en pantalla su valor por cada token.
Recuerda que los atributos que fueron extendidos están disponibles a través de
la propiedad ._
. Por ejemplo, doc._.has_color
.
Intentemos añadir algunos atributos más complejos usando getters y extensiones de métodos.
- Completa la función
get_has_number
. - Usa
Doc.set_extension
para registrar"has_number"
(getterget_has_number
) e imprimir su valor en pantalla.
- Recuerda que los atributos que fueron extendidos están disponibles a través de
la propiedad
._
. Por ejemplo,doc._.has_color
. - La función
get_has_number
debería devolver si cualquiera de los tokens en eldoc
devuelveTrue
paratoken.like_num
(si un token parece un número).
- Usa
Span.set_extension
para registrar"to_html"
(métodoto_html
). - Llámalo sobre
doc[0:2]
con el tag"strong"
.
- Las extensiones de método pueden tomar uno o más argumentos. Por ejemplo,
doc._.some_method("argument")
. - El primer argumento que se le pasa al método siempre es el objeto
Doc
,Token
oSpan
sobre el cual se llama al método.
En este ejercicio combinarás la extensión de atributos personalizados con las predicciones del modelo y crearás un getter de atributo que devuelve una URL de búsqueda de Wikipedia si el span es una persona, organización o lugar.
- Completa el getter
get_wikipedia_url
para que solo devuelva la URL si el label del span está en la lista de labels. - Añade la extensión del
Span
,"wikipedia_url"
, usando el getterget_wikipedia_url
. - Itera sobre las entidades en el
doc
y devuelve sus URLs de Wikipedia.
- Para obtener el string label de un span usa el atributo
span.label_
. Este es el label predicho por el entity recognizer si el span es un span que contiene una entidad. - Recuerda que los atributos que fueron extendidos están disponibles a través de
la propiedad
._
. Por ejemplo,doc._.has_color
.
La extensión de atributos es especialmente poderosa si es combinada con los componentes personalizados del pipeline. En este ejercicio escribirás un componente del pipeline que encuentra nombres de países y una extensión de atributo personalizada que devuelve la ciudad capital del país si está disponible.
Un patrón de frases con todos los países está disponible como la variable
matcher
. Un diccionario de países relacionados con sus ciudades capitales está
disponible como la variable CAPITALS
.
- Completa el
countries_component
y crea unSpan
con el label"LOC"
para todos los resultados. - Añade el componente al pipeline.
- Registra la extensión del atributo del Span,
"capital"
, con el getterget_capital
. - Procesa el texto e imprime en pantalla el texto de la entidad, el label y la
capital de la entidad para cada span que contiene una entidad en
doc.ents
.
- La clase
Span
toma cuatro argumentos: eldoc
, los índices del span destart
yend
y ellabel
. - Llamar al
PhraseMatcher
sobre undoc
devuelve una lista de tuples con(match_id, start, end)
. - Para registrar una nueva extensión de atributo usa el método
set_extension
en la clase global, por ejemplo,Doc
,Token
oSpan
. Para definir un getter usa el argumento keywordgetter
. - Recuerda que los atributos que fueron extendidos están disponibles a través de
la propiedad
._
. Por ejemplo,doc._.has_color
.
En este ejercicio, usarás el nlp.pipe
para procesar de manera más eficiente el
texto. El objeto nlp
ya fue creado para ti. Una lista de tweets sobre una
cadena americana de cómida rápida popular están disponibles en la variable
TEXTS
.
- Reescribe el ejemplo usando
nlp.pipe
. En vez de iterar sobre los textos y procesarlos, itera sobre los objetosdoc
que han sido devueltos pornlp.pipe
usando yield.
- Usar
nlp.pipe
te permite combinar las dos primeras líneas de código en una sola. nlp.pipe
toma losTEXTS
y usayield
para devolver objetosdoc
sobre los que puedes hacer un loop.
- Reescribe el ejemplo usando
nlp.pipe
. No olvides llamar alist()
alrededor del resultado para convertirlo en una lista.
- Reescribe el ejemplo usando
nlp.pipe
. No olvides llamar alist()
alrededor del resultado para convertirlo en una lista.
En este ejercicio usarás los atributos personalizados para añadir metainformación sobre el autor y el libro a citas.
Una lista de ejemplos [text, context]
está disponible como la variable DATA
.
Los textos son citas de libros famosos y los contextos son diccionarios con los
keys "author"
y "book"
.
- Usa el método
set_extension
para registrar los atributos personalizados"author"
y"book"
en elDoc
, con el valor por defectoNone
. - Procesa los pares
[text, context]
enDATA
usandonlp.pipe
conas_tuples=True
. - Sobrescribe el
doc._.book
ydoc._.author
con la información respectiva pasada como el contexto.
- El método
Doc.set_extension
toma dos argumentos: el nombre en string del atributo y el argumento keyword indicando el valor por defecto, el getter, el setter o el método. Por ejemplo,default=True
. - Si
as_tuples
es puesto comoTrue
, el métodonlp.pipe
toma una lista de tuples(text, context)
y usayield
para devolver tuples de(doc, context)
.
En este ejercicio usarás los métodos nlp.make_doc
y nlp.disable_pipes
para
correr unicamente los componentes seleccionados cuando se procesa un texto.
- Reescribe el código para que solo convierta el texto en tokens usando
nlp.make_doc
.
El método nlp.make_doc
puede ser llamado sobre un texto y devuelve un Doc
,
igual que el objeto nlp
.
- Deshabilita el tagger y el parser usando el método
nlp.disable_pipes
. - Procesa el texto e imprime en pantalla todas las entidades en el
doc
.
El método nlp.disable_pipes
recibe un número variable de argumentos: los
nombres en string de los componentes del pipeline que serán deshabilitados. Por
ejemplo, nlp.disable_pipes("ner")
deshabilitará el named entity recognizer.