2012-06-29 12 views
5

Ho questo mio progetto personale in C++ e sono attualmente bloccato. Sembra che molte persone abbiano fatto domande su questo argomento e vorrei scusarmi ora se si tratta di una domanda a ripetizione.Risposta in base al rank del bot di chat in C++?

In ogni caso, questo progetto è un bot di chat che risponderà in base all'input dell'utente. Attualmente allo stato attuale, prende l'intera query e cerca una corrispondenza utilizzando linee lunghe e inefficienti con le istruzioni if. Se trova una corrispondenza, risponderà con una certa risposta.

Il motivo per cui sono venuto qui è perché mi sono ammalato e stanco di scrivere molto tempo e inefficienti if dichiarazioni che non hanno nemmeno prendere tutte le varianti della stessa domanda. Non sto cercando codice o soluzioni che raccolgano dati da Wikipedia o qualcosa del genere. Quello che vorrei è che il bot della chat risponda solo ad alcune semplici domande.

Durante il mio intervallo di tempo con le dichiarazioni if, mi è venuta un'idea. Perché non uso parole chiave come un motore di ricerca classifica le pagine web?

Ho scritto il codice fino a contare quante volte una parola chiave (o diverse) esistono nella query. Il problema è come fare per classificarli per trovare la migliore risposta? Presumo che le risposte e le parole chiave debbano essere memorizzate in un modo speciale.

mio elenco di risposte alla mia domanda principale finora sono:

1. Quando si riceve una query, rango tramite un file INI in cui ha la parola chiave (s) nella chiave, e la rispondere come il valore di esso. Se ci sono più risposte, prendi un'altra parola chiave e cerca quella e l'originale (diminuendo l'ambito). Fare questo abbastanza volte dovrebbe dare la risposta corretta.

Pro: Si adatta a ciò che devo fare ed è qualcosa che riesco a cogliere in C++.

Contro: Sembra lungo e inefficiente, quasi come tuffarsi in se le dichiarazioni di nuovo ...

2. Utilizzando un database SQL, dirgli di trovare la risposta pertinente. Non sono sicuro di come sarebbe fatto.

Pro: Sarebbe leggero, in quanto il computer di database gestirà la ricerca e potrebbe essere abbastanza dettagliato.

Contro: Potrebbe causare un po 'di dolore per me poiché sto già calpestando acque piuttosto alte con C++. Tuttavia, sto iniziando a pensare che finirà proprio come le dichiarazioni if.

3. La migliore risposta che qualcuno probabilmente suggerirebbe qui è AIML (che era discussed here).

Pro: Utilizzato per sviluppare bot di chat intelligenti ed è piuttosto potente.

Contro: Sembra troppo "pesante" per il mio progetto semplice e non riesco a inchiodare una ricerca che mi trovi un codice facile da capire per un bot che utilizza AIML.

Spero che qualcuno possa suggerire un percorso intelligente da prendere in quanto non sono davvero un fan del C++ e mi sento come se stessi già calpestando acque profonde con questo progetto. Comunque per quest'estate ho sentito mordermi la lingua, uscire dalla mia zona di comfort e per una volta aver fatto qualcosa di utile in C++. Avrei potuto farlo rapidamente in PHP, ma per poter inviare i messaggi, devo usare C++.

+0

Se avessi potuto farlo in PHP, cosa ti impedisce di farlo in C++? Inoltre, dovresti probabilmente concentrarti maggiormente sul contesto rispetto al posizionamento di parole chiave se vuoi che appaia intelligente. – gcochard

+1

Quando si tratta di rendere l'intelligenza artificiale almeno un po '"intelligente", ci sarà molto lavoro da svolgere. La prima fase del lutto è l'accettazione. –

+0

Il contesto sarebbe qualcosa di semplice, l'ho già pensato. È solo come trovare la risposta corretta o migliore. Come ha fatto notare Alex, temo che qualsiasi tipo di intelligenza artificiale non sia facile da fare. Non sono il migliore del C++, ma allo stesso tempo non sto strisciando. Non sono abituato al C++ e sto ancora spostando la testa su alcuni concetti. –

risposta

0

Ho fatto qualcosa di simile con un bot IRC qualche tempo fa, e ho usato AIML per questo. Il conteggio del numero di volte in cui una parola chiave si verifica in una frase non sembra un modo molto accurato. Usare AIML è probabilmente la strada da percorrere. Se hai usato AIML, non dovresti preoccuparti molto di scrivere codice C++, dato che il vero "cervello" (come potrebbe essere chiamato) è scritto in AIML. Un piccolo estratto dal codice che io (e credo che sia venuto da l'esempio per una gran parte) ha scritto per caricare libaiml.xml (il file che contiene il codice AIML per il vostro 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; 
} 

Ho poi usato interpreter->respond(message, "name", result); per ottenere una risposta. Ho collegato con libaiml (ha bisogno di libxml2), che può essere trovato a http://www.alicebot.org/downloads/programs.html.(scroll fino a C++, dovresti trovare libaiml lì; si noti che è necessario installare anche std_utils). È possibile che il mio codice non funzioni più a causa degli aggiornamenti nella libreria, non lo so. Fortunatamente, libaiml contiene anche un bell'esempio che è stato molto utile in quel momento per me.

Si dovrebbe essere in grado di trovare parecchia documentazione sul formato XML stesso, ad es. http://www.alicebot.org/TR/2011/. Ti consiglio di dare un'occhiata all'esempio che ho citato sopra (incluso con libaiml).

Ti auguro buona fortuna!