C/C加加大神 編寫聊天機器人 試試手
GIF
你是不是一直在面對著枯燥的C++ 語言特性、摸索著前人寫過的各種演算法,不是因為自己的興趣,而是依靠自身的毅力,學得很苦吧。
好吧,我們找一個好玩一點的東西,一起來寫個聊天機器人吧。我知道只是個簡單的例子,看完也不一定真有人去寫一個聊天機器人,但如果你真想去寫的話,這裡的內容,可以幫助你實現你的目標。
聊天機器人就是讓你能夠對他做出動作(姿勢或語言),然後他會根據你的行為對你做出反應的程序。當你為它輸入自然語言中的一些問題的話,他也可以給你一些看起來有意義的同一語言的回答。
下面是一個非常基本的聊天機器人的代碼,很簡單的幾行:
//
// Program Name: chatterbot1
// Description: this is a very basic example of a chatterbot program
// 描述:這是一個聊天機器人程序一個非常基本的例子
// Author: Gonzales Cenelia
//
#include
#include
#include
int main()
{
std::string Response[] = {
"我聽到了!",
"你是在和我說話。",
"繼續說,我在聽。",
"哈哈,真是非常有趣的談話。",
"後來呢?"
};
srand((unsigned) time(NULL));
std::string sInput = "";
std::string sResponse = "";
while(1) {
std::cout ";
std::getline(std::cin, sInput);
int nSelection = rand() % 5;
sResponse = Response[nSelection];
std::cout
}
return 0;
}
很簡單吧?但要做到適當的響應,它可能是很難寫的一個程序。1951,圖靈提出了一個測試,現在被稱為圖靈測試。在這項測試中,測試的雙方,一方是計算機程序,另一方是一個真正的人類,法官用來判斷誰是真正的人。
聊天機器人一般被認為屬於弱人工智慧領域,但這並不意味著聊天機器人就沒有潛力。由於它相當的簡單,正好方便大多數愛好者去嘗試實現更智能的聊天機器人,所以說,它會是是一個偉大開始的地方。
小編給大家推薦一個學習氛圍超好的地方,C/C++交流企鵝裙:三四一六三六七二七!適合在校大學生,小白,想轉行,想通過這個找工作的加入。裙里有大量學習資料,有大神解答交流問題,每晚都有免費的直播課程
現在,讓我們回到我們以前的程序,前面那個代碼存在哪些問題?
嗯,是的。我們可以清楚地看到,這個程序是不是真的想理解用戶所說的,相反,他只是隨機選擇一個已經存在的句子,響應每次用戶在鍵盤上的輸入。我們還注意到,程序經常重複自己。這其中的一個原因是由於內含的句子資料庫非常小(只有5句),另一個原因是我們還沒有實現任何機制來控制這個不太受歡迎的行為。
那,我們該如何改進它?很簡單,我們需要引入關鍵詞匹配。
關鍵詞只是一個句子(不一定是完整的)或一個字,程序可以從用戶的輸入里識別出來,然後讓自己的回答對應它。讓我們繼續改進剛才那個聊天機器人,現在我們稱其為 chatterbot2。
//
// Program Name: chatterbot2
// Description: this is an improved version
// of the previous chatterbot program "chatterbot1"
// this one will try a little bit more to understand what the user is trying to say
// 描述:這是一個改進版,相比於前面的聊天機器人程序,這次將嘗試一點點更多地理解用戶說什麼
// Author: Gonzales Cenelia
//
#pragma warning(disable: 4786)
#include
#include
#include
#include
const int MAX_RESP = 3;
typedef std::vector 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",
{"嗯,我的名字叫瞎聊。",
"你可以叫我公主...,是啊,我是大小姐啊。",
"為什麼你想知道我的名字?下一步是要交換QQ號嗎?"}
},
{"HI",
{"哈哈,好啊!",
"你是誰?",
"噢,你好!"}
},
{"HOW ARE YOU",
{"我幹得不壞!",
"你幹得怎麼樣?",
"為什麼你會想知道我是怎麼做到的?"}
},
{"WHO ARE YOU",
{"我尼瑪就是個程序啊。",
"表說,我知道你知道我是誰。",
"為什麼還問?"}
},
{"ARE YOU INTELLIGENT",
{"是的,當然是的。",
"你是怎麼想的?",
"哈哈,事實上我確實很聰明。"}
},
{"ARE YOU REAL",
{"這對你真的是個問題嗎?",
"啥意思啊?你?",
"我盡量讓我看起來像個真正的人類。"}
}
};
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") {
std::cout
break;
}
else if(responses.size() == 0) {
std::cout
}
else {
int nSelection = rand() % MAX_RESP;
sResponse = responses[nSelection]; std::cout
}
}
return 0;
}
// make a search for the user"s input
// inside the database of the program
vstring find_match(std::string input) {
vstring result;
for(int i = 0; i
if(std::string(KnowledgeBase[i].input) == input) {
copy(KnowledgeBase[i].responses, result);
return result;
}
}
return result;
}
void copy(char *array[], vstring &v) {
for(int i = 0; i
v.push_back(array[i]);
}
}
現在,程序有了點進步了,它可以儘可能地選擇一些接近的句子來做出反應。你可以嘗試輸入:
WHAT IS YOUR NAME, HOW ARE YOU, ARE YOU INTELLIGENT ... 等語句來測試。
TAG:鹹魚小遊戲 |