/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Reconocedor de Lenguaje Natural (numeros 0 - 9999)

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
hezelmet



Registrado: 12 Nov 2007
Mensajes: 10
Ubicación: Caguas, Puerto Rico

MensajePublicado: 23/11/2007 1:26 am
Título: Reconocedor de Lenguaje Natural (numeros 0 - 9999)

Saludos nuevamente!!

Aqui con mi ultimo trabajo (al fin!) del curso de programacion en C++...
De verdad que este foro me ha servido de muchisima ayuda y le agradezco a todas las personas que me han ayudado en estas ultimas semanas.

En fin, NO QUIERO QUE ME ENTREGUEN EL CODIGO... me conozco las reglas del foro y las quiero respetar...

Eso si, solo les pido, por favor... que me dirigan dandome ideas de como atacar el problema.

El problema es el siguiente:

===============================================
"RECONOCEDOR DE LENGUAJE NATURAL: INTELIGENCIA ARTIFICIAL"
***Reconocer Numeros del 0 al 9999***

- Leer una cifra en espanol (palabra). Ej: cincuenta
- Imprime -> 50 (valor numerico)

Otro ejemplo:
Recibe: mil quinientos uno
Entrega: 1501

TERMINOLOGIA

treinta y uno
cincuenta y uno
veinte y dos

Explicacion: Se utilizara la "y" cuando se refiera a las decenas.

*Entrada debera ser completamente en minusculas* Verificar primero si esta o no en mayuscula, de estar en mayuscula debe cambiarlo a minuscula y continuar con el programa.
===============================================

La ultima parte se me hace sumamente sencilla... es cuestion de comparar y utilizar un tolower(cadena[i]) *por ejemplo* para llevarlo a minuscula en caso de que la entrada sea mayuscula... Mi problema seria con reconocer palabras y llevarlos a numeros...

Saludos a todos y feliz dia de accion de gracias para aquellos que lo celebran!! Cuidense!
Volver arriba
digies



Registrado: 18 Nov 2005
Mensajes: 377
Ubicación: Cono Sur

MensajePublicado: 23/11/2007 2:25 pm
Título:

Hola

Te dejo éste código para que lo mires, tal vez puedas sacarle algún provecho y mejorar su algoritmo.
El problema radica cuando -por ejemplo- ingresas como dato el número 123, éste mostrará "ciento veinte y tres" mientras que la forma correcta sería "ciento veintitrés". Lo mismo pasa cuando ingresas 23, el cual te da como resultado "veinte y tres" (lo correcto es "veintitrés"); pero si ingresas 45, te devuelve en texto de forma correcta ("cuarenta y cinco"). Creo que a esto te referías con la "y" en tu comentario. Bueno, esto es uno de los errores más típicos de estas clases de programas. Espero que lo soluciones.
Código:

#include <stdio.h>
#include <stdlib.h>

void Nombrar_Centena(int Num);
void Nombrar_Numero(long Num);

char *Unidad[10]={"cero", "uno", "dos","tres","cuatro","cinco", "seis", "siete", "ocho", "nueve"},
     *Diez[10]={"diez", "once", "doce", "trece", "catorce", "quince", "dieciseis", "diecisiete", "dieciocho", "diecinueve"},
     *Decena[10]={"cero","diez","veinte","treinta","cuarenta","cincuenta", "sesenta","setenta","ochenta","noventa"},
     *Centena[10]={"cien", "ciento", "doscientos", "trescientos","cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos"},
     Millar[]="mil";

int main(void)
{
    long Num;
    printf("Numero menor que 100.000: ");
    scanf("%ld", &Num);
    printf("\nEn letras: ");
    Nombrar_Numero( Num );
    puts("\n\n");
    system("PAUSE");
    return EXIT_SUCCESS;

}

void Nombrar_Centena(int Num)
{
    /* Num es una centena de la forma abc.
    Descomponemos num en: a, b y c: */
    int a, b, c;
    c=Num%10;
    b=(Num%100-c)/10;
    a=(Num-10*b-c)/100;
    if(a > 0)
    {
        if( b==0 && c==0) /* Si el Num = 100 */
            printf("%s ", Centena[0]);
        else
            printf("%s ", Centena[a]); /* Si 100<Num<200 */
    }
    if(b > 0)
    {
        if(b == 1)
            printf("%s ", Diez[c]); /* Si 10<Num<20 */
        else
            printf("%s ", Decena[b]); /* Si 1<b<10 */
    }
    if(c > 0) /* Imprime las unidades */
    {
        if(b > 1) printf("y ");
        if(b != 1) printf("%s ", Unidad[c]);
    }
    return;
}

void Nombrar_Numero(long Num)
{
    int Num_mil;
    /* Num es un numero menor que 100000 */
    if(Num == 0)
        printf("%s", Unidad[0]); /* si Num=0 */
    if(Num < 100000) /* si Num<100000 */
    {
        Num_mil=(Num-Num%1000)/1000;
        if(Num_mil > 1)
            Nombrar_Centena(Num_mil);
        if(Num >= 1000)
            printf("%s ", Millar);
        Nombrar_Centena(Num%1000);
    }
    else
        printf("Numero ingresado mayor o igual a 100000");
    return;
}


