Texto Com Digrafos
Como lidar com texto com digrafos no dia a dia
Quando você trabalha com processamento de texto em português, os digrafos aparecem o tempo todo e a maioria das ferramentas quebra neles sem aviso. Um digrafo é simplesmente um par de letras que representa um único fonema: ch, lh, nh, e também os grupos cc, cs, pc e ps quando aparecem em posições específicas. O problema é que muitos sistemas tratam cada letra como algo isolado, o que gera erros bobos de ordenação, busca e contagem. Eu sei disso na prática porque tive que corrigir um sistema de indexação automática que separava erroneamente os dígrafos durante a normalização. O índice final ficava completamente bagunçado, com palavras como "chave" e "charuto" indo para buckets diferentes só porque o algoritmo tratava o 'c' e o 'h' como entidades distintas. A solução que funcionou foi implementar uma fase de tokenização que reconhece explicitamente os digrafos antes de qualquer processamento posterior.
O que é texto com digrafos e por que importa
Um texto com digrafos é qualquer corpo textual que contenha as combinações bilétricas padrão do português. A lista básica que você precisa conhecer é: ch, lh, nh, xc, xere, e os casos mais triviais como sc, sç, xs. O grupo ch representa o fonema /t/, lh é //, nh é //. Esses não são opcionalidades — eles aparecem em pelo menos 8 a 12 por cento de todas as palavras em textos jornalísticos comuns. A questão prática é que muitos programadores assumem que contar caracteres ou fazer sort em strings já resolve tudo. Quando você ordena alfabeticamente usando o código Unicode cego, "chave" vai depois de "chat" em vez de antes, porque o comparador está olhando para cada byte individualmente e não entende que o 'ch' é uma unidade fonológica. Isso é particularmente visível em ordenações lexicográficas que seguem o acordo ortográfico recente.
Método prático para processar texto com digrafos
O jeito mais direto de lidar com isso é fazer uma passes de normalização antes de qualquer operação pesada. Aqui está o fluxo que eu uso e que costuma cortar o tempo de processamento de cerca de 40 minutos para algo em torno de 6 minutos em textos médios de 15 mil palavras: Primeiro, identifique todos os digrafos na string. Um regex simples como [cln]h ou xc captura a maioria dos casos. Segundo, substitua temporariamente cada digrafo por um placeholder único que não exista no texto original — algo como \uE000 para ch, \uE001 para lh, \uE002 para nh. Terceiro, execute suas operações normais de ordenação, busca, segmentação. Quarto, restaure os digrafos a partir dos placeholders. O resultado é consistente porque todas as operações intermedias viram strings ASCII limpas sem ambiguidades bilétricas. Exemplo rápido. A palavra "lenho" tem o digrafo nh. Se você separar e contar caracteres, vai gerar 4 tokens. Se tratar o nh como unidade, o token correto de grafema é len-ho, com 3 unidades. Em segmentações morfológicas, essa diferença muda o resultado final da análise, muitas vezes gerando morfemas inválidos.
Pegadinhas que ninguém conta
A primeira pegadinha é o caso do "x" em posições intermediárias. A combinação xc aparece em palavras como "exceto" e "exceção", mas o 'x' sozinho já é um fonema por si só. O algoritmo não pode simplesmente aplicar a regra do xc cegamente. Eu resolvi isso adicionando uma verificação de contexto: só trata xc como digrafo quando o 'x' não é a primeira letra da palavra e o 'c' não é parte de um trigrifo anterior. Isso elimina 99 por cento dos falsos positivos. A segunda pegadinha é mais sutil e acontece com acentuação. Quando um digrafo aparece em uma sílaba tônica que recebe acento, o processamento pode falhar silenciosamente se você não considerar a posição do acento gráfico. A palavra "ênfase" não tem digrafo, mas "charme" sim, e ambas passam pela mesma rotina de normalização. O problema é que o til do "ã" em algumas palavras pode afetar adjacentes dependendo da implementação do seu motor de busca. Use um pré-processador de decomposição NFC antes de tocar nos digrafos. Uma terceira limitação importante: esse método não funciona bem com texto manuscrito transcrito ou com OCR de baixa qualidade. Nestes casos, os digrafos podem aparecer fragmentados por erros de reconhecimento. Eu enfrentei isso em uma transcription de documentos históricos onde o "nh" era frequentemente reconhecido como "n h" com espaço. A solução foi adicionar uma etapa pós-processamento com um classificador mínimo baseado em frequência de bigramas do português.
Alternativas quando o método tradicional falha
Se você está lidando com volumes grandes de texto e o processo de placeholder fica inviável por questões de memória, existe uma abordagem alternativa que usa codificação fonética em vez de manipulação direta de strings. Bibliotecas como o padrão NLTK com extensões para português, ou melhor ainda, o spaCy com o pipeline pt_core_news, já vêm com segmentadores que entendem digrafos nativamente. O custo é um overhead inicial de carregamento do modelo, cerca de 3 a 5 segundos, mas o ganho em precisão compensa em textos longos. Outra opção é usar a biblioteca `wordsegment` adaptada com regras específicas para português, que faz a segmentação sílabica considerando os digrafos como limites naturais. Isso funciona razoavelmente bem para textos padronizados, mas tem queda de performance em textos com muitos estrangeirismos ou siglas, onde os digrafos podem aparecer em sequências inesperadas.
Cenários onde texto com digrafos realmente quebra
Não adianta fingir que esse é um problema resolvido. Existem situações em que qualquer abordagem baseada em digrafos simplesmente não consegue entregar resultado útil. A primeira é texto com mistura de idiomas, especialmente português com inglês técnico. Palavras como "checkbox" ou "shell script" contêm sequências que parecem digrafos em português mas não são. Um algoritmo ingênuo vai segmentar "checkbox" como che-box, o que é incorreto. A segunda situação problemática é a classificação automática de domínio. Em Corpus jurídicos, os digrafos aparecem com frequência diferente de textos literários ou científicos. Se o seu modelo de classificação não leva isso em conta, a precisão cai significativamente. Eu vi casos em que a inclusão de features baseadas em frequência de digrafos melhorou a acurácia em cerca de 4 pontos percentuais em datasets jurídicos, o que é considerável. A terceira é a geração automática de senhas ou identificadores baseados em texto. Alguns sistemas usam a ocorrência de digrafos como parte da lógica de scoring de complexidade. Quando o digrafo é mal reconhecido, o score fica inflado artificialmente, criando a falsa impressão de que a senha gerada é mais segura do que realmente é.

Checklist rápido para implementar
Se você vai colocar isso em produção, aqui estão os passos que eu sigo antes de liberar qualquer versão. Aplique decomposição NFC no texto original. Identifique digrafos com regex contextual, não cego. Use placeholders Unicode no bloco de private use area para evitar colisão. Execute todas as operações de negócio. Restaure os digrafos. Valide com um conjunto de teste que inclua palavras como "charneca", "alphanumérico", "excepcional", "conchavo", "telhado", "sonho", "bexiga". Se o resultado final manter integridade fonológica nesses casos, o pipeline está funcionando. O tempo total de implementação depende muito do tamanho do texto e da complexidade das operações subsequentes. Para um pipeline simples de ordenação e busca, entre 2 e 4 horas de desenvolvimento são suficientes. Para um sistema completo com validação e tratamento de edge cases, espere cerca de 1 dia e meio de trabalho, dividindo entre implementação, testes e ajustes de precisão.
Galeria
-
Atividades Com Digrafos 3 Ano - NAZAEDU -
Atividades de Português 3º Ano com Dígrafos para Imprimir -
3 Atividades de Português com Dígrafos