jjzjj

C++ 聊天机器人基于排名的回答?

coder 2024-02-12 原文

我有自己的这个个人 C++ 项目,但目前卡住了。好像很多人都问过这个话题,如果是重复的问题,我现在很抱歉。

无论如何,这个项目是一个聊天机器人,它会根据用户输入进行回答。 目前,就目前而言,它采用整个查询并使用长而低效的 if 语句行查找匹配项。如果找到匹配项,它将以特定答案作为响应。

我来这里的原因是因为我厌倦了编写非常耗时且效率低下的 if 语句,这些语句甚至无法捕获同一问题的所有变体。我不是在寻找从维基百科或类似内容中获取数据的代码或解决方案。我希望聊天机器人只回答一些简单的问题。

在我苦苦研究 if 语句的过程中,我想到了一个主意。为什么我不像搜索引擎对网页进行排名那样使用关键字?

到目前为止,我已经编写了代码来计算一个关键字(或几个不同的关键字)在查询中存在的次数。问题是如何对它们进行排名以找到最佳答案?我认为答案和关键字需要以特殊方式存储。

到目前为止,我对主要问题的回答列表是:

1. 收到查询后,通过 ini 文件对其进行排名,其中关键字在键中,答案作为其值。如果有多个答案,请使用另一个关键字并搜索原始关键字(缩小范围)。这样做足够多次应该会得出正确的答案。

优点:适合我需要做的事情,这是我在 C++ 中可以掌握的东西。

缺点:看起来冗长且效率低下,几乎就像再次深入到 if 语句中......

2. 使用 SQL 数据库,告诉它找到适用的答案。虽然不确定如何完成。

优点:它会很轻,因为数据库计算机会处理搜索并且可能非常详细。

缺点: 可能会给我带来相当大的痛苦,因为我已经在使用 C++ 的过程中遇到困难了。但是,我开始认为它最终会像 if 语句一样。

3. 有人可能会在这里建议的最佳答案是 AIML(即 discussed here )。

优点:用于开发智能聊天机器人,功能相当强大。

缺点:对于我的简单项目来说似乎太“繁重”了,我无法确定搜索结果,为采用 AIML 的机器人找到易于理解的代码。

我希望有人可以建议一条明智的路线,因为我并不是真正的 C++ 粉丝,而且我觉得我已经在这个项目上踩水了。然而,在这个夏天,我想咬住自己的舌头,走出我的舒适区,并有一次用 C++ 做一些有用的东西。我本可以用 PHP 快速完成此操作,但为了发送消息,我必须使用 C++。

最佳答案

前段时间我用 IRC 机器人做了类似的事情,为此我使用了 AIML。计算关键字在句子中出现的次数似乎不是一种非常准确的方法。使用 AIML 可能是可行的方法。如果您使用 AIML,则不必费心编写 C++ 代码,因为实际的“大脑”(可以这样称呼)是用 AIML 编写的。 我(我认为大部分来自示例)编写的用于加载 libaiml.xml(包含您的机器人的 AIML 代码的文件)的代码的一小段摘录:

#include <aiml.h>
// ...
using namespace aiml;

// setup Ai bot:
cInterpreter* interpreter = cInterpreter::newInterpreter();

try {
    if(!interpreter->initialize("libaiml.xml"))
        throw 1;
} catch(int _ret) {
    cout << "ERROR: " << interpreter->getErrorStr(interpreter->getError())
         << " (" << interpreter->getError() << ")" << endl;
    if(!interpreter->getRuntimeErrorStr().empty())
        cout << "Runtime Error: " << interpreter->getRuntimeErrorStr() << endl;
}

然后我使用 interpreter->respond(message, "name", result); 来获得响应。 我链接了 libaiml(需要 libxml2),可以在 http://www.alicebot.org/downloads/programs.html.(scroll 找到到 C++,你应该在那里找到 libaiml;请注意,您还必须安装 std_utils)。有可能我的代码因为库中的更新而不再工作,我不知道。幸运的是,libaiml 还包含一个很好的示例,当时对我来说非常有用。

您应该能够找到很多关于 XML 格式本身的文档,例如。 http://www.alicebot.org/TR/2011/ .我建议您也看看我上面提到的示例(包含在 libaiml 中)。

祝你好运!

关于C++ 聊天机器人基于排名的回答?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267502/

有关C++ 聊天机器人基于排名的回答?的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  3. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  6. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  9. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  10. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

随机推荐