DEV Community

Jessica Cardoso for AcademicAI

Posted on • Updated on

🌳 Utilizando Neural edit-tree lemmatization no português

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
Enter fullscreen mode Exit fullscreen mode

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))
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Para avaliar o modelo, apenas trocamos a palavra train por evaluate,

python -m spacy project run evaluate
Enter fullscreen mode Exit fullscreen mode

Conseguimos alcançar na avaliação com a configuração padrão, as seguintes métricas:

TOK     99.98
LEMMA   96.20
SPEED   21155
Enter fullscreen mode Exit fullscreen mode

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))

Enter fullscreen mode Exit fullscreen mode

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)