使用 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++代码。

使用说明

  1. 创建一个名为 config.ini 的文件,并将问题和回答以 = 分隔,每行一个问题和回答。
  2. 运行代码,输入问题,聊天机器人将根据 config.ini 文件中的语料库进行匹配并输出回答。

特点

  • 支持将用户输入的句子分割为多个子句,并针对每个子句进行匹配和回答。
  • 移除字符串前后的空格和标点符号,以提高匹配精度。
  • 如果找不到匹配的问题,则输出 "抱歉,找不到匹配的答案。"

扩展

可以根据需要扩展 config.ini 文件中的语料库,添加更多问题和回答,并根据实际情况修改代码逻辑,例如添加更复杂的匹配算法,支持不同的标点符号,等等。

C++ 聊天机器人:自动匹配语料库问题并回答

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

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