Este algoritmo esta inspirado en el paper «A Syllabification Algorithm for Spanish» de Heriberto Cuayáhuitl. Pero realizando algunos cambios.
Para separar las palabras en sílabas usamos un algoritmo de dos pasos.
Paso 1
La clave del primer paso está en analizar las consonantes entre vocales. Podemos tener los siguientes casos: VCV, VCCV, VCCCV, VCCCCV. Siempre dividimos por delante de la última consonante: V|CV, VC|CV, VCC|CV, VCCC|CV . Sin embargo si la última consonante es una ‘r’, ‘l’ o ‘h’. Estamos ante una estructura de dos consonantes como cr, fr, rr, ll, ch,… Por lo que desplazaremos el corte a la consonante anterior. Hay que tener en cuenta algún detalle más. Cuando hay varias vocales juntas actúan como si fueran una sola. Así que realmente las V pueden representar a varias vocales.
El algoritmo necesita una variable temporal donde se almacena lo queda a la derecha del punto de corte. Pero antes de actualizarla esa variable hay que tomar el valor almacenado en ella, añadirle lo que queda a la izquierda del punto de corte y almacenarlo como una de las silabas. Puede que algunas de la silabas no sean correctas, de ellas se ocupará el paso 2.
El algoritmo elimina la parte analizada de la palabra y es como si siempre estuviera al principio de la misma. Para ello el algoritmo al cortar un bloque de vocales y consonantes toma el lado de la izquierda, lo junta con lo que haya almacenado en la variable temporal (el lado de la derecha del anterior corte), eso forma una silaba y la guarda. Luego almacena en la variable la parte de la derecha del corte hasta poder unirlo con la parte izquierda del siguiente corte (si no hubiera más cortes lo guarda y finaliza).
Al final las reglas que quedan son:
La palabra comienza por…. | Guardar | Variable Temporal (T) |
V -> | V | V | |
CV -> | CV | T | CV |
C[rlh]V -> | C[rlh]V | T | C[rlh]V |
CCV -> C | CV | T+C | CV |
CC[rlh]V -> C | C[rlh]V | T+C | C[rlh]V |
CCCV -> CC | CV | T+CC | CV |
CCC[rlh]V -> CC | C[rlh]V | T+CC | C[rlh]V |
CCCCV -> CCC | CV | T+CCC | CV |
C* -> C* | | T+C* |
Siendo: V = vocal/es, C = Consonante, [rlh] = consonante que sea r, l, h, T = variable temporal, | = punto de corte
La última regla hace referencia a que solo quedan caracteres y ninguna vocal, en ese caso se unen todo a lo que haya en la memoria temporal.
Ejemplos:
Palabra | Regla | Bloque | Guardar | Temporal | Sílabas |
---|---|---|---|---|---|
instrumento | V -> |V | | i | i | ||
nstrumento | CCC[rlh]V -> CC | C[rlh]V | ns | tru | i+ns | tru | ins, |
mento | CV -> | CV | | me | tru | me | ins, tru |
nto | CCV -> C | CV | n | to | me+n | to | ins, tru, men |
to | ins, tru, men, to |
Palabra | Regla | Bloque | Guardar | Temporal | Sílabas |
---|---|---|---|---|---|
trompeta | C[rlh]V -> | C[rlh]V | | tro | tro | ||
mpeta | CCV -> C | CV | m | pe | tro+m | pe | trom, |
ta | CV -> | CV | | ta | pe | ta | trom, pe |
ta | trom, pe, ta |
Palabra | Regla | Bloque | Guardar | Temporal | Sílabas |
---|---|---|---|---|---|
avión | V -> |V | | a | a | ||
vión | CV -> | CV | | vió | a | vió | a, |
n | C* -> C* | | n | | vió + n | a, vión |
Paso 2
En el segundo paso repasamos cada uno de los grupos creados en el paso anterior y vamos a dividir los grupos de vocales cuando sea necesario. Separaremos las vocales en dos grupos: débiles {i,u} y fuerte {a,e,o}. Denotaremos el grupo de débiles con d y el de fuertes con f. A su vez pueden estar acentuadas o no, lo indicaremos como D {í,ú} y F {á,é,ó}.
Para dos vocales juntas las reglas son:
- Permanecen juntas: dd, df, dF, Fd
- Se separan: ff, Ff, fF, Df, fD
En el caso de tres vocales solo se separan si hay dos fuertes juntas.
- {iuüíú}{aeoáéó}{aeoáéó} -> {iuüíú}{aeoáéó} | {aeoáéó}
- {aeoáéó}{aeoáéó}{iuüíú} -> {aeoáéó} | {aeoáéó}{iuüíú}
Ejemplo:
«avión» tras el paso uno queda dividida en «a»,»vión». Al ser «vión» un caso dF las vocales no se dividen, el paso dos devolverá «a»,»vión»
«rocíen» se separará en el paso uno en «ro»,»cíen». Como íe es un caso de Df se separara «ro»,»cí»,»en»
En cambio «ca»,»ca»,»hue»,»te» en el caso de «hue» al ser df seguirán juntas.
Todo esto está recopilado en la librería jsESsyllable.
var syllable = new jsESsyllable();
var word = "...";
var syllables = syllable.divide(word);
Puedes usar la demo online.
Tienes un vídeo explicando este mismo algoritmo en mi canal de youtube:
Pingback: Calcular la dificultad de lectura de una palabra | Construyendo a Chispas