🍔 BERTimbau NER: Extração de Entidades em Cardápios de Delivery
Model Description
Este modelo é uma versão fine-tuned do BERTimbau Base (neuralmind/bert-base-portuguese-cased) otimizada especificamente para a tarefa de Reconhecimento de Entidades Nomeadas (NER) no domínio da restauração e food delivery.
O Problema de Negócio: Em plataformas de entrega de grande escala (como o iFood), os catálogos e descrições de pratos introduzidos pelos restaurantes parceiros são frequentemente desestruturados e inconsistentes. Este modelo foi concebido para ler automaticamente descrições brutas e extrair metadados estruturados (Ingredientes, Acompanhamentos e Alergénios). Isto viabiliza a criação de filtros de pesquisa precisos (ex: "Sem Glúten", "Vegano") e alertas de segurança alimentar na aplicação, sem depender da categorização manual perfeita por parte do parceiro.
Intended Uses & Limitations
- Casos de Uso Principais:
- Processamento em lote (batch processing) de catálogos de restaurantes recém-registados para enriquecimento automático de base de dados.
- Integração em microsserviços de baixa latência para validação e extração de ementas em tempo real.
- Defesa Arquitetural (Custo vs. Benefício): Ao contrário da utilização de Modelos de Linguagem de Grande Escala (LLMs generativos) para extração via prompting, esta solução baseada num Encoder oferece uma latência na ordem dos milissegundos e um custo de inferência drasticamente inferior. É uma arquitetura pragmática, ideal para pipelines operacionais que exigem elevado rendimento (milhões de requisições diárias) com orçamentos de infraestrutura otimizados (FinOps).
- Limitações: Sendo um modelo de classificação de tokens, não possui capacidade generativa (não reescreve descrições). A sua precisão pode diminuir ao deparar-se com vocabulário de culinárias regionais muito de nicho que não estejam representadas no conjunto de treino.
Training and Evaluation Data
Os dados de treino foram estruturados utilizando a anotação padrão IOB (Inside-Outside-Beginning).
- Tags de Entidade Mapeadas:
PRATO,ACOMPANHAMENTO,ALERGENIO. - Estratégia de Destilação de Dados (LLM-as-a-Teacher): Para contornar a escassez de dados anotados manualmente no domínio de delivery em português, adotou-se uma abordagem híbrida de engenharia de dados. Um LLM avançado foi utilizado como "Professor" para ler milhares de descrições ruidosas e gerar anotações IOB sintéticas. Esse conhecimento foi então destilado (transferido) para este modelo BERT (o "Aluno"), combinando a versatilidade do LLM com a eficiência computacional de um Encoder clássico.
Evaluation Results
O modelo foi avaliado utilizando a biblioteca seqeval, que aplica uma métrica rigorosa para NER, penalizando o reconhecimento parcial de entidades.
Nota de Engenharia (PoC): As métricas abaixo refletem uma Prova de Conceito (Proof of Concept) treinada com um micro-batch de validação (menos de 10 amostras geradas via LLM-as-a-Teacher). O objetivo desta versão é demonstrar a arquitetura MLOps, o fluxo de tokenização WordPiece com alinhamento de labels (-100) e a integração do pipeline. O modelo requer treinamento em escala de produção (milhares de anotações) para convergência e uso comercial.
| Métrica | Resultado (%) |
|---|---|
| F1-Score (Overall) | 14.0 |
| Precision | 12.5 |
| Recall | 15.8 |
| Accuracy | 52.2 |
Nota: O F1-Score é a métrica principal de sucesso operacional deste pipeline, garantindo que o modelo mantém um equilíbrio robusto entre falsos positivos (classificar incorretamente um ingrediente comum como alergénio) e falsos negativos (ignorar um item crítico para o utilizador).
💻 How to Use
Exemplo de integração rápida utilizando a pipeline da Hugging Face. Este código pode ser executado em ambientes restritos de CPU.
from transformers import pipeline
# Carrega o modelo fine-tuned diretamente do Hub
ner_pipeline = pipeline(
"ner",
model="Jm6193563/bertimbau-ner-cardapios",
aggregation_strategy="simple" # Agrupa automaticamente os subtokens (WordPiece)
)
texto_bruto = "Strogonoff de frango acompanhado de batata frita e arroz branco. Contém lactose."
entidades_extraidas = ner_pipeline(texto_bruto)
print(entidades_extraidas)