Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-09-2008
Abuelo7 Abuelo7 is offline
Miembro
 
Registrado: ene 2006
Ubicación: Igualada(Barcelona) Spain
Posts: 51
Poder: 19
Abuelo7 Va por buen camino
Mas problemas con Tablas

Hola amigos.

Como aclaración os diré lo que intento hacer.
Un programa de IA de conversación que esta programado en Clipper, estoy pasándolo a Delphi.
No tengo el fuente del programa, pero sí tengo las BD y Tablas que utiliza.
Lo que son frases exactas con sus respuestas ya lo he solucionado. Trabajo con 4 tablas, 2 de preguntas y 2 de respuestas.

Ahora bien, hay algo que no sé como solucionar. Es lo siguiente:

Hay 1 Tabla con palabras-clave y un código.
Otra Tabla con código y respuesta.

Ejemplo.- Si le digo 'estoy enfermo', busca en frases exactas y no la encuentra. Entonces descompone la frase en palabras y encuentra en 1 Tabla la palabra 'estoy' con código 8 en este caso. Busca en la Tabla de respuestas el código 8 y encuentra entre varias respuestas '¿cuanto tiempo has estado *'

Aquí es donde tengo los problemas.
1.-Aceptar la palabra 'enfermo' en la entrada de frase aunque no la tenga en ninguna Tabla.

2.-Parece ser que el asterisco a continuación de la frase de respuesta es para colocar la palabra que no ha encontrado en la frase de entrada, en este caso 'enfermo'. Por ello contesta 'cuanto tiempo has estado enfermo'.

Como puedo hacerlo para solventar estos 2 puntos?

Gracias y perdonar el rollo.

Saludos
Manuel
Responder Con Cita
  #2  
Antiguo 24-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
hola, lo que podrias hacer es que si no encuentra dicha palabra, insertarla automaticamente, y luego proceder como estabas haciendo. Lo malo sera si se tiene que asociar algo mas a la palabra en cuestion (que seria lo mas probable) porque desde la frase de entrada poca informacion más puedes sacar. saludos.
Responder Con Cita
  #3  
Antiguo 24-09-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Manuel

Cita:
Empezado por Abuelo7 Ver Mensaje
Hay 1 Tabla con palabras-clave y un código.
Otra Tabla con código y respuesta.

Ejemplo.- Si le digo 'estoy enfermo', busca en frases exactas y no la encuentra. Entonces descompone la frase en palabras y encuentra en 1 Tabla la palabra 'estoy' con código 8 en este caso. Busca en la Tabla de respuestas el código 8 y encuentra entre varias respuestas '¿cuanto tiempo has estado *'
Según el otro hilo, esta parte ya esta, verdad. Ahora para esta parte

Cita:
Empezado por Abuelo7 Ver Mensaje
Aquí es donde tengo los problemas.
1.-Aceptar la palabra 'enfermo' en la entrada de frase aunque no la tenga en ninguna Tabla.

2.-Parece ser que el asterisco a continuación de la frase de respuesta es para colocar la palabra que no ha encontrado en la frase de entrada, en este caso 'enfermo'. Por ello contesta 'cuanto tiempo has estado enfermo'.
Para separar en palabras supongo que sigues usando el StringList, te pongo un ejemplo, suponiendo que la primera palabra sea la palabra clave.

Código Delphi [-]
var
 sl : TStringList;
 Cadena, respuesta, pregunta : String;
begin
 sl := TStringList.Create;
 sl.Delimiter := #32;
 sl.DelimitedText := Edit1.Text; // Edit1, es donde se ha introducido la pregunta
 //La respuesta que obtines de tabla si encuentra
 respuesta := 'cuanto tiempo has estado *';

 pregunta := sl[0]; //Obtenemos la primera palabra
 sl.Delete(0); //Si esta como palabra clave entonces borramos de nuestro StringList
 
 //Obtenemos todo lo demas que no sea pregunta
 Cadena := '';
 for i:=0 to sl.Count-1 do
  Cadena := Cadena+sl[i];  
 
 // y lo reemplazamos donde encuentra el *
 respuesta := StringReplace(respuesta,'*',Cadena,[rfIgnorecase,rfReplaceAll]);
 showmessage(respuesta);
