title | description | prev | next | type | id |
---|---|---|---|---|---|
Chapter 4: Treinando um modelo de rede neural |
Neste capítulo, você aprenderá a atualizar os modelos estatísticos da spaCy de maneira a adequá-los aos seus casos de uso, como por exemplo, prever um novo tipo de entidade em textos de comentários. Você treinará seu próprio modelo a partir do zero, e entenderá o ciclo de treinamento, bem como aprenderá algumas dicas sobre como ter sucesso em seus projetos de processamento de linguagem natural (PLN). |
/chapter3 |
chapter |
4 |
Para treinar um modelo, tipicamente é necessário dados de treinamento e dados para validação. Para que são utilizados os dados de validação?
Durante o treinamento, o modelo só será atualizado com os dados de treinamento. Os dados de validação são utilizados apenas para avaliar a qualidade do modelo, através da comparação das predições feitas nesses dados (novos dados) com o resultado esperado. Isso então refletirá no score de acurácia do modelo.
Os dados de validação são utilizados para avaliar o modelo, comparando a predição feita nesses dados (novos dados) com o resultado esperado. Isso então refletirá no score de acurácia do modelo.
Os dados de validação são utilizados para avaliar o modelo, comparando a predição feita nesses dados (novos dados) com o resultado esperado. Isso então refletirá no score de acurácia do modelo.
Através do Matcher
da spaCy, que é um algoritmo baseado em regras, é possível criar
rapidamente dados de treinamento para modelos de entidades. Uma lista de frases
fica disponível através da variável TEXTS
. Você pode imprimi-la para inspecionar
o conteúdo. Queremos encontrar todas as menções aos diferentes modelos de iPhone,
então vamos criar dados de treinamento para o modelo reconhecer esses exemplos como
"GADGET"
.
- Escreva uma expressão para que dois tokens correspondam as palavras em minúsculas
"iphone"
e"x"
. - Escreva uma expressão com dois tokens: um token cujo formato em minúscula corresponda a
"iphone"
e o outro corresponda a um dígito usando o operador"?"
.
-
Para ter correspondência a um token no formato minúsculo, você pode usar o atributo
"LOWER"
. Por exemplo:{"LOWER": "apple"}
. -
Para um token com um dígito, você pode usar o sinalizador
"IS_DIGIT"
. Por exemplo:{"IS_DIGIT": True}
.
Após criar dados para o nosso corpus
, precisamos salvá-los em um arquivo .spacy
.
O código do exemplo anterior já está disponível.
- Instancie o
DocBin
com a lista dedocs
- Salve o
DocBin
em um arquivo chamadotrain.spacy
.
- Você pode inicializar o
DocBin
através do parâmetrodocs
, que pode receber uma lista de docs. - O método
to_disk
doDocBin
recebe um parâmetro: o caminho do arquivo para salvar os dados binários. Certifique-se que o arquivo possua a extensão.spacy
.
O arquivo config.cfg
é a única fonte segura de informações para treinar um
fluxo (pipeline) de processamento com a biblioteca spaCy. Qual das alternativas
abaixo não está correta em relação ao arquivo de configuração?
O arquivo de configuração inclui todas as configurações para o processo de treinamento, inclusive os hyper-parâmetros.
Uma vez que o arquivo de configuração inclui todas as configurações e no processo não há nenhuma configuração padrão, o processo de treinamento poderá ser reproduzido baseando-se neste arquivo, o que permite que outros possam roda os mesmos experimentos com exatamente as mesmas configurações.
O arquivo de configuração inclui todas as configurações relacionadas ao treinamento e instruções de
como criar seu fluxo (pipeline) de processamento. Para criar um pacote python instalável, você pode
utilizar o comando spacy package
.
O bloco [components]
do arquivo de configuração inclui todos os componentes do fluxo (pipeline) de processamento e suas configurações, incluindo as implementações do modelo utilizado.
O comando init config
gera automaticamente
um arquivo de configuração para o treinamento com as configurações padrão. Queremos
treinar um identificador de entidades, portanto vamos gerar um arquivo de configuração
para apenas um componente do fluxo (pipeline) de processamento : ner
. Uma vez que neste
curso estamos executando o comando em um ambiente Jupyter, vamos utilizar o prefixo !
.
Se você estiver executando os comandos diretamente no seu terminal, a utilização do
prefixo !
não é necessária.
- Use o comando da spaCy
init config
para gerar automaticamente um arquivo de configuração para o idioma Inglês. - Salve a configuração em um arquivo
config.cfg
- Use o parâmetro
--pipeline
para especificar o único componente do pipeline:ner
.
- O parâmetro
--lang
define a classe do idioma, neste casoen
para o Inglês.
Vamos dar uma olhada no arquivo de configuração que foi gerado. Você pode executar o comando abaixo para imprimir a configuração no terminal e analisá-la.
Vamos usar o arquivo de configuração que geramos no exercício anterior e o corpus de treinamento que criamos para treinar um identificador de entidades!
O comando train
permite treinar um modelo a
partir de um arquivo de configuração. O arquivo config_gadget.cfg
está disponível
no diretório exercises/pt
, bem como o arquivo train_gadget.spacy
contendo os
exemplos de treinamento, e o arquivo dev_gadget.spacy
contendo os exemplos de
validação. Uma vez que neste curso estamos executando o comando em um ambiente Jupyter,
vamos utilizar o prefixo !
. Se você estiver executando os comandos diretamente no seu terminal,
a utilização do prefixo !
não é necessária.
Use o comando train
com o arquivo exercises/pt/config_gadget.cfg
. Salve o fluxo de
processamento (pipeline) no diretório output
. Passe os caminhos exercises/pt/train_gadget.spacy
e exercises/pt/dev_gadget.spacy
como parâmetros.
O primeiro parâmetro de spacy train
é o caminho para o arquivo de configuração.
Vamos agora avaliar como o modelo se comporta com novos dados. Para agilizar,
já treinamos um fluxo (pipeline) de processamento para o marcador "GADGET"
com algumas frases. Aqui está
o resultado:
Text | Entities |
---|---|
Apple is slowing down the iPhone 8 and iPhone X - how to stop it | (iPhone 8, iPhone X) |
I finally understand what the iPhone X 'notch' is for | (iPhone X,) |
Everything you need to know about the Samsung Galaxy S9 | (Samsung Galaxy,) |
Looking to compare iPad models? Here’s how the 2018 lineup stacks up | (iPad,) |
The iPhone 8 and iPhone 8 Plus are smartphones designed, developed, and marketed by Apple | (iPhone 8, iPhone 8) |
what is the cheapest ipad, especially ipad pro??? | (ipad, ipad) |
Samsung Galaxy is a series of mobile computing devices designed, manufactured and marketed by Samsung Electronics | (Samsung Galaxy,) |
De todas as entidades nos textos, quantas o modelo acertou? Lembre-se que partições incompletas das entidades contabilizam como erros! Dica: Conte o número de entidades no modelo que deveriam ter sido identificadas. Depois conte o número de entidades que de fato foram identificadas e as divida pelo número total de entidades.
Conte o número de entidades corretamente identificadas e as divida pelo número total de entidades que o modelo deveria ter identificado.
Conte o número de entidades corretamente identificadas e as divida pelo número total de entidades que o modelo deveria ter identificado.
Na nossa base de teste, o modelo atingiu a acurácia de 70%.
Conte o número de entidades corretamente identificadas e as divida pelo número total de entidades que o modelo deveria ter identificado.
Aqui está um trecho de um conjunto de dados de treinamento rotulados
para a entidade TOURIST_DESTINATION
em revisões de viajantes.
doc1 = nlp("i went to amsterdem last year and the canals were beautiful")
doc1.ents = [Span(doc1, 3, 4, label="TOURIST_DESTINATION")]
doc2 = nlp("You should visit Paris once, but the Eiffel Tower is kinda boring")
doc2.ents = [Span(doc2, 3, 4, label="TOURIST_DESTINATION")]
doc3 = nlp("There's also a Paris in Arkansas, lol")
doc3.ents = []
doc4 = nlp("Berlin is perfect for summer holiday: great nightlife and cheap beer!")
doc4.ents = [Span(doc4, 0, 1, label="TOURIST_DESTINATION")]
Por que esses dados e seus marcadores são problemáticos?
Uma abordagem melhor seria identificar as entidades geopolíticas "GPE"
ou
localidades "LOCATION"
e em seguida utilizar um sistema baseado em regras para
determinar se a entidade é um destino turístico neste contexto. Por exemplo,
você poderia comparar esssas entidades identificadas com uma base de conhecimento
ou uma wiki sobre viagens.
Embora seja possível que Paris, AK seja uma atração turística, este exemplo só ressalta a subjetividade da definição dessa estratégia e como o processo de rotulagem será complexo. Como resultado, a distinção desta entidade será bem difícil para o modelo.
Palavras pouco frequentes ou digitadas erradas podem ser rotuladas como entidades. Na verdade, ser capaz de predizer categorias em textos com erros baseando-se no contexto do texto é uma das grandes vantagens dos modelos estatísticos preditivos.
- Rescreva o
doc.ents
para usar apenas as partições do marcador"GPE"
(cidades, estados, países) ao invés de"TOURIST_DESTINATION"
. - Não se esqueça de adicionar as partições à entidade
"GPE"
que não estavam identificadas nos dados antigos.
- Para as partições que já estavam rotuladas, você só precisa alterar o marcador de
"TOURIST_DESTINATION"
para"GPE"
. - Uma frase contém uma cidade e um estado que não tinha sido rotulado. Para
adicionar a partição da entidade, identifique a posição do início e do final
da partição. Lembre-se que o índice do último token é exclusivo ! Em seguida,
adicione uma nova partição
Span
emdoc.ents
. Fique de olho na tokenização! Veja os tokens que estão noDoc
se você não estiver seguro.
Aqui está um pequeno exemplo de um conjunto de dados criado para treinar a entidade
"WEBSITE"
. O conjunto de dados original contém algumas centenas de frases.
Neste exercício, você criará os marcadores manualmente. Na vida real, você provavelmente
irá automatizar este processo e utilizará uma ferramenta de anotação, como por exemplo:
Brat, uma solução de código aberto, ou
Prodigy, nossa ferramenta de anotação integrada à spaCy.
- Complete os espaços em branco para identificar a entidade
"WEBSITE"
nos dados.
- Lembre-se que a indexação é exclusiva . Portanto se uma entidade se iniciar
na posição 2 e terminar na posição 3, ela terá o token inicial em
2
e o token final em4
.
Um modelo foi treinado com os dados que você acaba de rotular, com mais alguns
milhares de exemplos similares. Depois do treinamento, ele está performando muito
bem para "WEBSITE"
, mas parece não estar mais reconhecendo a entidade "PERSON"
.
O que pode estar acontecendo?
É claro que é possível um modelo aprender a identificar diferentes categorias. Por exemplo, o modelo pré-treinado da spaCy para a língua inglesa consegue identificar pessoas, e também organizações e até percentuais.
Se exemplos de entidades "PERSON"
aparecerem nos dados de treinamento e não estiverem
rotuladas, o modelo aprenderá que essas entidades não deverm ser identificadas.
Similarmente, se exemplos da entidade não estiverem presentes nos dados de treinamento,
o modelo poderá "esquecer" e parar de identificá-la.
Embora os hiper-parâmetros influenciem a acurácia de um modelo, eles não são o problema fundamental deste exemplo.
- Atualize os dados de treinamento para incluir as anotações "PewDiePie" e
"Alexis Ohanian" pra a entidade
"PERSON"
.
- Para adicionar mais entidades, adicione outra partição
Span
adoc.ents
. Lembre-se que o token final de uma partição é exclusivo. Portanto se uma entidade se iniciar na posição 2 e terminar na posição 3, ela terá o token inicial em2
e o token final em4
.