C++ 实现聊天机器人:基于语料库的智能问答系统
C++ 实现聊天机器人:基于语料库的智能问答系统
本文将介绍使用 C++ 语言实现一个简单的聊天机器人,该机器人基于 config.ini 文件存储的语料库进行问答。程序能够识别用户输入的多个句子并逐句进行匹配,找到最匹配的问题并输出相应的答案。
代码实现
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
// 读取 config.ini 文件,加载语料库
std::map<std::string, std::string> loadCorpus() {
std::map<std::string, std::string> corpus;
std::ifstream file("config.ini");
std::string line;
while (std::getline(file, line)) {
std::istringstream iss(line);
std::string question, answer;
if (std::getline(iss, question, '=') && std::getline(iss, answer)) {
corpus[question] = answer;
}
}
return corpus;
}
// 计算两个字符串的相似度
int calculateSimilarity(const std::string& str1, const std::string& str2) {
int m = str1.length();
int n = str2.length();
std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));
for (int i = 1; i <= m; ++i) {
dp[i][0] = i;
}
for (int j = 1; j <= n; ++j) {
dp[0][j] = j;
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (str1[i - 1] == str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = std::min({dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1});
}
}
}
return dp[m][n];
}
// 根据问题查找最匹配的回答
std::string findAnswer(const std::map<std::string, std::string>& corpus, const std::string& question) {
int maxSimilarity = 0;
std::string bestQuestion;
for (const auto& pair : corpus) {
int similarity = calculateSimilarity(question, pair.first);
if (similarity > maxSimilarity) {
maxSimilarity = similarity;
bestQuestion = pair.first;
}
}
return corpus.at(bestQuestion);
}
// 分割句子
std::vector<std::string> splitSentences(const std::string& input) {
std::vector<std::string> sentences;
std::string sentence;
std::istringstream iss(input);
std::string word;
while (std::getline(iss, word, '.') || std::getline(iss, word, '。') || std::getline(iss, word, ',') || std::getline(iss, word, ',')) {
word = word.erase(0, word.find_first_not_of("
"));
word = word.erase(word.find_last_not_of("
") + 1);
if (!word.empty()) {
sentence += word;
if (word.back() == '?' || word.back() == '?' || word.back() == '!') {
sentences.push_back(sentence);
sentence.clear();
} else {
sentence += ' ';
}
}
}
if (!sentence.empty()) {
sentences.push_back(sentence);
}
return sentences;
}
int main() {
std::map<std::string, std::string> corpus = loadCorpus();
std::string input;
std::cout << "请输入问题(输入 q 退出):" << std::endl;
while (std::getline(std::cin, input)) {
if (input == "q") {
break;
}
std::vector<std::string> sentences = splitSentences(input);
for (const auto& sentence : sentences) {
std::string answer = findAnswer(corpus, sentence);
std::cout << "回答:" << answer << std::endl;
}
std::cout << "请输入问题(输入 q 退出):" << std::endl;
}
return 0;
}
使用说明
- 在当前目录下创建一个名为
config.ini的文件,并在文件中按照以下格式添加问题和对应的回答:
你好=你好呀!
你叫什么名字=我叫聊天机器人。
你是谁=我是一个聊天机器人。
- 编译运行以上代码后,输入问题即可获取相应的回答。每次输入的问题可以包含多个句子,用中文或英文逗号或句号分隔。输入
q退出程序。
工作原理
程序首先从 config.ini 文件加载语料库,将问题和答案存储在 map 中。用户输入问题后,程序会将问题分割成多个句子。然后,对于每个句子,程序会使用 calculateSimilarity 函数计算该句子与语料库中每个问题的相似度,找到相似度最高的那个问题,并输出对应的答案。
总结
本文介绍了使用 C++ 语言实现一个简单的聊天机器人,该机器人基于 config.ini 文件存储的语料库进行问答。程序能够识别用户输入的多个句子并逐句进行匹配,找到最匹配的问题并输出相应的答案。该程序可以作为学习 C++ 语言、实现聊天机器人的基础。
原文地址: https://www.cveoy.top/t/topic/jLk 著作权归作者所有。请勿转载和采集!