Un saludo
Volver arriba
hezelmet



Registrado: 12 Nov 2007
Mensajes: 10
Ubicación: Caguas, Puerto Rico

MensajePublicado: 23/11/2007 2:43 pm
Título:

Hola digies!!

Agradezco infinitamente los codigos!! Pero lamentablemente no es lo que me piden... Sad Para convertir de numero a letras (NUMERO --> LETRAS) tenia idea de como hacerlo... Que era bastante parecido a lo que me escribiste (lo cual agradezco infinitamente!!)

Pero lo que me piden es lo contrario... Ingresar las letras y que me entregue el numero... (LETRAS --> NUMEROS)

Ejemplo:

El usuario entra: "MIL QUINIENTOS CUARENTA Y DOS"
el programa entrega: 1542


imagino que la frase hay que trabajarla como una cadena... pero no me surgen ideas de como desarrollar el programa...

Nuevamente GRACIAS!!! Y lamento el mal entendido Wink
Volver arriba
david_celta



Registrado: 02 Jun 2005
Mensajes: 151

MensajePublicado: 23/11/2007 4:25 pm
Título:

Haz trocitos la frase que se ingresa y metela en un array (con strtok si mal no recuerdo) y luego comparas cada palabra y vas formando el numero

ejemplo:

cad[100]="ciento cincuenta y uno"

Despues de strtok queda:

trozo[0]="ciento"
trozo[1]="cincuenta"
trozo[2]="y"
trozo[3]="uno"

Compara cada una y forma el numero
"ciento" = 100
"cincuenta" = 50
"y" = se ignora o se pone 0
"uno" = 1

Luego sumas 100+50+(0)+1=151
_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
hezelmet



Registrado: 12 Nov 2007
Mensajes: 10
Ubicación: Caguas, Puerto Rico

MensajePublicado: 23/11/2007 6:54 pm
Título:

David muchisimas gracias! Nunca en mi vida he trabajado con strtok pero hare un poco de self study a ver si puedo sacar los codigos

Muy amables companeros... exito!
Volver arriba
hezelmet



Registrado: 12 Nov 2007
Mensajes: 10
Ubicación: Caguas, Puerto Rico

MensajePublicado: 24/11/2007 7:11 pm
Título:

David me gustaria saber como puedo hacer eso de asignarle una posicion a cada fragmento de la frase original...

osea como puedo hacer el

trozo[0]
trozo[1]
.
.
.

Me suena a un for, pero al intentarlo no me da el resultado que pensaba...

Saludos!
Volver arriba
david_celta



Registrado: 02 Jun 2005
Mensajes: 151

MensajePublicado: 25/11/2007 5:57 pm
Título:

Aca tienes un ejemplo

Código:

int main(){
char frase[]="Me van a dividir jojo jojo ji"; 
char *ptr; 
cout << "LA FRASE ANTES: " << frase << endl; 
ptr = strtok(frase," ");//argumentos: frase, caracter delimitador 

while(ptr != NULL)   
{     
cout << ptr << endl;     
ptr = strtok(NULL, " ");   
}

cout << "LA FRASE DESPUES: " << frase << endl; 
return 0;
}


Como notaras en ptr se almacena la porcion de cadena que se esta extrayendo, en tu caso lo unico que cambiaria seria copiar ptr a un array en cada paso del while, asi obtendrias cada trozo. Mas o menos algo asi:

Código:

i=0;
while(ptr != NULL)   
{     
strcpy(trozo[i++],ptr);
ptr = strtok(NULL, " ");   
}


Prueba a ver si eso te funciona
_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
hezelmet



Registrado: 12 Nov 2007
Mensajes: 10
Ubicación: Caguas, Puerto Rico

MensajePublicado: 26/11/2007 12:34 am
Título:

ERROR!

"ctrcpy: cannot convert parameter 1 from 'char' to 'char*' " .....




Crying or Very sad Sad Crying or Very sad Sad

please?? Embarassed
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3837
Ubicación: Mexico

MensajePublicado: 26/11/2007 8:45 am
Título:

Como indica el mensaje de error el primer argumento de la funcion strcpy debe ser un puntero a caracter o "char *". Publica el codigo fuente completo del programa que genera ese mensaje de error y trataremos de ayudarte.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
david_celta



Registrado: 02 Jun 2005
Mensajes: 151

MensajePublicado: 26/11/2007 11:18 am
Título:

Asumo que has declarado la variable trozo (o como se llame) como:

char**trozo ;
char*trozo[50] ;
char trozo[20][20] ;

Si la has declarado como char*trozo o char trozo[50] te debe estar arrojando el error que mencionas

"strcpy: cannot convert parameter 1 from 'char' to 'char*' "
No se puede convertir de char a char*

Porque tiene que ser un arreglo de cadenas para poder almacenar varias cadenas

Y si no pues no se Very Happy
_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com