天天看点

C# 使用AIML 弄 聊天机器人

孙广东  2016.12.21

http://blog.csdn.net/u010019717

确实有人问在Unity中怎么使用:

http://answers.unity3d.com/questions/826590/does-anyone-know-how-to-embed-aiml.html

           答案:  https://code.google.com/p/aimlbot-for-unity/

类似的  插件 AssetStore  : 

Chatbot

 来自 <https://www.assetstore.unity3d.com/en/#!/content/40404>

   最容易理解的就是聊天机器人,  可以看看百度百科的介绍.:  AIML

一、

 现在看看C#  中该怎么使用?

            新建一个 C# 的类库项目,  命名为  Chatbot 

先做  准备工作,  下载类库 并导入:

  • 下载  AIMLbot.dll   http://sourceforge.net/projects/aimlbot/files/aimlbot/2.5/AIMLbot2.5.zip/download    到项目中
  • 下载  aiml and config   http://sourceforge.net/projects/aimlbot/files/aimlbot/2.5/ConsoleBot2.5.zip/download   两个文件夹,并导入到项目中

下载到是压缩包, 内容在

C# 使用AIML 弄 聊天机器人

把上面的下载解压的文件拷贝到  我们新建的 库项目  Chatbot 中:

C# 使用AIML 弄 聊天机器人

添加  文件

using AIMLbot;
using System;
 
namespace Chatbot
{
    public class Chatbot
    {
        const string UserId ="CityU.Scm.David";
        private Bot AimlBot;
        private User myUser;
 
        public Chatbot()
        {
            AimlBot = new Bot();
            myUser = new User(UserId, AimlBot);
            Initialize();
        }
 
        // Loads all the AIML files in the\AIML folder        
        public void Initialize()
        {
            AimlBot.loadSettings();
            AimlBot.isAcceptingUserInput =false;
            AimlBot.loadAIMLFromFiles();
            AimlBot.isAcceptingUserInput =true;
        }
 
        // Given an input string, finds aresponse using AIMLbot lib
        public String getOutput(String input)
        {
            Request r = new Request(input,myUser, AimlBot);
            Result res = AimlBot.Chat(r);
            return (res.Output);
        }
    }
}
           

         然后在  当前解决方案  中  添加  新建项目  C# 控制台项目,  命名为ChatbotConsole  , 并添加引用之前 的库项目 Chatbot 

class Program
    {
        static Chatbot.Chatbot bot;
        static void Main(string[] args)
        {
            bot = new Chatbot.Chatbot();
            string input = "Hello, what isyour name";
            var output = bot.getOutput(input);
            Console.WriteLine(input);
            Console.WriteLine(output);
            Console.ReadKey();
        }
    }
           

 http://blog.csdn.net/u010019717

运行的时候会报异常:

C# 使用AIML 弄 聊天机器人

          就是没有加载到配置文件

将 aiml and config  两个文件夹  拷贝到  控制台项目的  bin 下

C# 使用AIML 弄 聊天机器人
C# 使用AIML 弄 聊天机器人

              现在  机器人不知道  自己是什么名字?  怎么办 ?

二  、

更改  控制台项目  下的配置:

C# 使用AIML 弄 聊天机器人

改为 :

C# 使用AIML 弄 聊天机器人

保存  然后执行, OK !  已经改变了

C# 使用AIML 弄 聊天机器人

三、

          如果 问一个问题, 没有找打答案, 会出现卡死现象。

解决办法是  设置超时时间

 settings.xml  文件中 修改 :

C# 使用AIML 弄 聊天机器人

          把值改为  "10"  .

在测试, 提示的是:

                ERROR: The request has timed out.

            更优雅的处理提示方式:

var output= bot.getOutput(input);
if(!string.IsNullOrEmpty(output))
{
    if(output.StartsWith("ERROR:"))
       HistoryListBox.Items.Add("Robot:\t" + "I don't understand what you mean.");
    else
       HistoryListBox.Items.Add("Robot:\t" + output);
}
           

四、  配置你的机器人  

     我们在 问这样的问题, 可以得出这样的答案, 怎么弄?

Q:    Whereis City University of Hong Kong?

A:    Itis located in Tat Chee Avenue, Kowloon, Hong Kong SAR.

               在  AIML 中 , 问题或输入  在Pattern 标签中 , 回答或输出 在 Template 标签中,  Q-A 对 在  category 标签下

因为 主要是要  弄聊天机器人,  更改

         Chatbot\ChatbotConsole\bin\Debug\aiml  路径下的 :    Bot.aiml     

C# 使用AIML 弄 聊天机器人

如果 把问题 改变一点呢?

         怎么让他模糊  匹配之前的问题呢?

C# 使用AIML 弄 聊天机器人

使用   一个特殊的标记<srai>:    解决这样的需求

C# 使用AIML 弄 聊天机器人

http://blog.csdn.net/u010019717

继续阅读