C++ 聊天机器人:使用语料库实现问答功能
下面是一个基于 C++ 的简单聊天机器人示例代码:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
std::string trim(const std::string& str) {
size_t first = str.find_first_not_of("
");
size_t last = str.find_last_not_of("
");
return str.substr(first, (last - first + 1));
}
std::string removePunctuation(const std::string& str) {
std::string result;
for (char c : str) {
if (!ispunct(c)) {
result += c;
}
}
return result;
}
std::string getBestMatch(const std::string& question, const std::vector<std::pair<std::string, std::string>>& corpus) {
std::string questionWithoutPunctuation = removePunctuation(question);
std::string bestMatch;
int bestMatchScore = 0;
for (const auto& pair : corpus) {
std::string corpusQuestion = removePunctuation(pair.first);
std::string::size_type pos = questionWithoutPunctuation.find(corpusQuestion);
if (pos != std::string::npos) {
int score = corpusQuestion.length();
if (score > bestMatchScore) {
bestMatch = pair.second;
bestMatchScore = score;
}
}
}
return bestMatch;
}
int main() {
std::ifstream configFile("config.ini");
if (!configFile) {
std::cout << "Failed to open config.ini" << std::endl;
return 1;
}
std::vector<std::pair<std::string, std::string>> corpus;
std::string line;
while (std::getline(configFile, line)) {
size_t eqPos = line.find('=');
if (eqPos != std::string::npos) {
std::string question = trim(line.substr(0, eqPos));
std::string answer = trim(line.substr(eqPos + 1));
corpus.push_back(std::make_pair(question, answer));
}
}
std::string userInput;
std::cout << "Enter your question: ";
std::getline(std::cin, userInput);
std::string delimiter = ",.,。";
size_t start = 0;
size_t end = userInput.find_first_of(delimiter);
while (end != std::string::npos) {
std::string question = trim(userInput.substr(start, end - start));
std::string answer = getBestMatch(question, corpus);
std::cout << "Answer: " << answer << std::endl;
start = end + 1;
end = userInput.find_first_of(delimiter, start);
}
std::string question = trim(userInput.substr(start));
std::string answer = getBestMatch(question, corpus);
std::cout << "Answer: " << answer << std::endl;
return 0;
}
在与上述代码相同的目录下,创建一个名为config.ini的文件,将问题和回答按照问题=回答的格式写入文件中,例如:
你好=你好!
你叫什么名字=我叫聊天机器人。
你喜欢什么颜色=我喜欢蓝色。
编译并运行代码后,程序会提示你输入问题。你可以输入多个问题,每个问题以中文逗号、英文逗号或句号断开。程序将根据你的输入,在配置文件中寻找与每个问题最匹配的问题,并输出对应的回答。
原文地址: https://www.cveoy.top/t/topic/jNc 著作权归作者所有。请勿转载和采集!