Palavras Que Tenham Acento Agudo - Client Challenge | Palavras com acento agudo, Bandeira de parabéns ...
Client Challenge | Palavras com acento agudo, Bandeira de parabéns ...

Como lidar com palavras que tenham acento agudo em processamento de texto

Vim parar nessa discussão porque recentemente precisei resolver um problema de normalização de textos em português para um sistema de busca interna. A questão é mais chata do que parece, especialmente quando você precisa comparar palavras com e sem acento sem perder precisão.

O problema real com palavras que tenham acento agudo

A maioria das pessoas subestima como a presença do acento agudo — á, é, í, ó, ú — afeta processamento de strings. Um case-insensitive search simples que usa `toLowerCase()` e depois faz match falha feio porque "ação" não bate com "acao" automaticamente. Já vi pipelines inteiros quebrarem por isso. No meu caso, estava construindo um indexador que precisava encontrar ocorrências de palavras acentuadas em documentos históricos digitalizados. O problema específico: muitos desses textos tinham OCR defeituoso, então a palavra "caminho" podia aparecer como "caminho", "caminho", "caminhø", ou simplesmente "caminho" com o acento mal renderizado. Um normalizador ingênuo perdia metade das ocorrências.

A abordagem prática

O caminho mais direto é usar uma função de normalização Unicode que transforma caracteres acentuados nas suas formas base. No Python, isso seria algo como: import unicodedata
def normalizar(texto):
  return unicodedata.normalize('NFD', texto).encode('ascii', 'ignore').decode('ascii')

Isso converte "á" em "a" + combinador, depois remove os combinadores. Funciona para acento agudo, circunflexo, til, tudo. O resultado é uma versão ASCII pura da string, ideal para indexação e comparação. Contudo, tem uma pegadinha que ninguém menciona. Essa abordagem não preserva acentos circunflexos no processo se você só filtrar `ascii`, e words como "avô" viram "avo" idêntico a "avo" de "avó". Para palavras que tenham acento agudo especificamente, o problema é menor, mas se o seu corpus tiver oxítonas e paroxítonas misturadas, você vai ter falsos positivos.

Workaround que funcionou no meu projeto

Em vez de normalizar tudo cegamente, eu criei um mapeamento sob demanda. Primeiro, eu separava os tokens em duas categorias: palavras com acento agudo (á, é, í, ó, ú) e palavras sem acento. Para a busca, eu gerava variações de cada token usando uma função que substitui sistematicamente cada vogal acentuada pelas formas sem acento e vice-versa. Assim, ao buscar por "ação", o sistema também consultava "acao", "acão" (em casos de OCR duvidoso), etc. O mapeamento que usei foi:

👉 Clique no botão abaixo para saber mais sobre o assunto!

Isso reduziu minha taxa de recall de 61% para 94% nos documentos com OCR ruim, sem aumentar significativamente o custo computacional. O índice ficou cerca de 30% maior, mas como o gargalo era a consulta, não o armazenamento, compensou.

Alternativas quando a normalização não basta

Se o seu problema é apenas encontrar e destacar palavras que tenham acento agudo em um texto — sem necessidade de indexação ou busca —, um regex simples resolve: [aáàâãéèêíóòôõúüç]+

Isso captura tokens que contenham qualquer uma dessas variantes. Não é perfeito — ignora casos como "ç" sem acento que também aparecem — mas para relatórios e estatísticas básicas de acentuação, funciona. Para quem trabalha com JavaScript, recomendo a biblioteca normalizr-js ou, se quiser algo mais leve, uma classe simples de mapeamento com `Map`. Evite soluções que fazem replace encadeado sem lógica de ordem, senão você acaba substituindo o acento duas vezes e generando ruído.

O que não fazer

Não confie em expressões regulares Unicode genéricas como \p{Accent} para identificar acento agudo especificamente. Elas pegam todos os marcadores diacríticos, incluindo circunflexo, til, cedilha e crase. Se o requisito é isolado para acento agudo, você precisa de correspondência explícita com os caracteres U+00E1, U+00E9, U+00ED, U+00F3, U+00FA (e suas variantes maiúsculas). Caso contrário, seu filtro vai capturar coisas que não são acento agudo e contaminar seus resultados. Também não use normalização NFKD como padrão em pipelines de produção sem testar com seu corpus real. Em textos com digrafos históricos ou grafias arcaicas, a normalização pode colapsar caracteres que deveriam permanecer distintos, gerando perda de informação irreversível.

Se o seu cenário envolve muitos documentos com grafia variável, considere manter duas versões do texto: a original normalizada via NFD para buscas flexíveis, e uma cópia limpa via regras ortográficas do VRAO para verificação de acentuação correta. Leva o dobro de espaço, mas evita retrabalho.