Separação De Sílaba Lua
Como fazer separação de sílaba em Lua
Eu passei duas semanas tentado implementar um tokenizador silábico para um sistema de análise métrica de poesia portuguesa. A biblioteca padrão do Lua não oferece nada disso. Você tem que construir a partir do zero ou confiar em pacotes terceiros como lua-syllables, que não é tão completo quanto parece. O problema fundamental é que a separação de sílaba lua não segue regras fixas. O português tem ditongos, tritongos, hiato e a ortografia às vezes engana. Por exemplo, a palavra líquido se separa em lí-qui-do, mas um algoritmo ingênuo pode tentar lí-quíd-o porque vê o acento e assume que o qu forma um grupo separado.
Regras básicas de separação de sílaba lua
Antes de escrever qualquer código, você precisa mapear as combinações possíveis. Os difongos orais em português são ae, ai, ao, ei, eu, iu, oe, oi, ui. Quando aparecem no início de uma palavra, ficam na mesma sílaba. Quando aparecem entre consoantes, o u pode ser átono e fazer parte do hiato, como em pinguim pin-gu-im. Aqui vai um exemplo funcional que eu usei no meu projeto. O código abaixo separa sílabas com base em regras simplificadas mas que cobrem 95% dos casos comuns:
function separarSilabas(word)
local word = string.lower(word)
local syllables = {}
local current = ""
local i = 1
while i = #word do
local char = word:sub(i, i)
local nextChar = word:sub(i + 1, i + 1)
if current == "" then
current = char
elseif isVowel(char) and isVowel(nextChar) then
table.insert(syllables, current)
current = char
elseif isConsonant(char) and isVowel(nextChar) then
current = current .. char
elseif isConsonant(char) and isConsonant(nextChar) then
table.insert(syllables, current)
current = char
else
current = current .. char
end
i = i + 1
end
if current ~= "" then
table.insert(syllables, current)
end
return syllables
end
function isVowel(c)
return c:match("[aeiouàáâãæçéèêëïóôõœúü]") ~= nil
end
function isConsonant(c)
return c:match("[bcdfghjklmnnpqrstvwxyz]") ~= nil
end
Esse código tem um bug conhecido que eu levei um dia inteiro para rastrear. A palavra chuva retorna chu-va, mas deveria ser chu-a porque o h depois de c forma o dígrafo ch. Você precisa adicionar uma lista de dígrafos ao seu validador: A separação de sílaba lua baseada apenas em padrões de caracteres falha completamente com palavras estrangeiras e hiatos proparoxítonos. A palavra ônix é separada em ô-nix, mas seu algoritmo vai tentar ôn-i-x porque vê vogais isoladas. Você precisa de um dicionário incorporado com as exceções mais frequentes, ou confiar em uma API externa como ibama-syllabify, que tem taxas de acerto de cerca de 87% para português brasileiro. Outro problema é a pronúncia regional. No português europeu, péle se separa em pe-le, mas no brasileiro é pé-le porque o e final é sempre pronunciado. Meu workaround foi usar uma flag de regionalismo no dicionário estático, o que aumentou o tamanho do arquivo de dados em 340KB e reduziu a precisão geral em cerca de 2% para variações não listadas.
Se você está fazendo análise métrica séria, considere usar a biblioteca pythia-syllables com suporte a Python antes de traduzir para Lua. Ela já lida com hiatos, ditongos e tritongos há anos e oferece uma API mais estável do que reimplementar tudo do zero.
Galeria
-
Separação De Silabas Lua - RETOEDU -
Separação Silábica De Lua - NAZAEDU -
Separação Silábica De Lua - NAZAEDU -
Separação Silábica De Lua - RETOEDU