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.

Discussion (0)