Foros del Web » Programando para Internet » Javascript »

Script inteligente que aplique tildes

Estas en el tema de Script inteligente que aplique tildes en el foro de Javascript en Foros del Web. Buenas foro: Se me ha pasado por la cabeza la terrible idea de hacer un script "inteligente" que aplique por sí solo las tildes. Todos ...
  #1 (permalink)  
Antiguo 05/08/2005, 16:12
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Proyecto: Script inteligente que aplique tildes

Buenas foro:

Se me ha pasado por la cabeza la terrible idea de hacer un script "inteligente" que aplique por sí solo las tildes. Todos sabemos que las reglas para poner tildes son bastante estrictas, no hay dudas en ninguna palabra. (Son éstas, por si alguien no las conoce : http://www.ati.es/gt/lengua-informat...o/acentos.html)

Bueno, se que ésto es dificil. Incluso imposible. Pero me gustaria analizar el porqué. Quiero decir, saber dónde en relidad radicaría el problema real.

Para las primeras normas básicas:

Cita:
Agudas:
Llevan acento ortográfico las palabras agudas que terminen en vocal, 'n' o 's'.
Graves o llanas:
Se acentúan todas las palabras llanas que terminen en consonante salvo 'n' o 's'.
Esdrújulas y sobresdrújulas:
Se acentúan todas sin excepción.
Esta claro que el problema es no saber cuando una palabra es aguda o esdrujula. ¿Existe alguna base de datos o diccionario que conozcáis que agrupe las formas básicas?
¿o algun script que por intuición pueda diferenciar sílabas (aunque sea) y asi finalmente determinar si son agudas, llanas o esdrújulas? (Tipo esto)
Si no siempre convendría saber cómo les enseñan a los extranjeros, para dar pistas.

La separación de silabas no se porqué se rige, a todos nos enseñan de pequeños, pero no he conseguido ver la formula. Aunque bueno, algo si que he podido encontrar aqui, por ejemplo:
Cita:
Syllable boundaries in Spanish are distributed in accordance with fixed rules. Thus a single consonant between vowels is syllable-initial (e.g. [pa.ta.ta] patata ‘potato’), while two consecutive consonants are assigned to separate syllables (e.g. [al.Äo] algo ‘something’, [ben.ta] venta ‘sale’, [lis.to] listo ‘clever’), except in the case of /p, t, k, b, d, g, f/ + liquid (e.g. [a.Blo] hablo ‘I speak’, [swe.ÄRa] suegra ‘mother-in-law’). When three consonants come together, a syllable boundary comes either after the first (e.g. [am.pljo] amplio ‘wide’) or after the second (e.g. [tRans.poR.te] transporte ‘transport’). Adjacent vowels are assigned to separate syllables (e.g. [te.a.tRo] teatro ‘theatre’) unless they form a diphthong or triphthong. Diphthongs and triphthongs in Spanish consist of a full vowel preceded and/or followed by one of the semivowels [j] and [w] (e.g. [aÄwa] agua ‘water’, [tjeso] tieso ‘stiff’, [plejto] pleito ‘lawsuit’, [bwej] buey ‘ox’.
Saco todo lo que puedo encontrar de las paginas que enseñan a los principiantes que estudian castellano desde otro idioma, por ejemplo.



Qué decis, me animo a intentarlo (con un poquillo de ayuda vuestra, quizas)? No prometo que sea sencillo, ni un éxito, solo pregunto a ver si lo veis posible, implementable; o si no, cual sería su mayor problema (exceptuando claro, las diferencias entre este y éste , y esas reglas semánticas).


saludos!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.

Última edición por derkenuke; 09/08/2005 a las 17:32
  #2 (permalink)  
Antiguo 06/08/2005, 14:13
Avatar de Hereje  
Fecha de Ingreso: junio-2002
Ubicación: Córdoba, Argentina
Mensajes: 439
Antigüedad: 21 años, 10 meses
Puntos: 2
Muy bueno, pero lo veo muy complicado el tema de averiguar cuando una palabra es esdrujula, aguda o grave. El tema de separar por silabas a lo mejor se puede hacer, pero como sabemos cual es la silaba tónica? Aparte no todas las palabras cumplen dichas reglas, también existen excepciones. Creo que es DEMASIADO complejo el tema y es conveniente escribir bien.

De todas formas me parece un proyecto muy interesante!

Salu2!
__________________
Sergio
  #3 (permalink)  
Antiguo 06/08/2005, 17:24
 
Fecha de Ingreso: febrero-2005
Mensajes: 198
Antigüedad: 19 años, 2 meses
Puntos: 5
Bueno, yo es que no lo vea complicado, yo lo veo imposible y mas con un lenguaje tan limitado como javascript.

Como solucion mas fácil que veo es que tuvieran en un array todas las palabras acentuadas del castellano y que cuando escriba una palabra comprobara en el array si existe acentuada. Eso supongo que deben hacer algunos programas como el word.

De todas maneras hay palabras que se acentuan según su significado en la frase (por ejemplo más y mas) y eso si que es imposible controlar por el lenguaje: el significado de la frase.

Por eso por mucho que lo intenten es imposible que se haga algo que sea minimamente fiable. Además de los recursos que te chupa porque a cada palabra que escribas tiene que estar mirando y todo el rollo.

De todas maneras no te quiero desanimar, si te vez capaz de ello hazlo. y si lo consigues POR DIOS ven a reirte de mi y publica el código.
  #4 (permalink)  
Antiguo 07/08/2005, 20:12
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Bueno, en principio creo que me contentare con separar las silabas de una palabra, que ya lo veo demasiado complicado por si mismo.

He realizado un esbozo, que todavia tiene fallos, pero bueno, puede resultar comodo para guiar el proyecto. De momento solo me he basado en dos reglas:
Cita:
two consecutive consonants are assigned to separate syllables (e.g. [al.go] algo ‘something’,
[ven.ta] venta ‘sale’, [lis.to] listo ‘clever’), except in the case of /p, t, k, b, d, g, f/ + liquid
(e.g. [ha.blo] hablo ‘I speak’, [sue.gra] suegra ‘mother-in-law’).
Cita:
a single consonant between vowels is syllable-initial (e.g. [pa.ta.ta] patata ‘potato’)
pero el script esta dando resultados.

Esta mas o menos comentado, y he hecho uso de las expresiones regulares porque me gusta su potencia, y ya las controlo un poquito.

He aqui el codigo:

Código PHP:
var palabras=[ "gallo""feo""triangulo""suegra""hablo""lombriz""helicoptero""patata""palabra"];

String.prototype.esVocal=function() {
    return 
this.match(/^[aeiou]$/i)!=null;
}

function 
silabear(pal) {
    
/* 
     un argumento de dos letras o de tres letras sera siempre monosilabo
    */
    
if(pal.length==|| pal.length==3) {
        return 
pal;
    }
    
    
//inicializamos _v y _c que nos serviran para formar las expresiones regulares de vocal y consonante
    // a partir de aqui a una vocal se le llamara "v" y a una consonante "c"
    
var _v="[aeiou]"; var _c="[^aeiou]";
    var 
v=new RegExp(_v,"gi"); var c=new RegExp(_c,"gi");
    
    
    
/*
     two consecutive consonants are assigned to separate syllables (e.g. [al.go] algo ‘something’, 
     [ven.ta] venta ‘sale’, [lis.to] listo ‘clever’), except in the case of /p, t, k, b, d, g, f/ + liquid 
     (e.g. [ha.blo] hablo ‘I speak’, [sue.gra] suegra ‘mother-in-law’).
    */
    // a las consonantes excepciones (/p, t, k, b, d, g, f/) las llamaremos cexcep
    
var c_c=new RegExp("([^aeiouptkbdgf])([^aeiou])","i");        // c+c (pero que la primera c no sea excepcion )
    
if( p=pal.matchc_c ) ) {    // cumple c_c, y p[1] y p[2] guardaran las dos consonantes matcheadas
        
q=pal.search(c_c);            // posicion exacta del matching de c_c
        
if(p[1]!=p[2]) {                    // la c no es doble (rr,ll..)
            
parte1=pal.substring(0,q+1);
            
parte2=pal.substring(q+1);
        }
        else {                                
// la c es doble (rr,ll);
            
parte1=pal.substring(0,q);
            
parte2=pal.substring(q);
        }
        return [ 
silabear(parte1) , silabear(parte2) ];
    }
    else {                            
// no cumple c_c, pero puede que sea por la excepcion
        
var c_cexcep=new RegExp("([ptkbdgf])([^aeiou])","i");
        
// aqui no hace falta hacer un match, no nos interesan las consonantes en si, solo su posicion
        
var p=pal.search(c_cexcep);
        if( 
p>) {
            
parte1=pal.substring(0,p);
            
parte2=pal.substring(p);
            return [ 
silabear(parte1) , silabear(parte2) ];
        }
    }
    
    
    
/*
     a single consonant between vowels is syllable-initial (e.g. [pa.ta.ta] patata ‘potato’)
    */
    //asi que miraremos cada consonante de la palabra, una por una
    
var consonantes=pal.match(c);
    
//miramos si se cumple el esquema v+c+v, por cada c que encontremos
    //la primera c no la miramos, porque no puede estar rodeada de vocales
    
for(var a=1;a<consonantes.length;a++) {
        
q=pal.searchconsonantes[a] );            //posicion exacta de la consonante
        
if( pal.charAt(q-1).esVocal() && pal.charAt(q+1).esVocal() ) {        //rodeada de vocales
            
parte1=pal.substring(0,q);
            
parte2=pal.substring(q);
            return [ 
silabear(parte1), silabear(parte2) ];
        }
    }
    
    
/*
     devolver el resto de la palabra si no ha de ser procesada
    */
    
return pal;
    
}

