Skip to content

alvarogonzalezsotillo/rimas

Repository files navigation

Presentación del problema

El castellano es un idioma transparente, lo que significa que hay una gran relación entre cómo se escribe una palabra y cómo se pronuncia. Se pretenden resolver los siguientes problemas a partir de una palabra escrita:

  • Dividir la palabra en sílabas
  • Conocer la sílaba tónica de la palabra
  • Saber si la palabra rima con otra palabra

Si no te interesa el algoritmo, puedes saltar a cómo usar el código, al repositorio en Github o a la página de ejemplo.

Este es un problema que parece simple a primera vista, pero con una complejidad, interdependencia y cantidad casos particulares que no esperaba encontrarme. El siguiende diagrama muestra la relación entre cada parte del problema. Por ejemplo, el significado de la palabra afecta a cuál es su sílaba tónica.

<<diptongos-hiatos>> Diptongos e hiatos

Varias vocales juntas forman un hiato, y pertenecen a sílabas distintas, si:
  • Son vocales abiertas, o fuertes: a, e, o. Por ejemplo, {{{INI}}} es. car . *ce* . o {{{FIN}}}
  • El acento prosódico recae en una vocal cerrada (débil): i, u. Por ejemplo, {{{INI}}} al . cal . *dí* . a {{{FIN}}}
  • En los demás casos (vocales cerradas y abiertas, o vocales cerradas), las vocales forman un diptongo.

Estas normas se ven afectadas, por tanto, por las normas de acentuación.

<<separar-silabas>> División en sílabas de una palabra

Una palabra se compone de sílabas. En castellano, una sílaba tiene solo un grupo vocálico, que puede ser una sola vocal o varias vocales formando un diptongo (por tanto, los diptongos/hiatos afectan a este problema).

Al grupo vocálico pueden acompañar consonantes como sufijo o prefijo.

División sin importar hiatos/diptongos

Las sílabas en castellano tienen la siguiente estructura general: Posiblemente algunas consonantes, algunas vocales y posiblemente algunas consontantes:

  1. No todas las consonantes pueden darse al principio de sílaba. Las que pueden darse son:
    • Dobles consonantes: ch, rr, ll, dr, tr, ps. No pueden darse otras como dl o tl.
    • Cualquier consonante simple
  2. Pueden ir varias vocales juntas. Según la RAE, una letra h no rompe el grupo vocálico.
  3. No todas las consonantes pueden darse al final de la sílaba. las que pueden darse son b , c , d , f , g , l , m , n , ns , p , r , rs , s , t , x , y , z

Dada una palabra escrita, estas normas permiten dividirla de varias formas. Por ejemplo, la palabra apeninos podría dividirse como {{{INI}}} ap . en . in . os {{{FIN}}} o como {{{INI}}} a . pen . i . nos {{{FIN}}} . La forma correcta se consigue aplicando algunas prioridades al extraer las sílabas:

  1. Una sílaba solo con vocales
  2. Una sílaba con consonantes y vocales
  3. Una sílaba con vocales y consonantes
  4. Una sílaba con consonantes, vocales y consonantes

De esta forma, se utiliza un backtraking extrayendo la siguiente sílaba en el orden anterior, y se considera la primera forma de división encontrada. Por ejemplo:

  • apeninos
  • a peninos (1)
  • a-pe ninos (1 no es aplicable, se aplica 2)
  • a-pe-ni-no s (1 no es aplicable, se aplica 2)
  • a-pe-ni-no s (no puede aplicarse ninguna regla, backtrack)
  • a-pe-ni-nos (1 y 2 no son aplicables, se aplica 3)

Estas normas generales no funcionan en algunos casos, para los que se utilizan normas especiales:

  • la sílaba trans es un prefijo, que no debe separarse: {{{INI}}} trans . at . *lán* . ti . co {{{FIN}}}
  • Aunque una sílaba puede empezar por ps, solo debe ocurrir a principio de palabra. Si no, palabras como épsilon o sepsis se interpretarían como {{{INI}}} *e* . psi . lon {{{FIN}}} o {{{INI}}} *se* . psis {{{FIN}}}

Hiatos

Para localizar los hiatos de una sílaba se siguen las siguientes normas:
  1. Si solo hay una vocal, no hay hiatos
  2. Se comprueba si cada par de vocales (puede haber triptongos y vocales separadas por h) es un hiato, con las siguientes normas:
    • Una vocal cerrada acentuada al lado de otra vocal forma un hiato
    • Dos vocales abiertas forman un hiato

La siguiente tabla muestra todas las posibles combinaciones de un par de vocales:

vocal 1 abiertavocal 1 acentuadavocal 2 abiertavocal 2 acentuadaEjemploForma hiato
petréóImposible
NopetréoImposible
NovendréísImposible
NoNovendréisNo
NopanteónNo
NoNopétreoSi
NoNozalacaín
NoNoNohaitíNo
NocamíónImposible
NoNomaría
NoNocíúdadImposible
NoNoNorúiseñorImposible
NoNocamiónNo
NoNoNopiarNo
NoNoNoveintiúnNo
NoNoNoNociudadNo

Como puede verse, hay combinaciones que no se dan en idioma castellano.

En el caso de tres vocales o más, se va probando cada par de vocales. Por ejemplo, en constituía se prueba primero y después ía.

Localización de la <<silaba-tonica>> sílaba tónica

  • <<acento-prosodico>>El acento (o acento prosódico) es la mayor intensidad que se da a una sílaba dentro de una palabra. Suele ser un aumento de volumen, duración o ambas cosas. Esa sílaba se denomina sílaba tónica.
  • La tilde (o acento gráfico) es una indicación gráfica del acento prosódico

Las normas generales de acentuación indican en qué sílaba tiene el acento una palabra escrita, y están diseñadas para minimizar el uso de las tildes. La tilde se coloca sobre la vocal de la sílaba con acento prosódico. Si es un diptongo, se colocará sobre la vocal abierta.

  • Palabras monosílabas: no llevan tilde
  • Palabras agudas (acento en última sílaba): tendrán tilde si acaban en vocal, n o s.
  • Palabras llanas (acento en la penúltima sílaba): tendrán tilde si no acaban en vocal, n o s.
  • Palabras esdrújulas y sobreesdrújulas (acento más alla de la penúltima sílaba): tienen tilde siempre
  • Tilde diacrítica: se utiliza para distinguir palabras homófonas (que se pronuncian igual), pero con distinto significado.

Este problema se ve afectado por la división en sílabas, y por tanto por los diptongos/hiatos.

<<significado-palabra-problemas>>Excepciones debidas al significado de la palabra

Hay que tener en cuenta además otras normas que se derivan del significado de la palabra:

  • Advervios acabados en mente: conservan la tilde del adjetivo original (tranquilamente)
  • Formas verbales con pronombres: conservan la tilde de la forma verbal sin pronombres (haceroslo)

De estas dos últimas normas se deduce que no es posible localizar la sílaba tónica sin conocer el significado de la palabra.

Rimas

Dos palabras riman si su final suena de forma similar. El final de la palabra incluye a partir de la vocal tónica. El sonido similar puede ser
  • Consonante: todas los sonidos coinciden a partir de la vocal tónica
  • Asonante: todas las vocales coinciden a partir de la vocal tónica

Hay algunas excepciones a esta norma:

  • La sílaba siguiente a la tónica en una esdrújula puede ignorarse. Esto haría que {{{INI}}} *cán* . ti . co {{{FIN}}} rimase con {{{INI}}} *zan*.co {{{FIN}}} .
  • Las vocales no acentuadas de un diptongo (débiles) pueden ignorarse. Esto haría que {{{INI}}} a. *cei* . te {{{FIN}}} rimase con {{{INI}}} *pe*.ces {{{FIN}}}.

Rima Consonante

Hay que tener en cuenta que la pronunciación varias consonantes distintas puede ser similar o no, como K y C, dependiendo de la vocal a la que se asocien. Para poder comparar las palabras, se realizan las siguientes sustituciones dentro de cada sílaba, en orden de preferencia:

Si apareceSe sustituye por
guege
gué
guigi
guí
güegue
güégué
güigui
güíguí
queke
qué
quiki
quí
ceze
cizi
geje
giji
chch
lly
yaya
yeye
yiyi
yoyo
yuyu
yi
h
vb
ck

Posteriormente, se sustituyen las vocales acentuadas por vocales sin acentuar

Rima asonante

Se parte del final de la palabra tenido en cuenta en la rima consonante, y se eliminan todas las consonantes. Para evitar que {{{INI}}} ma . *rí* . a {{{FIN}}} rime asonantemente con {{{INI}}} mar . *cial* {{{FIN}}}, cada grupo consonántico se transforma en un mismo carácter. De esa forma:

  • {{{INI}}} ma . *rí* . a {{{FIN}}} termina en ría ➡ {{{INI}}} i.a {{{FIN}}}
  • {{{INI}}} mar . *cial* {{{FIN}}} termina en cial ➡ {{{INI}}} ia {{{FIN}}}

División de palabra

Al final del renglón, las palabras pueden dividirse con un guión. No todas las posiciones son posibles:

  • El guión irá siempre entre sílabas
  • El guión no separará vocales, aunque formen un hiato. Esto hace que no importe la acentuación ni la distinción diptongo/hiato en este problema.
  • El guión no dejará una vocal aislada al final o al principio de la palabra

<<implementacion>> Implementación

División en sílabas de una palabra

El siguiente es un ejemplo de uso de la función palabraSinHiatos, que divide una palabra en sílabas sin tener en cuenta los hiatos:

const {
    palabraSinHiatos
} = require( "./palabras/corpus-utils.js" );

console.log( palabraSinHiatos("épsilon") ); // => ['ép','si','lon']
console.log( palabraSinHiatos("maría") ); // => ['ma','ría']
const {
    palabraConHiatos,
    palabraSinHiatos
} = require( "palabras/corpus-utils.js" );

console.log( palabraSinHiatos("maría") ); // => ['ma','ría']
console.log( palabraConHiatos("maría") ); // => ['ma','rí', 'a']
console.log( palabraSinHiatos("constituía") ); // => [ 'cons', 'ti', 'tuía' ]
console.log( palabraConHiatos("constituía") ); // => [ 'cons', 'ti', 'tuí', 'a' ]

Normas no contempladas

Hay algunas normas que no pueden aplicarse sin un corpus completo:

  • Los prefijos forman sílabas aparte. Por ejemplo interaliado debe silabearse {{{INI}}} in . ter . a . lia . do {{{FIN}}}, pero con las normas anteriores sería {{{INI}}} in . te . ra . li . a . do {{{FIN}}}

Sílaba tónica

Como ya se ha comentado, no es posible encontrar la sílaba tónica sin conocer el significado de la palabra, ya que:

  • El sufijo mente no cambia la sílaba tónica del adjetivo que modifica. Además, se mantiene el acento ortográfico del adjetivo original (aunque el adverbio sea una palabra esdrújula). Por ejemplo, de {{{INI}}} a . gra . *da* . ble {{{FIN}}} se obtiene {{{INI}}} a . gra . *da* . ble . men . te {{{FIN}}}.
  • Los pronombres enclíticos, al igual que el sufijo mente, no cambian la sílaba tónica del verbo del que forman parte. Por ejemplo {{{INI}}} *sú* . be . me . lo {{{FIN}}}es una palabra sobreesdrújula, ya que {{{INI}}} *su* . be {{{FIN}}} es llana.
const {
    palabraConHiatos,
    silabaTonica
} = require( "palabras/corpus-utils.js" );

const maria = palabraConHiatos("maría") // => ['ma','rí', 'a']
console.log( silabaTonica(maria) ); // => 1

const velozmente = palabraConHiatos("velozmente") // => ['ve','loz','men','te']
console.log( silabaTonica(velozmente) ); // => 1

const percheron = palabraConHiatos("percherón") // => ['per','che','rón']
console.log( silabaTonica(percheron) ); // => 2

<<vocal-tonica>>Vocal tónica

const {
    palabraConHiatos,
    letraTonica
} = require( "palabras/corpus-utils.js" );

const maria = palabraConHiatos("maría") // => ['ma','rí', 'a']
console.log( letraTonica(maria) ); // => 3

const velozmente = palabraConHiatos("velozmente") // => ['ve','loz','men','te']
console.log( letraTonica(velozmente) ); // => 3

const percheron = palabraConHiatos("percherón") // => ['per','che','rón']
console.log( letraTonica(percheron) ); // => 7

Fachada para las funciones: clase Palabra

Las funciones anteriores pueden utilizarse por separado, pero para facilitar su uso se ha desarrollado la clase Palabra.

  • Se accede la la vocal tónica, sílabas, etc. por medio de propiedades, no de funciones o métodos
  • Esas propiedades se calculan de forma perezosa (lazy)

Rimas

Para saber si dos palabras tienen rima consontante, basta con calcular la posición de la vocal tónica de cada una de ellas y comparar si los fonemas asociados a cada letra coinciden a partir de ahí.

console.error(process.cwd());
console.error(process.argv);
const {
    Palabra
} = require( "palabras/palabra.js" );

const maria = Palabra.from("maría");
console.log( maria.sufijoRimaConsonante ) // => ia
console.log( maria.sufijoRimaAsonante ) // => i.a

const velozmente = Palabra.from("velozmente");
console.log( velozmente.silabas ); // => ['ve','loz','men','te']
console.log( velozmente.letraTonica ); // => 3
console.log( velozmente.silabaTonica ); // => 3

Para facilitar el uso, se han desarrollado las funciones rimaAsonanteCon y rimaConsonanteCon

const {
    rimaConsonanteCon,
    rimaAsonanteCon
} = require( "palabras/rimas.js" );

console.log( rimaConsonanteCon("maría", "arriba") ) // => false
console.log( rimaAsonanteCon("maría", "arriba") ) // => true

Por hacer

  • Calcular las posibles divisiones de palabra al final de línea mediante un guion
  • Convertir el código desarrollado en un paquete desplegable en node

Enlaces de interés

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published