https://github.com/artdelpi/classificador-compras-gov
Modelo BERT pré-treinado em português e com Fine Tuning para classificar descrições de materiais em grupos. Treinado com um dataset de 50k registros extraídos da API do compras.gov.
https://github.com/artdelpi/classificador-compras-gov
catmat compras-publicas comprasgov embeddings ncm
Last synced: about 2 months ago
JSON representation
Modelo BERT pré-treinado em português e com Fine Tuning para classificar descrições de materiais em grupos. Treinado com um dataset de 50k registros extraídos da API do compras.gov.
- Host: GitHub
- URL: https://github.com/artdelpi/classificador-compras-gov
- Owner: artdelpi
- License: mit
- Created: 2026-03-11T13:58:46.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-05-23T18:38:00.000Z (2 months ago)
- Last Synced: 2026-05-23T20:21:37.941Z (2 months ago)
- Topics: catmat, compras-publicas, comprasgov, embeddings, ncm
- Language: Python
- Homepage:
- Size: 16.2 MB
- Stars: 2
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Classificador NCM para Compras Públicas
**DISCLAIMER**: esse é um projeto pessoal que não funciona perfeitamente e está em aprimoramento. Ir na seção **"Estado atual do modelo"** pra ver o desempenho atual.
A proposta desse repositório é oferecer um modelo de embeddings fine-tunado que gera vetores próximos pra descrições de CATMATS e NCMs correspondentes, sugerindo o código de NCM mais provável. Montei o dataset compilando dados do Ministério da Saúde e extração da API do comprasgov.
Como a maioria dos mapeamentos era de itens relacionados à saúde, precisei gerar uma minoria de dados sintéticos com o llama:7b pra que CATMATS de outras categorias tivessem algum tipo de representatividade no treino!!
## Como funciona
1. Um modelo de embeddings (BGE-M3 fine-tunado) transforma descrições em vetores
2. A descrição de um CATMAT é vetorizada e comparada contra todos os subitens NCM (mais de 10k possibilidades...)
3. O resultado é uma lista rankeada de NCMs com score de similaridade
## Estado atual do modelo
| Métrica | Valor |
|---|---|
| Capítulo P@1 (2 dígitos)| 95.1% |
| Posição P@1 (4 dígitos) | 90.0% |
| Subitem P@1 (8 dígitos) | 32.8% |
| Subitem R@5 (8 dígitos) | 51.5% |
O modelo lista até 5 possibilidades mais prováveis de NCM para capítulo, posição e subitem, dada uma descrição de CATMAT. Ele, atualmente, é excelente em detectar o capítulo (95.1% de acerto considerando unicamente o capítulo mais provável) e posição(90%); o gargalo é obter o subitem, que tem mais de 10k possibilidades.
## Pesos do modelo
Os pesos não estão no repositório pq são muito pesados. Para usar o classificador você tem duas opções:
1. **Treinar do zero** rodando o fluxo de retreino abaixo (treinei usando uma RTX 5090 com 32GB de VRAM).
2. **Entrar em contato com o email artdelpi@gmail.com**, que eu disponibilizo os pesos num link do onedrive.
Os pesos devem ficar em `modelo_retrieval/`. Além do `model.safetensors` e configs do modelo, a pasta precisa dos arquivos `.npy` de índice gerados pelo `indexar.py`.
## Retreino (opcional)
```bash
python src/treinar.py # fine-tuna o modelo
python src/indexar.py # indexa os NCMs com o modelo novo
python src/avaliar.py # mede as métricas
```
## Como rodar
Dado que já tem os pesos do modelo treinado, faça:
Instala as dependências:
```bash
pip install -r requirements.txt
```
Classificador interativo:
```bash
python src/classificar.py
```
Avaliação do modelo no dataset de teste:
```bash
python src/avaliar.py
```
## Dataset
Os arquivos estão comprimidos em gzip:
- `dataset/dataset.csv.gz`: pares (descrição CATMAT, NCM) usados no treino
- `dataset/negativos.csv.gz`: triplas com hard negatives para o treino
- `dataset/tabela_ncm.csv.gz`: tabela NCM completa com hierarquia e caminhos