for(
a=0;a<palabras.length;a++) {
    
document.writepalabras[a]+" >>> "+silabear(palabras[a]) +"<br/>");

Es una funcion recursiva, que coge una palabra y va mirando la primera regla y la segunda, a ver si tiene la oportunidad de "diseccionar" la palabra. Si consigue hacerlo, coge las dos partes (no dividira en más partes por cada pasada) y volvera a llamar a la funcion silabear con cada fragmento.

Quizas sea un poco complicado, lo he identado y puesto "bonito" para que asuste menos. El resultado imprimido es:
Cita:
gallo >>> ga,llo
feo >>> feo
triangulo >>> trian,gu,lo
suegra >>> sue,gra
hablo >>> ha,blo
lombriz >>> lom,briz
helicoptero >>> he,li,co,co
patata >>> pa,tata
palabra >>> pa,la,la
Vemos que todo funciona segun lo previsto, excepto para las tres ultimas palabras. La verdad esque no he encontrado exactamente el error, osea que si alguien lo ve, por favor que lo comente. "Helicoptero" y "palabra" comparten los mismos fallos. "Patata" no, y no se qué le ocurre.

Voy a hacer un debug del codigo a ver si consigo dar con ello.

En cuanto tenga esta base firme, podre ponerme con palabra mas complejas con diptongos, triptongos, y esas cosas.

Cita:
Iniciado por Hereje
es conveniente escribir bien.
El proyecto en sí no lo presento como método industrial de corrección, si no mas bien de investigación y con fines didacticos.

Cita:
Iniciado por occiso
De todas maneras hay palabras que se acentuan según su significado en la frase (por ejemplo más y mas) y eso si que es imposible controlar por el lenguaje: el significado de la frase.

Por eso por mucho que lo intenten es imposible que se haga algo que sea minimamente fiable.
A lo que respondo
Cita:
Iniciado por derkeNuke
(exceptuando claro, las diferencias entre este y éste , y esas reglas semánticas)
Lo de hacer un programa que entienda... enfin... quizas en otra vida :D



Saludos a los dos y gracias por responder!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 07/08/2005, 20:36
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 2 meses
Puntos: 6
Hola, te voy a comentar lo que ya te han dicho (iba a decírtelo de todos modos):

-No sabes cuál es la sílaba tónica. Puedes separar en sílabas (y algunas palabras lo harás mal, porque dependiendo de si la vocal está acentuada o no habrá diptongo o hiato), pero no sabrás la sílaba tónica (necesario para poner la tilde).

-Las tildes diacríticas... que es que distintas palabras se escriben igual y se diferencian mediante una tilde (como ya te han comentado, "más" y "mas", "cómo" y "como", "dé" y "de",...).

