#!/usr/bin/perl
################################################################
# Autor: Xavier López Morrás (2005)
#
# prolepsi@yahoo.es
#
# separador.pl SEPARADOR DE SÍLABAS Y ACENTUADOR .
# INPUT: transcripcion.
# OUTPUT: transcripcion silabificada y acentuada.
################################################################
#####################################################################
#### Puedes hacer uso libre del script y código a nivel personal.
#### Para otras finalidades consultar al autor.
#####################################################################
sub proc_sil {
#recogemos el argumento que es la transcripcion fonetica sin separacion de silabas ni acentos
local $transcripcion= shift;
#convertiendo carácteres para procesar con más facilidad
$transcripcion =~ s/γ/G/g;
$transcripcion =~ s/θ/Z/g;
$transcripcion =~ s/β/B/g;
$transcripcion =~ s/ř/R/g;
$transcripcion =~ s/t∫/X/g;
$transcripcion =~ s/ð/D/g;
$transcripcion =~ s/λ/L/g;
$transcripcion =~ s/ŋ/ç/g;
$transcripcion =~ s/^ +//g;
#creamos un array cuyos elementos son las palabras
@palabras= split(/ /,$transcripcion);
local $n=0;
##########################################################################################
## procesamiento de una palabra
##########################################################################################
for (@palabras) {
local $palabra=$palabras[$n];
local $n2=-1;
###################################################################################
## procesamiento de una silaba individual
###################################################################################
#for ($n3=0; (length($palabra)) >= $n3; $n3++) {
while ( (substr($palabra,$n2,1)=~/./) ) {
$letra0= substr($palabra,$n2,1);
$letra1= substr($palabra,$n2-1,1);
$letra2= substr($palabra,$n2-2,1);
$letra3 =substr($palabra,$n2-3,1);
$letra4 =substr($palabra,$n2-4,1);
$letra_sig=substr($palabra,$n2+1,1);
local $silaba="8xz";
#print "<font color=grey>-$letra0-</font>";
#caso CV
if ($letra0=~/[aeiouAEIOU]/) {
if ($letra1=~/[bBcdDfgGhklLmnNñprRstvxXyzZ]/) {
unless ( ($letra2=~/[tkpgGdDfbB]/) && ($letra1=~/[rl]/) ) {
$silaba=$letra1.$letra0;
##print "$silaba!!<br>";
$n2--;
}
}
}
#caso CVC
if ($letra0=~/[nszrNpkmMlLZçdDgb]/) {
if ($letra1=~/[aeiouAEIOU]/) {
if ($letra2=~/[bBcdDfgGhklLmnNñprRstvxXyzZ]/) {
unless( ($letra3=~/[tkpgGdDfbB]/) && ($letra2=~/[rl]/) ) {
$silaba="$letra2"."$letra1"."$letra0";
##print "$silaba*<br>";
$n2=$n2-2;}
}
}
}
#caso V
if ( ($letra0=~/[aeiouAEIOU]/) ) {
unless ( ($letra1=~/[bBcdDfgGhklLmnNñprRstvxXyzZ]/) || ($letra1=~/[jw]/) ) {
$silaba= "$letra0";
##print "$silaba?<br>";
}
}
#caso VC
if ( ($letra0=~/[nszrNpkmMlLZçdDgb]/) && ($letra1=~/[aeiouAEIOUwj]/) ) {
unless ($letra2=~/[bBcdDfgGhklLmnNñprRstvxXyzZ]/ || ($letra2=~/[jw]/) ) {
$silaba= $letra1.$letra0;
##print "$silaba-<br>";
$n2--;
}
}
#caso VCC
if ( ($letra0=~/[s]/) && ($letra1=~/[kn]/) && ($letra2=~/[aeiouAEIOU]/) ) {
$silaba= $letra2.$letra1.$letra0;
$n2=$n2-2;
##print "$silaba*<br>";
}
#caso CCV
if ( ($letra0=~/[aeiouAEIOU]/) && ($letra1=~/[rl]/) && ($letra2=~/[tkpgGdDfbB]/) )
{$silaba= $letra2.$letra1.$letra0;
##print "$silaba<br>";
$n2=$n2-2;}
#caso CCVC
if ( ($letra0=~/[nszrNpkmMlLZçdDgb]/) && ($letra1=~/[aeiouAEIOU]/) && ($letra2=~/[rl]/) && ($letra3=~/[tkpgGdDfbB]/)) {$silaba= $letra3.$letra2.$letra1.$letra0;
##print "$silaba<br>";
$n2=$n2-3;}
#caso CVCC
if ( ($letra0=~/[s]/) && ($letra1=~/[b]/) && ($letra2=~/[aeiouAEIOU]/) && ($letra3=~/[s]/) )
{$silaba= $letra3.$letra2.$letra1.$letra0;
$n2=$n2-3;}
#diptongos
#caso CVv y Vv
if ( ($letra0=~/[jw]/) && ($letra1=~/[aeiou]/) ) {
if ($letra2 =~/[bBcdDfgGhklLmnNñprRstvxXyzZ]/) {
$silaba= $letra2.$letra1.$letra0;
##print "$silaba<br>";
$n2=$n2-2;
}
elsif ( ($letra0=~/[jw]/) && ($letra1=~/[aeiou]/) ) {
$silaba= $letra1.$letra0;
##print "$silaba¿¿<br>";
$n2--;
}
}
#caso CvV
if ( ($letra0=~/[aeiouAEIOU]/) && ($letra1=~/[jw]/) ) {
if (($letra2 =~/[bBcdDfgGhklLmnNñprRstvxXyzZ]/) ) {
unless ($encontrada==1) {
$silaba = $letra2.$letra1.$letra0;
##print "$silaba-<br>";
$n2=$n2-2;
}
}
elsif ( ($letra0=~/[aeiou]/) && ($letra1=~/[jw]/) ) {
$silaba= $letra1.$letra0;
##print "$silaba<br>";
$n2--;
}
}
#caso CvVC
if ( ($letra0=~/[cksznNplrçm]/) && ($letra1=~/[aeiouAEIOU]/) && ($letra2=~/[wj]/)
&& ($letra3=~/[bBcdDfgGhklLmnNñprRstvxXyzZ]/) ) {
$silaba= $letra3.$letra2.$letra1.$letra0;
##print "$silaba<br>";
$n2 = $n2-3;
}
#caso CCvV
if ( ($letra0=~/[aeiou]/) && ($letra1=~/[jw]/) && ($letra2=~/[rl]/) && ($letra3=~/[tkpgGdDfbB]/) ) {
$silaba= $letra3.$letra2.$letra1.$letra0;
$n2= $n2-3;
}
#caso CCVv
if ( ($letra0=~/[jw]/) && ($letra1=~/[aeiou]/) && ($letra2=~/[rl]/) && ($letra3=~/[tkpgGdDfbB]/) ) {
$silaba= $letra3.$letra2.$letra1.$letra0;
$n2= $n2-3;
}
#caso CCvVC
if ( ($letra0=~/[cksznNplrçm]/) && ($letra1=~/[aeiou]/) && ($letra2=~/[jw]/) && ($letra3=~/[rl]/) &&
($letra4=~/[tkpgGdDfbB]/) ) {
$silaba= $letra4.$letra3.$letra2.$letra1.$letra0;
$n2= $n2-4;
}
################################## fin diptongos ############################
#caso CCVCC
if ( ($letra0=~/s/) && ($letra1=~/[n]/) && ($letra2=~/[aeiouAEIOU]/) && ($letra3=~/[r]/)
&& ($letra4=~/[tkpgGdDfbB]/) ) {
$silaba= $letra4.$letra3.$letra2.$letra1.$letra0;
##print "$silaba*<br>";
$n2= $n2-4;
}
#otros casos
if ( ($letra0=~/[jw]/) ) {
unless ( $letra1=~/[aeioubBcdDfgGhklLmnNñprRstvxXyzZ]/ ) {
$silaba= $letra0;
##print "$silaba*<br>";
##$tonica_encontrada=1;
}
if ($letra1=~/[bBcdDfgGhklLmnNñprRstvxXyzZ]/) {
$silaba=$letra1.$letra0;
print "$silaba:<br>";
$n2--;
}
}
if ($silaba=="8xz") {
$silaba="?";
}
#comprobamos si es tónica con acento
unshift(@word,$silaba);
$n2--;
}
#############################################################################################
############################## fin procesamiento silaba ###################################
####asignamos el acento si hay tónica
local $n5=0;
for (@word) {
if ($word[$n5]=~/[AEIOU]/) {
$word[$n5]= "'".$word[$n5];
$tonica_encontrada=1;
}
$n5++;
}
####### acentos por defecto #######################
unless (($tonica_encontrada==1)) {
if (@word>1) { # si no es monosilabo....
if ($word[-1]=~/[rlZdD]$/) { # si la ultima silaba acaba en C
$word[-1]="'"."$word[-1]";
}
else {
$word[-2]="'"."$word[-2]";
}
}
if ((@word==1) && ($word[0]=~/ir|ba|Ba/)) {
$word[0]="'"."$word[0]";
}
elsif ( (@word==1) && ($word[0]=~/[^']..+/)) { #si es monosilabo y tiene 3 o mas letras
unless ($word[0]=~/^lo[sz]$|^la[sz]$/) { #excepto 'los' y 'las'
$word[0]="'"."$word[0]";
}}
}
#añadimos la palabra a la frase en formas de elementos (=silabas) de un array
push(@phrase_sil, @word);
#reseteamos la palabra
@word=();
$tonica_encontrada=0;
$n++;
}
############ convertimos de nuevo los caracteres para ser visualizador en pagina web ######################
local $n4=0;
for (@phrase_sil) {
$phrase_sil[$n4] =~ s/G/γ/g;
$phrase_sil[$n4] =~ s/Z/θ/g;
$phrase_sil[$n4] =~ s/B/β/g;
$phrase_sil[$n4] =~ s/R/ř/g;
$phrase_sil[$n4] =~ s/X/t∫/g;
$phrase_sil[$n4] =~ s/D/ð/g;
$phrase_sil[$n4] =~ s/ç/ŋ/g;
$phrase_sil[$n4] =~ tr/AEIOU/aeiou/;
$phrase_sil[$n4] =~ s/L/λ/g;
$n4++;
}
############################################################################################################
############################ fin procesamiento palabra ####################################################
return @phrase_sil;
}
############################### fin separador de silabas ##################################################
1;