title | description | prev | next | type | id |
---|---|---|---|---|---|
Chapter 3: Fluxos (pipelines) de processamento |
Neste capítulo apresentaremos os fluxos (pipelines) de processamento da spaCy. Você entenderá o que acontece nos bastidores quando você processa um texto. Vai aprender a escrever seus próprios componentes e adicioná-los ao fluxo de processamento, e também a usar atributos personalizados para adicionar metadados aos seus documentos, partições e tokens. |
/chapter2 |
/chapter4 |
chapter |
3 |
O que a spaCy faz quando você usa nlp
em uma sequência de texto?
doc = nlp("This is a sentence.")
O toquenizador sempre é executado antes de qualquer componente do fluxo, pois
ele é responsável por transformar uma string de texto em um objeto Doc
. O fluxo
de processamento (pipeline) não é obrigatoriamente composto por um tagueador (tagger),
um analisador (parser) e um identificador de entidades.
O toquenizador transforma uma string de texto em um objeto Doc
. a spaCy
então aplica cada componente do fluxo (pipeline) de processamento ao documento,
sequencialmente.
a spaCy processa tudo localmente e não se conecta a nenhum servidor externo.
Quando você usa spacy.load()
para carregar um fluxo (pipeline) de processamento, a spaCy irá inicializar o
idioma, adicionar o fluxo (pipeline) de processamento e carregar os pesos binários.
Quando você usar o objeto nlp
em um texto, o fluxo (pipeline) de processamento já estará carregado.
Vamos examinar o fluxo (pipeline) de processamento pequeno do idioma português!
- Carregue o fluxo (pipeline) de processamento
pt_core_news_sm
e crie um objetonlp
. - Imprima o nome dos componentes do fluxo utilizando
nlp.pipe_names
. - Imprima as informações das tuplas
(name, component)
usandonlp.pipeline
.
A lista de componentes do fluxo está disponível no atributo nlp.pipe_names
. A
lista completa dos componentes na forma de tuplas (name, component)
está
disponível em nlp.pipeline
.
Quais desses problemas pode ser solucionado utilizando um componente personalizado?
- Atualizar o fluxo (pipeline) de processamento treinado e melhorar suas predições.
- Calcular alguns valores utilizando os tokens e seus atributos.
- Adicionar entidades nomeadas baseado em um dicionário, por exemplo.
- Implementar suporte a um idioma adicional.
Componentes personalizados podem apenas alterar o objeto Doc
e não podem ser usados
para atualizar pesos ou outros componentes diretamente.
Componentes personalizados podem apenas alterar o objeto Doc
e não podem ser usados
para atualizar pesos ou outros componentes diretamente.
Componentes personalizados podem apenas alterar o objeto Doc
e não podem ser usados
para atualizar pesos ou outros componentes diretamente. Eles são adicionados ao fluxo
de processamento após o idioma ser carregado e depois da toquenização, portanto não
são adequados para adicionar novos idiomas.
Componentes personalizados são ótimos para adicionar informações customizadas aos
documentos, tokens e partições e também para customizar as entidades doc.ents
.
Componentes personalizados são adicionados ao fluxo de processamento após o idioma ser carregado e depois da toquenização, portanto não são adequados para adicionar novos idiomas.
Componentes personalizados são adicionados ao fluxo de processamento após o idioma ser carregado e depois da toquenização, portanto não são adequados para adicionar novos idiomas.
Este exemplo mostra um componente personalizado que imprime o número de tokens em um documento. Você consegue completar o código?
- Complete a função para calcular o tamanho do objeto
doc
. - Adicione o
"length_component"
ao fluxo de processamento como o primeiro componente. - Experimente o novo fluxo e processe qualquer texto com o objeto
nlp
. Por exemplo: "Esta é uma frase."
- Para obter o tamanho de um objeto
Doc
, você pode usar a funçãolen()
do Python. - Use o método
nlp.add_pipe
para adicionar um componente ao fluxo. Lembre-se de utilizar o nome do componente e definir o argumentofirst
comoTrue
para garantir que ele seja adicionado antes do processamento dos outros componentes. - Para processar um texto, chame
nlp
e passe o texto como argumento.
Neste exercício você escreverá um componente personalizado que usará o
PhraseMatcher
para identificar nomes de animais no documento e adicionar as partições
reconhecidas ao doc.ents
. O PhraseMatcher
será criado como a variável matcher
.
- Defina o componente personalizado e aplique o
matcher
aodoc
. - Crie uma partição
Span
para cada correspondência, atribua o marcador"ANIMAL"
e sobrescrevadoc.ents
com as novas correspondências. - Adicione o novo componente ao fluxo após o componente
"ner"
. - Processe o texto e imprima o texto e os marcadores das entidades em
doc.ents
.
- Observe que as correspondências são uma lista de tuplas
(match_id, start, end)
. - A classe
Span
tem 4 argumentos: odoc
pai, o índice inicial, o índice final e o marcador. - Para adicionar um componente após o outro, use o argumento
after
emnlp.add_pipe
. Lembre-se de utilizar o nome do componente para adicioná-lo.
Vamos exercitar a criação de propriedades extendidas.
- Use
Token.set_extension
para criar a propriedade"is_country"
(defaultFalse
). - Atualize o valor para o token
"Spain"
e imprima os resultados para todos os tokens.
Observe que as propriedades extendidas estão disponíveis através da propriedade ._
.
Por exemplo: doc._.has_color
.
- Use
Token.set_extension
para criar a propriedade"reversed"
(com o argumento getter sendo a funçãoget_reversed
). - Imprima o valor da nova propriedade para cada token.
- Observe que as propriedades extendidas estão disponíveis através da propriedade
._
. Por exemplo:doc._.has_color
.
Vamos agora tentar definir propriedades mais complexas usando o argumento getter e a extensão de métodos.
- Complete a função
get_has_number
. - Use
Doc.set_extension
para definir"has_number"
(getterget_has_number
) e imprima seu valor.
- Observe que as propriedades extendidas estão disponíveis através da propriedade
._
. Por exemplo:doc._.has_color
. - A função
get_has_number
deve retornar verdadeiro (True) se algum token dodoc
se parecer com um número (token.like_num
).
- Use
Span.set_extension
para definir"to_html"
(métodoto_html
). - Aplique em
doc[0:2]
com o parâmetro"strong"
.
- Métodos extendidos podem ter um ou mais parâmetros. Por exemplo:
doc._.algum_metodo("parametro")
. - O primeiro parâmetro a ser passado é sempre o objeto
Doc
,Token
ouSpan
.
Neste exercício você combinará propriedades personalizadas com as previsões estatísticas e criará um método extendido que retornará o endereço (URL) de busca na Wikipedia se a partição for uma pessoa, organização ou localidade.
- Defina a função
get_wikipedia_url
que só retornará uma URL da Wikipedia caso o marcador da partição seja igual ao valor de uma lista de marcadores. - Defina a propriedade extendida
"wikipedia_url"
para a partiçãoSpan
com o atributo getter igual aget_wikipedia_url
. - Itere nas entidades do
doc
e imprima a URL da Wikipedia.
- Para obter o marcador (label) de uma partição span, use a propriedade
span.label_
. Este é o marcador previsto pelo identificador de entidades caso o texto seja uma entidade. - Observe que as propriedades extendidas estão disponíveis através da propriedade
._
. Por exemplo:doc._.has_color
.
Propriedades extendidas podem ser poderosas quando combinadas com componentes personalizados do fluxo (pipeline) de processamento. Neste exercício, você escreverá um componente do fluxo de processamento para identificar nomes de países e definirá uma propriedade que retornará a capital do país, se houver.
Um Comparador com todos os países deverá ser disponibilizado na variável
matcher
. Um dicionário que mapeie os países e suas capitais deverá ser
disponibilizado na variável CAPITALS
.
- Complete a função
countries_component_function
que defina um marcador"GPE"
(geopolitical entity) para todas as correspondências. - Adicione o componente ao fluxo (pipeline) de processamento .
- Defina uma propriedade extendida
"capital"
para a partição Span com o argumento getter comoget_capital
. - Processe o texto e imprima o texto da entidade, o marcador (label) e a
propriedade extendida capital para cada partição em
doc.ents
.
- A classe
Span
tem quatro argumentos: odoc
, o índice iníciialstart
e o índice finalend
do token e o seu marcadorlabel
. - Use o
PhraseMatcher
com argumentodoc
, que retornará uma lista de tuplas:(match_id, start, end)
. - Para definir uma nova propriedade extendida, use o método
set_extension
na classe global (Doc
,Token
ouSpan
). Para definir o argumento getter, use o argumentogetter
. - Observe que as propriedades extendidas estão disponíveis através da propriedade
._
. Por exemplo:doc._.has_color
.
Neste exercício, você usará nlp.pipe
para processar texto de maneira mais
eficiente. O objeto nlp
já terá sido criado. Uma lista de tweets sobre uma rede
popular de lanchonetes americana está disponível na variável TEXTS
.
- Reescreva o exemplo usando
nlp.pipe
. Ao invés de iterar os textos e processá-los, itere o objetosdoc
disponíveis através denlp.pipe
.
- A função
nlp.pipe
permite que você substitua as 2 primeiras linhas de comando por apenas 1 linha. nlp.pipe
recebe como argumentoTEXTS
e retorna objetosdoc
para você fazer a iteração.
- Reescreva o exemplo e use
nlp.pipe
. Não se esqueça de usarlist()
no resultado para transformá-lo em uma lista.
- Reescreva o exemplo abaixo usando
nlp.pipe
. Não se esqueça de usarlist()
no resultado para transformá-lo em uma lista.
Neste exercício você utilizará propriedades personalizadas para adicionar metadados de autor e livro para as citações.
Uma lista de exemplos [text, context]
está disponível na variável DATA
. Os
textos são citações de livros famosos, e o contexto são dicionários com as chaves
"author"
e "book"
.
- Use o método
set_extension
para definir as propriedades personalizadas"author"
e"book"
noDoc
, com o valor padrão (default)None
. - Processe os pares
[text, context]
emDATA
usandonlp.pipe
com o argumentoas_tuples=True
. - Sobrescreva
doc._.book
edoc._.author
com as respectivas informações passadas como contexto.
- O método
Doc.set_extension
tem dois parâmetros: uma string com o nome da propriedade, e os descritores default, getter, setter ou method indicando esses valores. Por exemplo:default=True
. - Se o argumento
as_tuples
forTrue
, o métodonlp.pipe
receberá uma lista(text, context)
e retornará as tuplas(doc, context)
.
Neste exercício você usará os métodos nlp.make_doc
e nlp.select_pipes
para
executar componentes específicos durante o processamento do texto.
- Reescreva o código abaixo para apenas toquenizar o texto usando
nlp.make_doc
.
O método nlp.make_doc
pode ser usado em um texto e retornará um objeto Doc
,
de maneira similar à função nlp
.
- Desabilite o lematizador (lemmatizer) através do método
nlp.select_pipes
. - Processe o texto e imprima todas as entidades do
doc
.
O método nlp.select_pipes
aceita os parâmetros enable
ou disable
que recebem uma lista
com os nomes de componentes que devem ser habilitados ou desabilitados, respectivamente.
Por exemplo: nlp.select_pipes(disable="ner")
irá desabilitar o identificador de entidades nomeadas.