Por último, comentarte que he mirado sólo la salida de tu ejemplo, y tienes un error a la hora de saber lo que es un diptongo:

Cita:
feo >>> feo
Eso está mal. Las letras "e" y "o" forman hiato (es decir, pertenecen a sílabas distintas).

Por último, sobre la viabilidad de tu proyecto... lo más factible que veo (y pese a eso tiene sus pegas y no es del todo fácil ni mucho menos) es hacerlo "a lo bruto" como han comentado (aunque el reto intelectual de separarlo en sílabas también esté bien), es decir, teniendo una base de datos con todas las palabras y comparando con ellas para ver si lleva o no tilde.

Saludos
  #6 (permalink)  
Antiguo 07/08/2005, 20:48
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 2 meses
Puntos: 6
Lo del programa que "entienda lo que lee", va a ser del todo necesario a la hora de poner bien las tildes diacríticas.

Eso... se puede intentar poner mediante algunas reglas empíricas (por ejemplo, ver qué palabras rodean a la palabra, etc.), pero habrá siempre algunos casos en los que sólo mediante una profunda comprensión del texto sea posible saber si poner o no tilde diacrítica. Por ejemplo:

-Susana cantó muy bien el martes.
-Como cantó ese día.

¿Le ponemos o no le ponemos tilde a "Cómo"? Si ya es difícil y ambiguo para un humano (en esa frase ciertamente, es que ni siquiera la frase anterior te lo aclara (aunque así podría haber sido), y sólo oyendo la entonación, para conocer la intención del hablante, sería posible poner la tilde), para una máquina es una tarea en principio casi imposible.

Un caso en el que un humano sabría al instante ponerle tilde, sólo leyendo el texto, pero una máquina tendría que interpretar la frase anterior sería:
-A que no sabes cómo cantó Susana el martes.
-Cómo cantó ese día.

Ahí, "Cómo" lleva tilde, pero por el sentido de la frase que se engloba como una respuesta a la frase anterior, y sólo cabe ponerle "tilde" (de lo contrario en principio no tendría sentido). Pero esa frase, aislada (que sería lo que en principio miraría nuestra máquina), sería correcta de ambas formas (tanto con tilde como sin tilde).

Por tanto... ¿hacer un programa que ponga acentos? Sí, poderse se podrá, pero yo no veo que pueda tratar todos los casos ni que, aun para tratar el 95% de los casos, no deba poseer ya una notable "inteligencia" (o, en realidad, una muy gran programación y análisis de todos los casos posibles).

Saludos
  #7 (permalink)  
Antiguo 07/08/2005, 21:00
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Ok, con los diptongos hiatos y esas cosas no me he metido, prefiero dejarlo para un segundo nivel...

Se que no se puede hacer, pero por lo menos me conformo con que separe sílabas mas o menos bien.

La pregunta es: ¿existe alguna regla para saber si una palabra es aguda o esdrújula? O por lo menos algo que se le asemeje. Lo maximo que he podido encontrar es:
Cita:
These are the two basic rules:
1. Words that end in a vowel, -n or -s stress the next-to-last syllable (penultimate syllable):
clase, examen, mesas
2. Words that end in a consonant other than n or s, stress the last syllable:
bondad, papel, cantar
Pero no creo que me sirva para demasiadas palabras... sin contar los verbos!


En fin, seguire mañana desarrollando mi silabear(), a ver si se mejora aunque sea un poquillo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #8 (permalink)  
Antiguo 09/08/2005, 17:24
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Sigo, sigo batallando con mi dichoso script, y menos mal que va mejorando (si no ya lo habria dejado).

Tenia un problema estas tres
Cita:
helicoptero >>> he,li,co,co
patata >>> pa,tata
palabra >>> pa,la,la
En realidad el problema diría mas bien que es del lenguaje javascript (atreviéndome a decirlo ) ya que cuando haces un match, no sabes exactamente qué posición tiene lo matcheado dentro de esa palabra.

