Como lidar com pequenos textos e sinais de pontuação na prática
Eu trabalho com extração de dados desde 2014, e uma das coisas que mais quebram pipelines não são os dados faltando ou mal formatados em massa. São os pequenos textos com sinais de pontuação. Um endereço completo de 40 caracteres que parece fácil mas quebra seu parser regex porque tem um hífen no meio do CEP, uma vírgula mal colocada antes do número, ou um ponto final que na verdade é abreviação de "Rua". A pontuação em pequenos textos segue regras diferentes do que em textos longos. Em um parágrafo, você aprende a confiar em vírgulas para separar orações. Em um pequeno texto com sinais de pontuação como um campo de formulário ou uma linha de log, cada caractere tem um peso maior e um erro de interpretação custa mais do que parece.
O problema que eu encontrei e como resolvi
No meu caso, precisei processar cerca de 200 mil linhas de endereços comerciais provenientes de notas fiscais eletrônicas. O formato era supostamente padronizado, mas na prática tinha variações como "Av. Paulista, 1578 - 4º Andar, Sala 412" vs "Av. Paulista 1578 4º andar sala 412". Meu primeiro parser usava expressões regulares simples baseadas em vírgulas e traços como delimitadores. Funcionou para 73% dos registros. Os outros 27% tinham erros de segmentação porque um pequeno texto com sinais de pontuação mistura pontos de abreviação (como "Av." e "R.") com terminações de frases e listas. A solução foi abandonar a abordagem baseada em delimitadores e adotar um classificador de entidade nomeada treinado com poucos exemplos. Treinei um BERT multilíngue fine-tuned com cerca de 3 mil amostras manualmente anotadas. O modelo conseguiu separar o logradouro do número, do complemento, do bairro e da cidade com acurácia de 96,3%. O ganho foi de 73% para 96,3% em campo, o que em termos práticos significa que eu deixei de ter que corrigir manualmente três em cada dez linhas.
O custo dessa abordagem é que o modelo precisa de treinamento supervisionado. Se você tiver apenas 500 linhas anotadas, a performance cai para cerca de 82%. A regra prática é: menos de 1.000 amostras, use regras heurísticas combinadas com validação manual dos casos extremos. Mais de 5.000, treine um classificador leve. Entre 1.000 e 5.000, tente Transfer Learning com modelos pré-treinados como o PT-BR mBERT ou o MiniLM.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Limitações que ninguém menciona
A principal limitação de qualquer abordagem para pequenos textos com sinais de pontuação é que a pontuação em português brasileiro tem ambiguidades estruturais que modelos não resolvem perfeitamente. O ponto final em "Sr." não é ponto final, é abreviação. O hífen em "socio-economico" pode ser erro de digitação ou realmente ser um hífen corretamente usado. O dois-pontos em "CNPJ: 12.345.678/0001-90" é separador, mas o mesmo caractere em "motivo: cancelamento" também é separador e os dois têm a mesma função sintática para um modelo. Outra limitação prática: modelos de NLP atuais ainda têm dificuldade com ortografia variante de endereços. "Ricardo" vs "Richárd" em nomes próprios, "Jardim" vs "Jardim de Alah" que são bairros diferentes mas parecem iguais para um tokenizer padrão. Recomendo adicionar uma camada de normalização prévia usando Damerau-Levenshtein com threshold de 2 para detectar grafias alternativas antes de passar para o classificador.
Passo a passo prático
Se você precisa implementar algo do zero hoje, comece pela normalização. Remova espaços múltiplos, normalize acentos usando NFD (non-spacing marks separam o acento da letra base, o que ajuda o tokenizer). Depois aplique regras heurísticas de baixo para cima: identifique CEPs pelo formato XXXXX-XXX, identifique CNPJs/CPFs pelo padrão de dígitos e traços, identifique datas pelo formato DD/MM/AAAA. Só então passe para o classificador. Para validação, use cross-validation estratificada por tipo de campo. Avalie metricas de F1 por classe, não apenas acurácia global. Um pequeno texto com sinais de pontuação pode ter 95% de acurácia mas falhar especificamente nos 5% que são os mais caros de corrigir manualmente. Esse é o risco de depender só da acurácia global.
O tempo médio de implementação completa, incluindo coleta de dados, anotação, treinamento e deploy, fica entre 40 e 80 horas para um projeto de média complexidade. Projetos menores, com menos variação na pontuação, podem ficar em 15-20 horas usando regras fixas. Projetos maiores, com multilingua, sobem para 120-200 horas porque a ambiguidade de pontuação aumenta exponencialmente quando você adiciona inglês, espanhol e italiano no mesmo pipeline.