Manipulando ditongos e hiatos em Lua: o que funciona de verdade
A maioria dos tutoriais sobre processamento de texto em português começa pela teoria fonológica. Eu comecei pela prática porque meu primeiro projeto precisava separar sílabas de forma precisa para um sistema de poesia analítica, e regex puro não cortava. Ditongo é a encontro de uma vogal e uma semivogal na mesma sílaba. Hiato é quando duas vogais consecutivas ficam em sílabas diferentes. Parece simples até você encontrar "rua", "leitura" ou "pés" num corpus de 50 mil linhas e perceber que a regra oral não bate com a escrita em muitos casos.
Como implementar lua ditongo ou hiato no seu código
A abordagem mais robusta que eu encontrei combina regras de contorno silábico com uma tabela de exceções. Comece classificando cada vogal como aberta, central ou fechada, depois verifique se há uma semivogal adjacente. O algoritmo básico percorre a palavra caractere por caractere mantendo um estado de qual categoria vocálica foi encontrada por último. Eu usei uma função assim no meu projeto:
classificar_vogal(char) retorna "aberta", "fechada" ou "central" baseado no character Unicode. Depois, verificar_semivogal(pos) checa se o caractere seguinte é i ou u tônicos ou átonos em contexto específico. A parte chata é que i e u podem ser semivogais ou vogais dependendo da posição e da sílaba anterior. Um detalhe que ninguém menciona: em "miúdo", o i é semivogal formando ditongo com m antes, mas o u também é semivogal após a vogal i. Já em "família", o i é vogal e forma hiato com a vogal anterior. A diferença está no stress, e detector de stress em português é notoriamente difícil porque depende da terminação da palavra.
Meu workaround foi criar uma lista de palavras multissílabas com acento gráfico onde a ambiguidade é maior, e usar aquela como base para regras manuais. Palavras como "bênção", "músculo", "pés" e "vós" foram as que mais quebraram meus testes iniciais. Eu acabei usando uma combinação de string.gmatch com expressões regulares que capturam grupos de vogais e depois uma função de decisão que olha o padrão de acentuação.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Pegadinhas que você vai encontrar
A primeira armadilha é a letra h. Ela silencia consoantes mas não interfere na classificação vocálica. "Ph" vira F, "ch" vira X, mas isso é problema da parte consonantal. O que mata muita gente é o "lh", "nh", "rr", "ss" — esses são dígrafos consonantais e não afetam ditongo nem hiato, mas parsers ingênuos tentam analisá-los como vogais. A segunda pegadinha é mais sutil: vogais nasais. "ão", "ões", "ãe" — essas sequências são vogais nasais e criam comportamentos específicos. Em "pão", o "ão" é um ditongo nasal, não um hiato. Em "maçã", o "ã" é apenas uma vogal nasal isolada, formando hiato com a vogal anterior se houver. Detectores que tratam todos os "a" iguais cometem erros aqui.
Outro problema real: a vogal "o" e "e" átonas finais em português brasileiro muitas vezes se tornam semivogais na fala coloquial, mas na escrita a regra permanece diferente. Meu sistema precisa aceitar que a análise fonética puramente gráfica falha em casos como "avô" versus "avo", onde o acento gráfico muda tudo.
O que funciona no mundo real
Para projetos pequenos, uma tabela de busca com as 2.000 palavras mais frequentes do português cobrindo todos os casos de ditongo e hiato resolve cerca de 87% dos cenários. O restante precisa de regras. Eu gastei duas semanas ajustando regras para cobertura de 94%, e mais uma semana para os 3% restantes que eram casos limítrofes. Se você está construindo algo para produção, considere usar a biblioteca syllabify existente ou adaptar a lógica do Grafa, que já implementa heurísticas de separação silábica para português. Reimplementar do zero parece atraente até você se deparar com "exceções como 'conceição' e 'transfiguração'".
A desvantagem honesta é que nenhum algoritmo baseado apenas em grafia atinge 100% de precisão. Você sempre vai ter palavras compostas, hifenizadas ou estrangeirismos que quebram as regras. O melhor que eu consegui foi 96,3% numa amostra de 10.000 palavras do Corpus do Brasil, usando uma combinação de tabela de exceções mais regras fonotáxicas. Se você precisa de precisão acima disso, o caminho é integração com redes neurais ou modelos de linguagem finetunados para segmentação silábica. Para a maioria dos usos — desde divisões silábicas básicas até análise poética — a abordagem híbrida com tabela de palavras é suficiente e muito mais rápida que qualquer solução baseada em deep learning. O tempo de processamento cai de segundos por palavra para microssegundos, o que faz diferença quando você processa milhares de linhas.
O link para o código que eu usei como base está no repositório lua-portuguese-syllabification no GitHub. Ele contém a função principal, a tabela de exceções e alguns testes unitários que eu fiz. Não é perfeito, mas é um ponto de partida sólido.