C++ 聊天机器人:自动匹配语料库问题并回答
使用 C++ 编写一个简单的聊天机器人
该聊天机器人可以自动识别 config.ini 文件中的语料库,根据用户输入的问题找到匹配程度最高的问题,并输出相应的回答。支持将用户输入的句子分割为多个子句,并针对每个子句进行匹配和回答。
代码示例
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
// 检查字符串末尾是否为标点符号
bool isPunctuation(const std::string& str) {
std::string punctuation = ".,;!?";
return punctuation.find(str.back()) != std::string::npos;
}
// 将输入的句子分割为多个子句
std::vector<std::string> splitSentences(const std::string& input) {
std::vector<std::string> sentences;
std::istringstream iss(input);
std::string sentence;
while (std::getline(iss, sentence, '.')) {
sentences.push_back(sentence);
}
return sentences;
}
// 移除字符串前后的空格和标点符号
std::string trim(const std::string& str) {
std::string result = str;
result.erase(result.begin(), std::find_if(result.begin(), result.end(), [](int ch) {
return !std::isspace(ch);
}));
result.erase(std::find_if(result.rbegin(), result.rend(), [](int ch) {
return !std::isspace(ch);
}).base(), result.end());
result.erase(std::find_if(result.rbegin(), result.rend(), [](int ch) {
return !std::isalnum(ch);
}).base(), result.end());
return result;
}
// 根据输入的问题在语料库中寻找匹配程度最高的问题
std::string findBestMatch(const std::string& question, const std::vector<std::string>& questions) {
std::string bestMatch;
int maxMatch = 0;
for (const std::string& q : questions) {
int match = 0;
std::string qCopy = q;
std::string questionCopy = question;
while (!qCopy.empty() && !questionCopy.empty()) {
if (qCopy.front() == questionCopy.front()) {
match++;
qCopy.erase(qCopy.begin());
questionCopy.erase(questionCopy.begin());
} else {
break;
}
}
if (match > maxMatch) {
maxMatch = match;
bestMatch = q;
}
}
return bestMatch;
}
int main() {
std::ifstream configFile("config.ini");
if (!configFile.is_open()) {
std::cout << "Failed to open config.ini" << std::endl;
return 1;
}
std::vector<std::string> questions;
std::vector<std::string> answers;
std::string line;
while (std::getline(configFile, line)) {
std::istringstream iss(line);
std::string question, answer;
if (std::getline(iss, question, '=') && std::getline(iss, answer)) {
questions.push_back(trim(question));
answers.push_back(trim(answer));
}
}
configFile.close();
std::string input;
std::cout << "你好!请输入问题:" << std::endl;
std::getline(std::cin, input);
std::vector<std::string> sentences = splitSentences(input);
for (const std::string& sentence : sentences) {
std::string trimmedSentence = trim(sentence);
std::string bestMatch = findBestMatch(trimmedSentence, questions);
if (!bestMatch.empty()) {
int index = std::find(questions.begin(), questions.end(), bestMatch) - questions.begin();
std::cout << answers[index] << std::endl;
} else {
std::cout << "抱歉,找不到匹配的答案。" << std::endl;
}
}
return 0;
}
config.ini 文件示例
什么是人工智能=人工智能是一种模拟人类智能的技术。
你会写代码吗=当然,我是一个聊天机器人,我可以编写C++代码。
使用说明
- 创建一个名为
config.ini的文件,并将问题和回答以=分隔,每行一个问题和回答。 - 运行代码,输入问题,聊天机器人将根据
config.ini文件中的语料库进行匹配并输出回答。
特点
- 支持将用户输入的句子分割为多个子句,并针对每个子句进行匹配和回答。
- 移除字符串前后的空格和标点符号,以提高匹配精度。
- 如果找不到匹配的问题,则输出 "抱歉,找不到匹配的答案。"
扩展
可以根据需要扩展 config.ini 文件中的语料库,添加更多问题和回答,并根据实际情况修改代码逻辑,例如添加更复杂的匹配算法,支持不同的标点符号,等等。
原文地址: https://www.cveoy.top/t/topic/nEb 著作权归作者所有。请勿转载和采集!