end;

pero tienes que ver todos los casos que se pueden dar, aquí estamos suponiendo que la primera palabra es nuestra palabra clave que esta en la Tabla1, pero que pasa si la palabra "estoy" no esta al principio y esta en otro lugar o si encuentra mas de una palabra clave .

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 24-09-2008 a las 14:03:52.
Responder Con Cita
  #4  
Antiguo 24-09-2008
Abuelo7 Abuelo7 is offline
Miembro
 
Registrado: ene 2006
Ubicación: Igualada(Barcelona) Spain
Posts: 51
Poder: 19
Abuelo7 Va por buen camino
Hola amiga Caro.
He probado el código que me has pasado y funciona perfectamente.

Ahora bien, tengo dudas de como insertarlo en el código que tengo.

Te lo paso.

Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  var
        sl : TStringList;
        Cadena, respuesta, pregunta : String;
         i : Integer;

begin
  // si no es la tecla que buscamos, salimos y listo ;-)
  if Key <> #13 then Exit;


  // abrimos tablas
  Table1.Open;
  Table2.Open;
  Table3.Open;
  Table4.Open;


  // ponemos el código en un bloque try..finally para asegurarnos de que pase lo que pase éstas se cierren
  try
    // si localizamos lo buscado en Tabla1 y su resultado en Tabla2, lo añadimos al Memo1
    // Este if funciona debido a que SOLO se evaluará la segunda condición si la primera
    // se cumple (por eso de ser un AND) y si la primera se cumple, ya estamos posicionados
    // en el registro buscado (o al menos eso dice la teoría, no lo he probado xD)
      Memo1.Lines.Add(Edit1.Text);

    if (Table1.Locate('palabra', Edit1.Text, [loCaseInsensitive])) and
       (Table2.Locate('NUMERO', Table1.fieldByName('NUMERO').AsString, [loCaseInsensitive])) then

        Memo1.Lines.Add(Table2.fieldByName('RESPUESTA').AsString)
    else
    If (Table3.Locate('palabra',Edit1.Text,[loCaseInsensitive])) and
       (Table4.Locate('NUMERO',Table3.fieldByName('NUMERO').AsString,[loCaseInsensitive])) then
       Memo1.Lines.Add(Table4.fieldByName('RESPUESTA').AsString)
    else
    if Edit1.Text='adios' then
    Memo1.Lines.Add('Hasta la próxima')
    else
        Memo1.Lines.Add('No entiendo la frase.Podría explicármelo de otra forma?');
  finally
    Table1.Close;
    Table2.Close;
    Table3.Close;
    Table4.Close;
    Edit1.Text :='';
  end;
end;


end.

Gracias
Saludos
Responder Con Cita
  #5  
Antiguo 24-09-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola de nuevo Manuel, en tu codigo quedaría mas o menos así.

Código Delphi [-]
var
 sl : TStringList;
 Cadena, respuesta, pregunta : String;
 i : Integer;
begin
 // si no es la tecla que buscamos, salimos y listo ;-)
 if Key <> #13 then Exit;
 // abrimos tablas
 Table1.Open;
 Table2.Open;
 Table3.Open;
 Table4.Open;
 
 sl := TStringList.Create;
 sl.Delimiter := #32;
 sl.DelimitedText := Edit1.Text;
 pregunta := sl[0];
 
 try
  Memo1.Lines.Add(Edit1.Text);
  if (Table1.Locate('palabra', pregunta, [loCaseInsensitive])) and
     (Table2.Locate('NUMERO', Table1.fieldByName('NUMERO').AsString, [loCaseInsensitive])) then
   begin
    sl.Delete(0);
    //Suponiendo que tu campo de la tabla2 se llma respuesta
    respuesta := Table2.fieldByName('RESPUESTA').AsString;
 
    Cadena := '';
    for i:=0 to sl.Count-1 do
     Cadena := Cadena+sl[i];
    respuesta := StringReplace(respuesta,'*',Cadena,[rfIgnorecase,rfReplaceAll]);
    showmessage(respuesta);
   end
  else
   If (Table3.Locate('palabra',Edit1.Text,[loCaseInsensitive])) and
    Memo1.Lines.Add('Hasta la próxima')
   else
    Memo1.Lines.Add('No entiendo la frase.Podría explicármelo de otra forma?');
 finally
  Table1.Close;
  Table2.Close;
  Table3.Close;
  Table4.Close;
 end;
end;

Conste que solo es si la primera palabra es la que se esta buscando en la tabla de preguntas, debes analizar para todos los casos que dije, pero como ejemplo y para que veas como funciona te servira.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #6  
Antiguo 24-09-2008
Abuelo7 Abuelo7 is offline
Miembro
 
Registrado: ene 2006
Ubicación: Igualada(Barcelona) Spain
Posts: 51
Poder: 19
Abuelo7 Va por buen camino
Hola Caro.
Muchas gracias.

Probaré como me dices.

Como podrás observar en mi código, lo que hace es buscar frases exactas en la tabla1 y en la tabla3 y las respuestas están en tabla2 y tabla4, respectivamente.

Mi idea es si no encuentra la frase exacta, separar las palabras de la frase y buscar dichas palabras una por una, buscando la palabra clave.

Saludos
Responder Con Cita
  #7  
Antiguo 24-09-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por Abuelo7 Ver Mensaje
Mi idea es si no encuentra la frase exacta, separar las palabras de la frase y buscar dichas palabras una por una, buscando la palabra clave.
Para esta parte podrías hacer algo así:

Código Delphi [-]
 .......................
 sl := TStringList.Create;
 sl.Delimiter := #32;
 sl.DelimitedText := Edit1.Text;
 //Añadimos el contenido completo del Edit en nuestra primera posición
 // del StringList para que sea el primero en compararse
 sl.Insert(0,Edit1.Text);

 try
  Memo1.Lines.Add(Edit1.Text);
  indice := -1;
  Recorremos hasta que encuentre
  Repeat
   Inc(Indice);   
  Until Not (Table1.Locate('palabra', sl[Indice], [loCaseInsensitive])) and (Indice//

   if Indice>=0 then //si fuera -1 es porque no ha encontrado
   begin
    if (Table2.Locate('NUMERO', Table1.fieldByName('NUMERO').AsString, [loCaseInsensitive])) then
     begin
      sl.Delete(Indice); //borramos la palabra clave de sl
      respuesta := Table2.fieldByName('RESPUESTA').AsString;
      
      Cadena := '';
      for i:=0 to sl.Count-1 do
       Cadena := Cadena+sl[i];
      respuesta := StringReplace(respuesta,'*',Cadena,[rfIgnorecase,rfReplaceAll]);
      showmessage(respuesta);
     end;
   end;

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #8  
Antiguo 03-10-2008
Abuelo7 Abuelo7 is offline
Miembro
 
Registrado: ene 2006
Ubicación: Igualada(Barcelona) Spain
Posts: 51
Poder: 19
Abuelo7 Va por buen camino
Resumen

Amiga Caro.

Te adjunto el Resumen de que te hablé.

Saludos

Manuel
Archivos Adjuntos
Tipo de Archivo: zip Resumen.zip (2,0 KB, 7 visitas)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Acceder al resumen de las propiedades de archivos turminator API de Windows 1 07-03-2008 18:12:02
Resumen de funcionalidad de Firebird DarKraZY Firebird e Interbase 0 13-11-2006 09:05:39
Resumen memo en dbgrid nachito_tuc OOP 4 27-09-2006 15:27:21
Resumen de la Conferencia ECO II con John Kaster. Epachsoft Noticias 5 30-06-2005 11:14:07
Consulta resumen con subconsulta(ayuda) cmena SQL 5 01-07-2004 00:18:21


La franja horaria es GMT +2. Ahora son las 10:52:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi