2012-06-29 25 views
5

Tengo este proyecto personal de C++ y actualmente estoy atascado. Parece que mucha gente ha hecho preguntas sobre este tema, y ​​me gustaría disculparme ahora si se trata de una pregunta repetida.C++ chat ranking basado en la respuesta?

De todas formas, este proyecto es un chat bot que responderá en base a la entrada del usuario. Actualmente tal como está, toma toda la consulta y busca una coincidencia utilizando líneas largas e ineficientes de if declaraciones. Si encuentra una coincidencia, responderá con una respuesta determinada.

La razón por la que vine aquí es porque me cansé de escribir declaraciones if que consumen mucho tiempo e ineficientes que ni siquiera captan todas las variaciones de la misma pregunta. No estoy buscando código o soluciones que tomen datos de Wikipedia o algo así. Lo que me gustaría es que el robot de chat simplemente responda algunas preguntas simples.

Durante mi tiempo de trabajo lejos con las declaraciones if, se me ocurrió una idea. ¿Por qué no uso las palabras clave al igual que un motor de búsqueda clasifica las páginas web?

He escrito el código hasta ahora para contar cuántas veces existe una palabra clave (o varias diferentes) en la consulta. El problema es cómo clasificarlos para encontrar la mejor respuesta. Supongo que las respuestas y las palabras clave deberían almacenarse de una manera especial.

Mi lista de respuestas a mi pregunta principal hasta el momento son:

1. Cuando se recibe una consulta, el rango que a través de un archivo ini donde tiene la palabra clave (s) en la llave, y la responde como el valor de eso. Si hay varias respuestas, tome otra palabra clave y busque esa así como la original (disminuyendo el alcance). Hacer esto suficientes veces debería arrojar la respuesta correcta.

Pros: Se adapta a lo que tengo que hacer, y es algo que puedo comprender en C++.

Contras: Parece largo e ineficiente, casi como sumergirse en las sentencias if nuevo ...

2. El uso de una base de datos SQL, dilo a encontrar la respuesta aplicable. Sin embargo, no estoy seguro de cómo se haría eso.

Pros: Sería liviano, ya que la computadora de la base de datos manejaría la búsqueda y podría ser bastante detallada.

Contras: Me puede causar un poco de dolor ya que estoy pisando aguas bastante altas con C++. Sin embargo, estoy empezando a pensar que terminará igual que las declaraciones if.

3. La mejor respuesta que alguien probablemente sugeriría aquí es AIML (que era discussed here).

Pros: Se utiliza para desarrollar smart chat bots, y es bastante potente.

Contras: Parece demasiado "pesado" para mi proyecto simple y no puedo identificar una búsqueda que me encuentre un código fácil de entender para un bot que toma AIML.

Espero que alguien pueda sugerir una ruta inteligente para tomar ya que no soy realmente un fan de C++ y siento que ya estoy pisando fuerte con este proyecto. Sin embargo, para este verano tuve ganas de morderme la lengua, salir de mi zona de confort y, por una vez, hacer algo útil en C++. Pude haber hecho esto rápidamente en PHP, pero para poder enviar los mensajes, tengo que usar C++.

+0

Si pudieras haberlo hecho en php, ¿qué te impide hacerlo en C++? Además, probablemente deba centrarse más en el contexto que en el ranking de palabras clave si desea que parezca inteligente. – gcochard

+1

Cuando se trata de hacer la inteligencia artificial al menos algo "inteligente", va a haber mucho trabajo involucrado. La primera etapa del duelo es la aceptación. –

+0

El contexto sería algo simple, ya lo he pensado bien. Es solo cómo encontrar la respuesta correcta o la mejor. Cuando Alex mencionó, temo que cualquier clase de inteligencia artificial no será fácil de hacer. No soy el mejor en C++, pero al mismo tiempo no me estoy arrastrando. No estoy acostumbrado a C++ y aún me estoy volviendo loco con algunos conceptos. –

Respuesta

0

He hecho algo similar con un bot de IRC hace algún tiempo, y utilicé AIML para esto. Contar la cantidad de veces que aparece una palabra clave en una oración no parece una forma muy precisa. Usar AIML es probablemente el camino a seguir. Si usaba AIML, no tendría que molestarse mucho escribiendo código C++, ya que el "cerebro" real (como se podría llamar) está escrito en AIML. Un pequeño fragmento de código que yo (bueno, creo que se trataba de un ejemplo para una gran parte) escribió para cargar libaiml.xml (el archivo que contiene el código AIML para su bot):

#include <aiml.h> 
// ... 
using namespace aiml; 

// setup Ai bot: 
cInterpreter* interpreter = cInterpreter::newInterpreter(); 

try { 
    if(!interpreter->initialize("libaiml.xml")) 
     throw 1; 
} catch(int _ret) { 
    cout << "ERROR: " << interpreter->getErrorStr(interpreter->getError()) 
     << " (" << interpreter->getError() << ")" << endl; 
    if(!interpreter->getRuntimeErrorStr().empty()) 
     cout << "Runtime Error: " << interpreter->getRuntimeErrorStr() << endl; 
} 

que entonces usado interpreter->respond(message, "name", result); para obtener una respuesta. He vinculado con libaiml (necesita libxml2), que se puede encontrar en http://www.alicebot.org/downloads/programs.html.(scroll hasta C++, debe encontrar libaiml allí; observe que también debe instalar std_utils). Es posible que mi código ya no funcione debido a las actualizaciones en la biblioteca, no lo sé. Afortunadamente, libaiml también contiene un buen ejemplo que fue muy útil en ese momento para mí.

Debe ser capaz de encontrar una gran cantidad de documentación sobre el formato XML en sí, por ejemplo. http://www.alicebot.org/TR/2011/. Te recomiendo que eches un vistazo al ejemplo que mencioné anteriormente (incluido con libaiml) también.

¡Les deseo mucha suerte!

Cuestiones relacionadas