C++ chat bot AI ding

Status
Niet open voor verdere reacties.

vayle

Gebruiker
Lid geworden
6 jul 2010
Berichten
17
Hallo,

ik ben (meerendeels uit verveling) begonnen een soort van chatbot AI dingetje temaken in CSS. nu heb ik een werkende code:

#pragma warning(disable: 4786)

#include <iostream>
#include <string>
#include <vector>
#include <ctime>

const int MAX_RESP = 4;

typedef std::vector<std::string> vstring;

vstring find_match(std::string input);
void copy(char *array[], vstring &v);


typedef struct {
char *input;
char *responses[MAX_RESP];
}record;

record KnowledgeBase[] = {
{"What is your name", //text input
{"My name is Elissia.",
"You can call me Elissia.", //answers
"You may call me Elissia.",
"Why do you want to know my name?"}
},

};

size_t nKnowledgeBaseSize = sizeof (KnowledgeBase) / sizeof (KnowledgeBase[0]);
int main()
{
srand((unsigned) time(NULL));

std::string sInput = "";
std::string sResponse = "";

while(1) {
std::cout<< ">";
std::getline(std::cin, sInput);
vstring responses = find_match(sInput);
if (sInput == "Bye") { //this will make sure that if the line says Bye, the program will shutdown
std::cout << "it was nice talking to you, cya" << std::endl;
break;
}
else if(responses.size() == 0){
std::cout << "I'm not sure if I understand what you are talking about." << std::endl;
}
else{
int nSelection = rand() % MAX_RESP;
sResponse = responses[nSelection]; std::cout << sResponse << std::endl;
}
}

return 0;

}

vstring find_match(std::string input){
vstring result;
for(int i = 0; i < nKnowledgeBaseSize; ++i){
if(std::string(KnowledgeBase .input) == input) {
copy(KnowledgeBase.responses, result);
return result;
}
}
return result;

}

void copy(char *array[], vstring &v) {
for(int i = 0; i < MAX_RESP; ++i) {
v.push_back(array);
}
}

maar om een reply tekrijgen, moet in de console precies hetzelfde zinnetje geschreven worden als de text input in de knowledge base. (hoofdletter gevoelig).

nu wil ik dus weten, hoe maak ik een systeem, wat antwoorden bepaalt door een paar keywoorden

oftewel iets als

if(sInput contains 'how','are','you'){ cout << "I'm fine"

(dit is geen correcte code, dat weet ik) of dat dit gedaan word via een knowledge database in xml of AIML.

ook wil ik hiervoor een functie gebruiken, vergelijkbaar met de casetolower of casetoupper (weet niet of ik dit nu correct geschreven heb) in php.

ik ben redelijk nieuw in c++, dus het kan zijn dat er wat eenvoudig oplosbare vragen tussen zitten.

bedankt voor jullie hulp :)

(de bovenstaande code heb ik niet zelf bedacht, maar heb ik van het web, en ik gebruik ms visual studio voor het programeren van software)
 
Omdat ik me ook verveelde heb ik de opdracht volledig uitgewerkt. Om er zelf ook nog wat plezier aan over te houden heb ik wel geen enkele rekening gehouden met je niveau.

[cpp]
#include <iostream>
#include <algorithm>
#include <map>

void IAmFine()
{
std::cout << "I'm fine\n";
}

void Exit()
{
std::cout << "Exit()\n";
exit(0);
}

int main()
{
typedef void (*fp)();
typedef std::map<std::string, fp> Command;

Command command;

command.insert(Command::value_type("how are you", IAmFine));
command.insert(Command::value_type("exit", Exit));

std::string cmd;

while (true)
{
std::cout << ">";
std::getline(std::cin, cmd);
std::transform(cmd.begin(), cmd.end(), cmd.begin(), tolower);

for (Command::iterator i = command.begin(); i != command.end(); ++i)
{
if (cmd.find((std::string)(*i).first) != -1)
((fp)(*i).second)();
}
}

return 0;
}
[/cpp]
 
Hmm interessant. Ben zelf net begonnen met c++ (moet voor school onderdeel van een neural net framework schrijven) en dan zijn zulke kleine progs wel handig om wat dingen te leren.
Als ik het goed begrijp is de regel typedef void (*fp)(); feitelijk het equivalent van een delegate in c# ?
excuses alvast voor de topic hijack :$
 
Als ik het goed begrijp is de regel typedef void (*fp)(); feitelijk het equivalent van een delegate in c# ?

Ja, dat komt eigenlijk op hetzelfde neer. Alleen heet dit in C/C++ "function pointers".
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan