Como adicionar pontuação a texto bruto de forma prática
O que é e quando você realmente precisa de texto com sinais de pontuação
Você pega um áudio transcrevido automaticamente, ou um texto extraído de uma imagem via OCR, e o resultado chega sem nenhuma vírgula, ponto final, ou sinal de interrogativo. Tudo encadeado em um parágrafo único. Isso acontece com frequência porque os sistemas de reconhecimento automático de fala e os motores de OCR não foram originalmente projetados para inserir pontuação. Eles geram tokens, não prosódia. A solução básica passa por um processo que eu chamo de pós-processamento pontual: você joga esse texto cru num modelo de linguagem treinado para pontuar, ou usa uma ferramenta específica que faz essa inferência, e pronto. O texto volta legível. O problema é que nem sempre funciona bem, e entender por que às vezes falha economiza horas de frustração.
Eu costumo usar um script Python simples que chama o modelo de pontuação do Hugging Face. O modelo mais direto é o nlpconnect/vit-gpt2-pt-pt ou versões similares fine-tuned para português. Você passa o texto sem pontuação, o modelo devolve o texto pontuado. Em teoria é simples. Na prática, esbarra em alguns detalhes que ninguém conta.
O método que funciona no dia a dia
Aqui está o fluxo que eu uso. Começa com a instalação das dependências básicas: pip install transformers torch
Depois, um script bem enxuto: from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "nlpconnect/vit-gpt2-pt-pt" tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name) texto_cru = "oi tudo bem comigo muito obrigado por ligar quero saber sobre o orçamento da reforma"
inputs = tokenizer(texto_cru, return_tensors="pt") outputs = model.generate(inputs, max_length=150)
👉 Clique no botão abaixo para saber mais sobre o assunto!
print(tokenizer.decode(outputs[0], skip_special_tokens=True)) Isso gera algo como: "Oi, tudo bem? Comigo, muito obrigado por ligar. Quero saber sobre o orçamento da reforma."
O tempo de processamento para um texto de até 500 palavras costuma ficar entre 2 e 8 segundos, dependendo da GPU disponível. Se você estiver rodando em CPU, pode levar de 30 segundos a 2 minutos. Nada excepcional, mas importante saber antes de colocar isso num pipeline que precisa de resposta rápida.
Um caso real que me obrigou a Adjustar a abordagem
Recentemente, precisei pontuar transcrições de atendimento médico. O texto vinha de um sistema de ditado por voz hospitalar, com muitos termos técnicos, abreviações e nomes próprios. O modelo padrão do Hugging Face falhava repetidamente nesses cenários. Ele colocava vírgula após "Dr." como se fosse o início de uma nova frase, e não conseguia distinguir quando "Sr." era título de tratamento versus parte de um nome. A solução foi fazer um ajuste fino com um pequeno dataset de transcrições médicas em português que eu montei. Cerca de 2000 amostras pontuadas manualmente, variando entre laudos, prescrições e anotações de evolução. Usei o LoRA (Low-Rank Adaptation) para adaptar o modelo base sem precisar retreiná-lo do zero. O resultado melhorou drasticamente a precisão em textos médicos, mas introduziu outro problema: o modelo passou a superpontuar textos do dia a dia, inserindo vírgulas onde não deveriam existir.
O workaround que encontrei foi simples: rodar o modelo geral primeiro no texto bruto, e depois aplicar um classificador de domínio que decide se passa pelo modelo ajustado ou não. Se o texto tem alta probabilidade de ser técnico/médico, vai pelo modelo ajustado. Senão, fica no modelo geral. Esse classificador é baseado em TF-IDF com poucas features como presença de termos médicos, siglas, e comprimento médio das sentenças.
Pegadinhas que ninguém menciona
Um erro comum é confiar cegamente na saída do modelo. A pontuação automática frequentemente erra em estruturas ambíguas como listas, diálogos e citações. O modelo não sabe diferenciar uma lista enumerada de uma sequência de frases normais. Se você tem um texto com itens separados por vírgulas que na verdade são elementos de uma lista, ele pode transformar tudo num único período longo. Outro ponto é a questão dos travessões e aspas em diálogos. Modelos genéricos raramente usam a convenção brasileira de travessão para diálogos. Eles tendem a usar aspas ou simplesmente continuar o texto sem qualquer indicador. Se o seu texto destino exige formatação adequada de diálogos, você precisará de uma regra pós-processamento adicional ou um modelo treinado especificamente para isso.
Também vale notar que o modelo não detecta tom. Frases declarativas que são, na verdade, perguntas indiretas costumam receber ponto final em vez de ponto de interrogação. "Ele perguntou se eu estava vindo" recebe ponto final, quando talvez fizesse mais sentido um ponto de interrogação se o contexto exigir. Isso depende muito do domínio do texto e do nível de formalidade.
Limitações reais do processo
O principal problema é que esse tipo de processamento não atinge 100% de precisão. Mesmo com ajuste fino, números na casa dos 85-90% são realistas para português. Isso significa que, em cada 100 frases pontuadas, cerca de 10 a 15 terão algum erro. Para textos curtos e bem estruturados, o erro costuma ser menor. Para textos longos, com múltiplosfalantes ou jargões variados, a taxa de erro sobe. Se você precisa de precisão 100%, a única alternativa honesta é revisão humana. Nenhum modelo atual substitui um revisor familiarizado com o contexto do texto. O que o pós-processamento automático faz bem é reduzir o trabalho manual em cerca de 70-80%. Você ainda precisa revisar, mas o texto já chega estruturado, o que acelera bastante o processo.
Para quem não quer codar nada, existem ferramentas online que fazem exatamente isso. Algumas gratuitas, outras pagas. A maioria usa modelos similares aos que descrevi aqui, mas com interface amigável e sem necessidade de configurar ambiente Python. Vale testar algumas para ver qual se adapta melhor ao seu tipo de texto antes de decidir se investe tempo num fluxo automatizado próprio.