【问题标题】:C++ chat bot rank based answering?基于 C++ 聊天机器人排名的回答?
【发布时间】:2012-07-01 07:44:28
【问题描述】:

我有我的这个个人 C++ 项目,但我目前陷入困境。好像有很多人问过这个话题,如果是重复的问题,我现在很抱歉。

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

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

在我忙于使用 if 语句的过程中,我想出了一个主意。为什么我不像搜索引擎排名网页那样使用关键字?

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

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

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

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

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

2. 使用 SQL 数据库,告诉它找到适用的答案。不过不知道该怎么做。

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

缺点: 可能会给我带来相当大的痛苦,因为我已经在使用 C++ 时涉足了相当高的水平。但是,我开始认为它会像 if 语句一样结束。

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

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

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

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

【问题讨论】:

  • 如果您可以在 php 中完成它,那么是什么阻止您在 c++ 中完成它?此外,如果您希望它看起来更智能,您可能应该更多地关注上下文而不是关键字排名。
  • 要让人工智能至少有点“智能”,将会涉及很多工作。悲伤的第一阶段是接受。
  • 上下文会很简单,我已经考虑过了。这只是如何找到正确或最佳答案。正如亚历克斯提出的,我担心任何类型的人工智能都不容易做到。我在 C++ 方面不是最好的,但同时我也不会爬行。我不习惯 C++,我仍然在思考一些概念。
  • 您能否告诉我们您的机器人将要回答的问题类型以及它会给出什么类型的响应?
  • 我认为使用 SQL 将是正确的方法。该应用程序是为这样的事情而设计的,并且可能会在正确的技术和优化下为您提供最佳性能。 (与用 C++ 设计整个优化系统相比,我相信这会更容易学习)

标签: c++ chat ranking bots aiml


【解决方案1】:

前段时间我用 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-&gt;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 中)。

祝你好运!

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多