借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人。AIML 指的是 Artificial Intelligence Markup Language (人工智能标记语言),它不过是简单的可 XML (扩展标记语言)形式。本文的示例代码将带你初步领略如何借助 Python 创建属于你的人工智能聊天机器人。

AIML 是什么?

AIML由Richard Wallace发明。他设计了一个名为 A.L.I.C.E.  (Artificial Linguistics Internet Computer Entity 人工语言网计算机实体) 的机器人,并获得了多项人工智能大奖。有趣的是,图灵测试的其中一项就在寻找这样的人工智能:人与机器人通过文本界面展开数分钟的交流,以此查看机器人是否会被当作人类。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式。

关于 AIML 详细的初级读物,可翻阅 Alice Bot’s AIML Primer(http://www.alicebot.org/documentation/aiml-primer.html)。你同样可以在 AIML Wikipedia page(https://en.wikipedia.org/wiki/AIML)了解更多 AIML 的内容以及它能够做什么。我们首先将创建 AIML 文件,并用 Python 赋予它生命。

创建标准的启动文件

创建一个启动文件 std-startup.xml 作为读取AIML文件的主入口点是标准做法。在这里,将创建了一个初始文件用来匹配一种模式和进行一个动作。我们想匹配模式 load aiml b ,并且使它载入我们的 aiml 大脑作为响应。我们将即时创建 basic_chat.aiml 文件。

    <aiml version="1.0.1" encoding="UTF-8">

        <!-- www1.qixoo.com std-startup.xml -->

     

        <!-- <category> 作为AIML的原子级单元 -->

        <category>

     

            <!-- 匹配用户输入的模式 -->

            <!-- 如果用户输入 "LOAD AIML B" -->

            <pattern>LOAD AIML B</pattern>

     

            <!-- <Template> 用来响应模式 -->

            <!-- <learn>是一个aiml文件 -->

            <template>

                <learn>basic_chat.aiml</learn>

                <!-- 在这下面你能添加更多的aiml文件 -->

                <!--<learn>more_aiml.aiml</learn>-->

            </template>

     

        </category>

     

    </aiml>

创建 AIML 文件

上面我们已经创建了只有一种模式句柄的 AIML 文件,load aiml b。当我们通过命令行运行这个机器人,它会尝试读取 basic_chat.aiml。除非我们已经完成创建,否则载入失败。下面的示例代码将告诉你 basic_chat.aiml 文件可以加入什么。我们将匹配两种基础的模式和响应。

    <aiml version="1.0.1" encoding="UTF-8">

    <!-- www1.qixoo.com basic_chat.aiml -->

     

        <category>

            <pattern>HELLO</pattern>

            <template>

                Well, hello!

            </template>

        </category>

     

        <category>

            <pattern>WHAT ARE YOU</pattern>

            <template>

                I'm a bot, silly!

            </template>

        </category>

     

    </aiml>

随机响应

你同样可以像下面的示例代码一样添加随机响应。当接收到“One time I”开头的信息(message),通配符“*”可以进行模糊匹配。

    <category>

        <pattern>ONE TIME I *</pattern>

        <template>

            <random>

                <li>Go on.</li>

                <li>How old are you?</li>

                <li>Be more specific.</li>

                <li>I did not know that.</li>

                <li>Are you telling the truth?</li>

                <li>I don't know what that means.</li>

                <li>Try to tell me that another way.</li>

                <li>Are you talking about an animal, vegetable or mineral?</li>

                <li>What is it?</li>

            </random>

        </template>

    </category>

借助已有的 AIML 文件

编写属于自己的 AIML 文件当然充满乐趣,但工作量也不小。我认为在它(机器人)能感知现实之前至少需要 10,000 中模式。所幸,ALICE基金会已经免费提供了部分 AIML 文件。Alice Bot website 可浏览这些文件。有一种说法是 std-65-percent.xml 包含了 65% 最常用的短语。还有一种说法是它可以让你和机器人玩二十一点。

运用 Python

目前为止,所有 XML 格式的 AIML 文件都准备好了。作为机器人大脑的组成部分,它们都很重要,不过目前它们只是信息(information)而已。机器人需要活过来。你可以借助任何语言定制 AIML,但某些好心人已经用 Python 这么做了。

首先用 pip 安装 aiml 包。

    pip install aiml

注意,aiml 包只能在 Python2 环境下运行。也可以选择 Py3kAiml on GitHub (https://github.com/huntersan9/Py3kAiml)

最简单的 Python 程序

我们可以用如下最简单程序入门。它创建了 aiml 类,学习启动文件,然后读取其余 aiml 文件。接下来,它已经准备好聊天了,我们也进入了一个不断提示用户输入信息的死循环。你需要输入一个机器人能识别的模式。模式的识别取决于你载入的 AIML 文件。

因为我们建立启动文件作为独立实体,所以我们稍后可以对机器人添加更多 aiml 文件而不需要调试任何程序的源代码。只有在 xml 格式的 starup 下,我们才能添加更多文件。

    import aiml

     

    # 创建Kernel()和 AIML 学习文件

    kernel = aiml.Kernel()

    kernel.learn("std-startup.xml")

    kernel.respond("load aiml b")

     

    # 按组合键 CTRL-C 停止循环

    while True:

        print kernel.respond(raw_input("Enter your message >> "))

加速大脑载入

当你渐渐有了许多 AIML 文件,机器人就需要很多时间去学习。这就需要大脑文件的介入了。在机器人学习完所有 AIML 文件后,它可以直接以文件形式存储大脑,再次运行时可以大大提升载入时间。

    import aiml

    import os

     

    kernel = aiml.Kernel()

     

    if os.path.isfile("bot_brain.brn"):

        kernel.bootstrap(brainFile = "bot_brain.brn")

    else:

        kernel.bootstrap(learnFiles = "std-startup.xml", commands = "load aiml b")

        kernel.saveBrain("bot_brain.brn")

     

    # kernel()已经等待使用了

    while True:

        print kernel.respond(raw_input("Enter your message >> "))

运行时重载 AIML

运行时,你可以发送载入信息给机器人,接着将会重载 AIML 文件。注意你是否像上文那样使用了大脑方式,飞速重载不会造成大脑有新的变化。你要么删除大脑文件,以便下次启动时重建;要么修改代码,以便重载后的某一时刻能够储存大脑。下一节将利用新建 Python 命令来让机器人执行这些操作。

    load aiml b

添加 Python 命令

如果你想通过运行 Python 函数来为机器人添加一些特别的命令,那么你应该在发送 kernel.respond() 函数前截取输入信息并处理。在上述的例子中,我们借助 raw_input 函数获取用户的输入。由此我们无论如何都能获取我们的输入信息。可能好似一个 TCP 套接字(socket),或者使声源转换成文本源。你也许不想 AIML 处理对于某些信息。因此在它们传递给 AIML 时处理。

    while True:

        message = raw_input("Enter your message to the bot: ")

        if message == "quit":

            exit()

        elif message == "save":

            kernel.saveBrain("bot_brain.brn")

        else:

            bot_response = kernel.respond(message)

            # bot_response() 回复某些信息

会话和谓词(Predicates)

通过指定会话,AIML 能根据不同对话者随机应变。举个例子,如果某人告诉机器人他们叫 Alice,另一个人则告诉机器人它叫 Bob,机器人可以分清他们。指定你需要的会话,将它作为第二个参数传递给 respond()。

    sessionId = 12345

    kernel.respond(raw_input(">>>"), sessionId)

和每个客户都能有个性化的对话——这棒极了。你不得不生成你特有的会话ID并追踪。记住保存大脑文件不要保存所有的会话值。

    sessionId = 12345

     

    # 将会话信息作为字典

    # 包含输入输出的历史像已知谓词那样

    sessionData = kernel.getSessionData(sessionId)

     

    # 每个会话ID需要一个唯一的值

    # 用会话中机器人已知的人或事给谓词命名

    # 机器人已经知道你叫"Billy"而你的狗叫"Brandy"

    kernel.setPredicate("dog", "Brandy", sessionId)

    clients_dogs_name = kernel.getPredicate("dog", sessionId)

     

    kernel.setBotPredicate("hometown", "127.0.0.1")

    bot_hometown = kernel.getBotPredicate("hometown")

在AIML中,我们可以在 <template> 项中设置谓词。

    <aiml version="1.0.1" encoding="UTF-8">

       <category>

          <pattern>MY DOGS NAME IS *</pattern>

          <template>

             That is interesting that you have a dog named <set name="dog"><star/></set>

          </template>  

       </category>  

       <category>

          <pattern>WHAT IS MY DOGS NAME</pattern>

          <template>

             Your dog's name is <get name="dog"/>.

          </template>  

       </category>  

    </aiml>

通过以上 AIML 你可以告诉机器人:

    My dogs name is Max

机器人会回答:

    That is interesting that you have a dog named Max

另外如果问机器人:

    What is my dogs name?

机器人会这么回应你:

    Your dog's name is Max.

其它参考资料

AIML Tag Reference Table

用 AIML 开发人工智能聊天机器人的更多相关文章

  1. 【翻译】用AIML实现的Python人工智能聊天机器人

    前言 用python的AIML包很容易就能写一个人工智能聊天机器人. AIML是Artificial Intelligence Markup Language的简写, 但它只是一个简单的XML. 下面 ...

  2. 使用websocket开发智能聊天机器人

    前面我们学习了异步web框架(sanic)和http异步调用库httpx,今天我们学习websocket技术. websocket简介 我们知道HTTP协议是:请求->响应,如果没有响应就一直等 ...

  3. 自己动手开发智能聊天机器人完全指南(附python完整源码)

    一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...

  4. 一个使用 Python 的人工智能聊天机器人框架

    一个Python 的 AI Chatbot框架 建立一个聊天室可以听起来很棒,但它是完全可行的. IKY是一个内置于Python中的AI动力对话对话界面. 使用IKY,很容易创建自然语言会话场景,无需 ...

  5. QQ 聊天机器人API

    QQ机器人是腾讯陆续推出的的人工智能聊天机器人的总称. 都说小Q妹妹聪明好学,我们能够教她说话.也能够请他帮忙查询邮编.手机号,或者解释成语.翻译成语,据说她还会查询手机号码归属地.应用科学计算器. ...

  6. QQ聊天机器人 Delphi代码

    QQ聊天机器人     前几日,看到杂志上有一篇关于开发QQ聊天机器人的文章.谈到了对QQ循环发送消息内容,感觉倒也很好玩,于是拿起Delphi开始了我的QQ聊天机器人之路. 首先要明白自己要做什么, ...

  7. 使用Recast.AI创建具有人工智能的聊天机器人

    很多SAP顾问朋友们对于人工智能/机器学习这个话题非常感兴趣,也在不断思考如何将这种新技术和SAP传统产品相结合.Jerry之前的微信公众号文章C4C和微信集成系列教程曾经介绍了Partner如何利用 ...

  8. Rasa Stack:创建支持上下文的人工智能助理和聊天机器人教程

    相关概念 Rasa Stack 是一组开放源码机器学习工具,供开发人员创建支持上下文的人工智能助理和聊天机器人: • Core = 聊天机器人框架包含基于机器学习的对话管理 • NLU = 用于自然语 ...

  9. 为Facebook messenger平台开发聊天机器人

    介绍 在电子商务网上商店发明之前,我们总是有机会与销售代表或分销商在选择商品或服务时交谈.在进入数字世界后,这个领域变得沉默.这样对顾客方便吗?我认为不是.向销售代表或经销商询问他们想要的产品或服务是 ...

随机推荐

  1. c# 二进制或算法实现枚举的HasFlag函数

    from:http://www.cnblogs.com/icyJ/archive/2013/02/20/HasFlag.html 在权限的管理中,常常会出现一个权限包含的现象.例如,有三种基本权限:职 ...

  2. Linux下smokeping网络监控环境部署记录

    smokeping是一款监控网络状态和稳定性的开源软件(它是rrdtool的作者开发的),通过它可以监控到公司IDC的网络状况,如延时,丢包率,是否BGP多线等:smokeping会向目标设备和系统发 ...

  3. 多线程BackgroundWorker

    链接:http://www.cnblogs.com/yiyisawa/archive/2008/11/24/1339826.html 周六闲来无事,学习了多线程BackgroundWorker,以此记 ...

  4. python数字图像处理(4):图像数据类型及颜色空间转换

    一.图像数据类型及转换 在skimage中,一张图片就是一个简单的numpy数组,数组的数据类型有很多种,相互之间也可以转换.这些数据类型及取值范围如下表所示: Data type Range uin ...

  5. ultraEdit32 /uedit32 自定义快捷键/自定义注释快捷键

    编辑器一直用vim,但同事写VHDL 用的是utraledit32 ,为了更好的沟通,我也下载了最新破解版本:http://pan.baidu.com/s/1qWCYP2W 刚开始用找不到注释的快捷键 ...

  6. 怎样写 OpenStack Neutron 的 Extension (二)

    接着之前一篇文章,再来谈谈 Extension 的具体实现问题.我使用的是本地数据库加远程API调用的方法,所以先要定义一下数据库中 myextension 如何存储.首先,我们可以在自己的 plug ...

  7. Linux 常用工具贴

    1. nmon for Linux  用于监控Linux CPU.IO.网络等,可以生产excel格式的报表  http://nmon.sourceforge.net/pmwiki.php?n=Sit ...

  8. Sublime Text 2 使用笔记(大全呀,菜鸟必看)

    下载和安装 Sublime Text2是一款开源的软件,不需要注册即可使用(虽然没有注册会有弹窗,但是基本不影响使用). 下载地址:http://www.sublimetext.com ,请自行根据系 ...

  9. [wikioi 1034][CTSC 1999]家园(网络流)

    由于人类对自然的疯狂破坏,人们意识到在大约2300年之后,地球不能再居住了,于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,2177年冬由于未知的原因,地球环境发生了连锁崩溃,人类必须 ...

  10. 琐碎--选择文件夹(路径)+生产txt格式的log+数据库操作方式

    记录日常工作常用到的一些方法: 1 选择文件操作,并将文件的路径记录下来: OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = f ...