🌳 Utilizando Neural edit-tree lemmatization no português
Tags: spacy, português, lematizador, nlp
Published: 2022-03-26 23:31:54

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]](https://explosion.ai/blog/edit-tree-lemmatizer). 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

```bash
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

```python
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

```python
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](https://github.com/explosion/spacy-experimental). 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](https://spacy.io/usage)

### 2.2 Configurando projeto

Primeiro começamos trazendo o projeto do _Github_ para a nossa máquina através do comando [`spacy project clone`](https://spacy.io/api/cli#project-clone).

```bash
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.

```yaml
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`](https://spacy.io/api/cli#convert) na seção `preprocess` do nosso _yaml_. 

```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.

```bash
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.

```bash
python -m spacy project run train
```

Para avaliar o modelo, apenas trocamos a palavra _train_ por _evaluate_,

```bash
python -m spacy project run evaluate
```
Conseguimos alcançar na avaliação com a configuração padrão, as seguintes métricas:

```bash
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.

```python
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_.