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;
}

使用说明

  1. 在当前目录下创建一个名为 config.ini 的文件,并在文件中按照以下格式添加问题和对应的回答:
你好=你好呀!
你叫什么名字=我叫聊天机器人。
你是谁=我是一个聊天机器人。
  1. 编译运行以上代码后,输入问题即可获取相应的回答。每次输入的问题可以包含多个句子,用中文或英文逗号或句号分隔。输入 q 退出程序。

工作原理

程序首先从 config.ini 文件加载语料库,将问题和答案存储在 map 中。用户输入问题后,程序会将问题分割成多个句子。然后,对于每个句子,程序会使用 calculateSimilarity 函数计算该句子与语料库中每个问题的相似度,找到相似度最高的那个问题,并输出对应的答案。

总结

本文介绍了使用 C++ 语言实现一个简单的聊天机器人,该机器人基于 config.ini 文件存储的语料库进行问答。程序能够识别用户输入的多个句子并逐句进行匹配,找到最匹配的问题并输出相应的答案。该程序可以作为学习 C++ 语言、实现聊天机器人的基础。

C++ 实现聊天机器人:基于语料库的智能问答系统

原文地址: https://www.cveoy.top/t/topic/jLk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录