Lo que he hecho yo aqui:
Código PHP:
    if( p=pal.matchc_c ) ) {
        
q=pal.search(c_c); 
Funciona para la primera incidencia, porque search encuentra la primera incidencia. Pero si tenemos patata, y buscamos [consonante+vocal], todo lo matcheado será:
Cita:
pa,ta,ta
y de ello me interesaba sacar la posicion. Lo hacía con search, teniendo por resultado
Cita:
0,2,2
y no
Cita:
0,2,4
como debería ser.

Asi que he tenido que resolver ésto. Abrí un post para resolverlo, aunque lo resolví fácilmente. Le falta el control por si acaso no hay ningun matching. La funcion me ha quedado asi:
Código PHP:
String.prototype.localizar=function(expReg,modif) {
    
expReg=new RegExp(expReg ,modif);
    
//hacemos el match
    
var matches=this.match(expReg);
    if(
matches!=null) {
        
//este sera el array de almacenamiento de los indices de matches
        
var searches=new Array();
        
//por cada incidencia, añadimos a devolver su posicion
        //vamosPor lleva el control del indice desde el cual empezamos a buscar
        
for(var a=0vamosPor=0a<matches.lengtha++) {
            var 
p=this.indexOf(matches[a],vamosPor);
            var 
vamosPor=p+matches[a].length;
            
searches[searches.length]=p;
        }
        return [
matches,searches];
    }
    else
        return 
null;

Devuelve un array de dos dimensiones. La primera dimension es un array con todo lo matcheado, y la segunda dimension es un array con las posiciones de lo matcheado. Me ha sido bastante util, pero he tenido que re-escribir todo mi script (además he mejorado un par de cosillas que no estaban controladas).

Bueno, los comentarios del script son mas largos, porque el propio script es más dificil de comprender. Se basa en un esquema simple (para que lo podais seguir mas facilmente):
Código PHP:
/**************** 
REGLA GENERAL, explicacion
****************/
// aposicion1
// aposicion2    
/* 
explicacion gorda, de un bloque entero
*/
--> llamada a la funcion localizar con la expresion
var variable=pal.localizar"expression","modificadores" ); 
--> 
comprobacion de incidencias
if(variable!=null)
--> 
bucle por cada incidenciaDentro del bucle se separara la palabra debidamente
for(var a=0a<variable[1].lengtha++) 
Así que espero que no le tengais miedo al código ahora. Al fin y al cabo, sólo he hecho dos reglas... Este es el codigo completo (los comentarios no los he refinado):

Código PHP:
var palabras=[ "gallo""feo""triangulo""suegra""hablo""lombriz""helicoptero""patata""palabra"];

String.prototype.localizar=function(expReg,modif) {
    
expReg=new RegExp(expReg ,modif);
    
//hacemos el match
    
var matches=this.match(expReg);
    if(
matches!=null) {
        
//este sera el array de almacenamiento de los indices de matches
        
var searches=new Array();
        
//por cada incidencia, añadimos a devolver su posicion
        //vamosPor lleva el control del indice desde el cual empezamos a buscar
        
for(var a=0vamosPor=0a<matches.lengtha++) {
            var 
p=this.indexOf(matches[a],vamosPor);
            var 
vamosPor=p+matches[a].length;
            
searches[searches.length]=p;
        }
        return [
matches,searches];
    }
    else
        return 
null;
}

String.prototype.esVocal=function() {
    return 
this.match(/^[aeiou]$/i)!=null;
}

function 
silabear(pal) {
    
//document.write("ME HAS LLAMADO CON "+pal+":<br>");
    /**************** 
     un argumento de dos letras o de tres letras sera siempre monosilabo
    ****************/
    
if(pal.length<=3) {
        return 
pal;
    }
    
    
//inicializamos _v y _c que nos serviran para formar las expresiones regulares de vocal y consonante
    // a partir de aqui a una vocal se le llamara "v" y a una consonante "c"
    
var _v="[aeiou]"; var _c="[^aeiou]";
    var 
v=new RegExp(_v,"gi"); var c=new RegExp(_c,"gi");
    
    
    
/**************** 
     two consecutive consonants are assigned to separate syllables (e.g. [al.go] algo ‘something’, 
     [ven.ta] venta ‘sale’, [lis.to] listo ‘clever’), except in the case of /p, t, k, b, d, g, f/ + liquid 
     (e.g. [ha.blo] hablo ‘I speak’, [sue.gra] suegra ‘mother-in-law’).
    ****************/
    // a las consonantes excepciones (/p, t, k, b, d, g, f/) las llamaremos cexcep    
    /* tenemos 3 casos:
        1.- consonante no excepcion + consonante
        2.- consonante excepcion + consonante no excepcion
        3.- consonante excepcion + consonante excepcion
    */
    // CASO1: consonante no excepcion + consonante
    
var cc=pal.localizar"[^aeiouptkbdgf][^aeiou]","i" ); 
    if(
cc!=null) {        //hay incidencias
        // por cada conjunto de cc encontrado
        
for(var a=0a<cc[1].lengtha++) {
            
//separamos cada letra para ver si son iguales (doble rr o ll)
            
var cadaletra=cc[0][a].split("");
            if( 
cadaletra[0] != cadaletra[1] ) {
                var 
corte=cc[1][a]+1;
            }
            else {
                var 
corte=cc[1][a];
            }
            var 
parte1=pal.substring(0,corte);
            var 
parte2=pal.substring(corte);
            return [ 
silabear(parte1), silabear(parte2) ];
        }
    }
    
// no cumple cc, pero puede que sea por la excepcion
    
else {
        
// CASO2: consonante excepcion + consonante no excepcion (o si no cogeremos co(pt)ero en helicoptero)
        
var cexcepc=pal.localizar".{1}[ptkbdgf][^aeiouptkbdgf]","gi" );
        if(
cexcepc!=null) {
            for(var 
a=0a<cexcepc[1].lengtha++) {
                var 
parte1=pal.substring(0,cexcepc[1][a]+1);
                var 
parte2=pal.substring(cexcepc[1][a]+1);
                return [ 
silabear(parte1) , silabear(parte2) ];
            }
        }
        
// CASO3: consonante excepcion + consonante excepcion
        
else {
            
cexcepcexcep=pal.localizar"[ptkbdgf]{2}","gi" );
            if( 
cexcepcexcep!=null ) {
                for(var 
a=0a<cexcepcexcep[1].lengtha++) {
                    var 
parte1=pal.substring(0,cexcepcexcep[1][a]+1);
                    var 
parte2=pal.substring(cexcepcexcep[1][a]+1);
                    return [ 
silabear(parte1) , silabear(parte2) ];
                }
            }
        }
    }
    
    
/**************** 
     a single consonant between vowels is syllable-initial (e.g. [pa.ta.ta] patata ‘potato’)
    ****************/
    //miramos si encontramos el esquema v+c+v
    
var vcv=pal.localizar(_v+_c+_v,"gi");
    
//si hay incidencias
    
if(vcv!=null) {
        
//por cada conjunto vcv encontrado
        
for(var a=0a<vcv[1].lengtha++) {
            
//cortaremos la palabra por v|cv, porque la c sera inicio de silaba
            // es decir, donde se encontro vcv (vcv[1][a]) + 1 (por la primera v)
            
var parte1=pal.substring(0,vcv[1][a]+1);
            var 
parte2=pal.substring(vcv[1][a]+1);
            return [ 
silabear(parte1), silabear(parte2) ];
        }
    }
    
    
/*
     devolver el resto de la palabra si no ha de ser procesada
    */
    
return pal;
    
}

for(
a=0;a<palabras.length;a++) {
    
document.writepalabras[a]+" >>> "+silabear(palabras[a]) +"<br/>");

Y esta la salida que provoca:

Cita:
gallo >>> ga,llo
feo >>> feo
triangulo >>> trian,gu,lo
suegra >>> sue,gra
hablo >>> ha,blo
lombriz >>> lom,briz
helicoptero >>> he,li,cop,te,ro
patata >>> pa,ta,ta
palabra >>> pa,la,bra
Así que poco a poco voy mejorando.

