Os desenvolvedores do spaCy lançaram um modelo de lematização experimental que conseguiu aumentar a acurácia de lematização do português de 0.75 para 0.97. As versões tradicionais dos lematizadores do spaCy são baseadas em lookup tables e rule sets [1]. Os autores disponibilizaram um template de projeto do spaCy para facilitar a edição dos parâmetros e configurações de treinamento.
Abordamos aqui duas formas de utilizar o edit tree lemmatizer: Por meio do modelo pré-treinado transformer e treinando a pipeline do zero com componentes específicos.
1. Abordagem Transformer
A primeira abordagem já tem tudo pronto para utilização. A desvantagem dela é que o o modelo transformer ocupa bastante espaço na memória, e o tempo de inferência na cpu pode ser bastante lento, dependendo dos requisitos.
Para utilizar basta seguir os seguintes comandos:
Instalar as bibliotecas necessárias com o modelo
pip install https://huggingface.co/explosion/pt_udv25_portuguesebosque_trf/resolve/main/pt_udv25_portuguesebosque_trf-any-py3-none-any.whl
Agora é só carregar o modelo e utilizar
import spacy
nlp = spacy.load("pt_udv25_portuguesebosque_trf")
# processa o texto
doc = nlp("meu gato não é como os outros e não come ração")
print("original:", doc)
print("lematizado:", " ".join(token.lemma_ for token in doc))
Como ainda está em uma versão experimental, alguns erros podem acontecer. Em um deles é necessário fixar a versão thinc com o comando
pip install thinc==8.0.14
2. Treinamento da pipeline
Nessa parte do tutorial, faremos uso do template do edit_tree_lemmatizer que está disponível aqui. No exemplo, foi configurado para o alemão, nós modificaremos para treinar um modelo em português.
2.1 Pré requisito
- Ambiente virtual do python
- Biblioteca do spaCy
2.2 Configurando projeto
Primeiro começamos trazendo o projeto do Github para a nossa máquina através do comando spacy project clone
.
python -m spacy project clone projects/edit_tree_lemmatizer --repo https://github.com/explosion/spacy-experimental
cd edit_tree_lemmatizer
python -m pip install -r requirements.txt
Vamos mudar o dataset utilizado de Dutch Alpino treebank para um treebank em nosso idioma. Para isso editamos o arquivo project.yml.
vars:
lang: "pt"
treebank: "UD_Portuguese-Bosque"
train_name: "pt_bosque-ud-train"
dev_name: "pt_bosque-ud-dev"
test_name: "pt_bosque-ud-test"
gpu: -1
Além de alterar essa parte do arquivo, também precisamos adicionar o parâmetro --merge-subtokens
ao final do comando spacy convert
na seção preprocess
do nosso yaml.
commands:
- name: "preprocess"
help: "Convert data to spaCy format"
script:
- "mkdir -p corpus/${vars.treebank}"
- "python -m spacy convert assets/${vars.treebank}/${vars.train_name}.conllu corpus/${vars.treebank}/ --n-sents 10 --merge-subtokens"
- "mv corpus/${vars.treebank}/${vars.train_name}.spacy corpus/${vars.treebank}/train.spacy"
- "python -m spacy convert assets/${vars.treebank}/${vars.dev_name}.conllu corpus/${vars.treebank}/ --n-sents 10 --merge-subtokens"
- "mv corpus/${vars.treebank}/${vars.dev_name}.spacy corpus/${vars.treebank}/dev.spacy"
- "python -m spacy convert assets/${vars.treebank}/${vars.test_name}.conllu corpus/${vars.treebank}/ --n-sents 10 --merge-subtokens"
- "mv corpus/${vars.treebank}/${vars.test_name}.spacy corpus/${vars.treebank}/test.spacy"
deps:
- "assets/${vars.treebank}/"
outputs:
- "corpus/${vars.treebank}/train.spacy"
- "corpus/${vars.treebank}/dev.spacy"
- "corpus/${vars.treebank}/test.spacy"
Feito isso, vamos baixar o dataset definido acima, converter no formato do spaCy e criar o arquivo de configurações.
python -m spacy project assets
python -m spacy project run preprocess
python -m spacy project run create-config
Os dados do repositório UD_Portuguese-Bosque estão na pasta assets, já o arquivo de configuração usado no treinamento está na pasta config. Nesse tutorial, não modificamos o config.cfg, mas é possível ajustar os parâmetros do treinamento.
Treinamos o modelo com utilizando a configuração padrão através do comando abaixo.
python -m spacy project run train
Para avaliar o modelo, apenas trocamos a palavra train por evaluate,
python -m spacy project run evaluate
Conseguimos alcançar na avaliação com a configuração padrão, as seguintes métricas:
TOK 99.98
LEMMA 96.20
SPEED 21155
2.3 Usando o modelo treinado
O modelo treinado é gerado na pasta training e pode ser carregado em uma pipeline do spaCy, para isso basta apenas carregar o modelo treinado no script a seguir.
import spacy
# cria o objeto nlp ao carregar o lematizador
nlp = spacy.load(
"edit_tree_lemmatizer/training/UD_Portuguese-Bosque/model-best"
)
# processa o texto
doc = nlp("meu gato não é como os outros e não come ração")
print("original:", doc)
print("lematizado:", " ".join(token.lemma_ for token in doc))
Nesse segundo caso, não editamos os valores no config.cfg, então a acurácia será menor que o informado no blog explosion e o modelo com transformers.
Top comments (0)