El siguiente paso: Las vocales: los hiatos. Las tres consonantes seguidas:
Código PHP:
var palabras=[ "feo""triangulo""transporte""monstruo""fantasia""guion" ]; 
Ahora producen esta salida de momento:
Cita:
feo >>> feo
triangulo >>> trian,gu,lo
transporte >>> tran,s,por,te
monstruo >>> mon,s,truo
fantasia >>> fan,ta,sia
guion >>> guion
Pero ya saldra...



Parece que lo voy logrando! Deseadme suerte...

Saludos y gracias!


PD: Lo siento por el gigantesquisimo post, creo que no habia escrito uno asi en la vida. Quiero que sea facil y llevadero de entender...
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 28/04/2009, 10:51
 
Fecha de Ingreso: agosto-2007
Ubicación: Duitama Boyaca Colombia
Mensajes: 18
Antigüedad: 16 años, 7 meses
Puntos: 1
De acuerdo Respuesta: Script inteligente que aplique tildes

5 años despues.....

Hace ya varios años para la epoca en que se inicio este hilo, estuve desarrolando un programa en visual basic, que como parte fundamental usaba un analisizado semantico de palabras dentro de una frase.

La idea era escribir un bot que puediese responder (mantener una conversacion) y para ello analizaba las palabras que el usuario escribia.

La cuestion no era que respondiese con un conjunto de "frases" aprendidas, no. por el contrario, debia mantener un hilo sobre la conversacion.

se iniciaba con una base de datos de palabras en blanco (excepto por verbos irregulares, suyetos [yo, tu, el...], [con, el, por, para...]). Lo primero que hacia era analizar la frase en busca de verbos y sustantivos, y para ello se basaba en reglas.

SI palabra termina en ando = verbo (EJ: cantANDO)
el verbo es igual a palabra - ANDO + r

EJ:
p = "cantando"
IF (right(p,3) = "ando")
verbo = mid(p, 1, len(p) - 4) + "r"
ELSE
..... ejecutar otras reglas de busqueda
END IF

En ultimas analizaba la frase y hallaba el sujeto y el verbo principal, asi como sustanvos.

-------------------------------------------------
La logica usada era simple: ante la frase "El perro corre en el prado"
El programa NO sabe que es "perro", ni "corre" ni "prado"
pero SI SABE que corre es un Verbo que EJECUTAN los perros en el PRADO.

Luego el programa recibe otro texto "El perro come carne"
y ahora el programa SABE que el "PERRO" "CORRE" y "COME"
y que el verbo "correr" se ejecuta en el "PRADO"
y que el verbo "COMER" se ejcuta sobre la "CARNE"
por lo tanto una salida logica seria.


Despues de cargar algunas frases (yo cargue un fragmento de cien años de soledad) el programa "SABE" cientos de verbos, sabe que ciertos sustantivos ejecutan ciertas acciones, sabe que el verbo predilecto de los perros es ladrar...

la idea posterior era genera una respuesta coherente a partir de esos datos, yo me canse antes y el programa termino como un analizador semantico que ingresaba los datos a una BD

......... cierto eso no tiene que ver con el post, pero ..... creo que aveces intentamos hacer cosas que parecen absurdas.... ????
  #10 (permalink)  
Antiguo 15/05/2009, 15:18
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Script inteligente que aplique tildes

No saben la cantidad de veces que busqué este tema para hacer referencias. Y ahora que me llega un correo con el aviso de "nuevo mensaje" ¡Descubro que estaba suscripto!. Con mirar la lista de suscripciones en el panel, lo hubiera encontrado. Mi ex tenía razón cuando me dejó por desbolado.

Ni siquiera me acordaba que era tuyo, derkenuke (aunque debí suponerlo).

Todos sabíamos que era imposible de hacer, pero en el intento siempre aparece algo nuevo para probar.

Lo que me asombra es la suerte —o la habilidad— que tuviste para hallarlo, sysmaya; porque supongo que hiciste una búsqueda para tu proyecto y caíste aquí..
Hace unas semanas estuve jugando con un viejo chatterbot llamado Dr. Abuse. En realidad se lo instalé a una pareja amiga y se divirtieron un buen rato conversando con el programa. A mi no me termina de convencer, porque no sé chatear. A la tercera frase ya no sé qué decirle. Él sí, porque es más inteligente que yo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:16.