前言

用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.你可以在AIML wiki页学更多关于AIML的知识并知道它能做什么。 我们先写一些AIML文件并用Python给它一点生命。

写标准启动文件

标准是写一个叫std-startup.xml的启动文件作为载入AIML文件的主入口点。 这个例子里我们会写一个可以匹配一个模式并做一个动作的基本文件。 我们想要匹配模式load aiml b, 然后让它载入我们的aiml大脑。我们会花一分钟写一个basic_chat aiml文件。

  1. <aiml version="1.0.1" encoding="UTF-8">
  2. <!-- std-startup.xml -->
  3. <!-- Category is an atomic AIML unit -->
  4. <category>
  5. <!-- Pattern to match in user input -->
  6. <!-- If user enters "LOAD AIML B" -->
  7. <pattern>LOAD AIML B</pattern>
  8. <!-- Template is the response to the pattern -->
  9. <!-- This learn an aiml file -->
  10. <template>
  11. <learn>basic_chat.aiml</learn>
  12. <!-- You can add more aiml files here -->
  13. <!--<learn>more_aiml.aiml</learn>-->
  14. </template>
  15. </category>
  16. </aiml>

写AIML文件

上面我们写了一个只处理一种模式的AIML文件,load aiml b。当我们输入那条命令给机器人,它会加载basic_chat.aiml。当我们没写这个文件的时候是不会工作的。这里是你可以放到basic_chat.aiml的内容。我们会匹配两个基本模式和响应。

  1. <aiml version="1.0.1" encoding="UTF-8">
  2. <!-- basic_chat.aiml -->
  3. <category>
  4. <pattern>HELLO</pattern>
  5. <template>
  6. Well, hello!
  7. </template>
  8. </category>
  9. <category>
  10. <pattern>WHAT ARE YOU</pattern>
  11. <template>
  12. I'm a bot, silly!
  13. </template>
  14. </category>
  15. </aiml>

随机回复

我们也可以加一些随机回复。这条在它收到一个以“One time I"开始的消息时会随机回复。 *是一个占位符代表能匹配任何字符。

  1. <category>
  2. <pattern>ONE TIME I *</pattern>
  3. <template>
  4. <random>
  5. <li>Go on.</li>
  6. <li>How old are you?</li>
  7. <li>Be more specific.</li>
  8. <li>I did not know that.</li>
  9. <li>Are you telling the truth?</li>
  10. <li>I don't know what that means.</li>
  11. <li>Try to tell me that another way.</li>
  12. <li>Are you talking about an animal, vegetable or mineral?</li>
  13. <li>What is it?</li>
  14. </random>
  15. </template>
  16. </category>

用现成的AIML文件

写自己的AIML文件很有意思,但会是个很大的工作量。我想它需要大约一万的模式才能看起来真实一点。幸好,ALICE基金提供很多免费的AIML文件。可以在Alice Bot网站看看AIML文件。那有个叫std-65-percent.xml文件包括了常规65%的场景。那也有一个可以让你玩21点(BlackJack)的机器人。

写Python

到目前为止,所有的东西都是AIML XML文件。这些是可以构造机器人大脑的重要部分,但这些只是一些信息。机器人需要变活。你需要用一些语言来实现AIML规范,但一些好心人已经用Python做了。

先用pip装aiml包。

  1. pip install aiml

记住aiml包只能在Python 2下用。 Python 3可以用GitHub上的Py3kAiml替代。

简单Python程序

这是我们能启动的最简单的程序。它建一个aiml对象,学习启动文件,并加载剩下的aiml文件。这之后,就可以聊天了,然后我们进入一个无限循环并持续让用户输入消息。你需要输入一个机器人能识别的模式。模式识别依赖于你之前加载的AIML文件。

我们写个单独的启动文件,这样我们可以不用动程序源码加载更多的aiml文件。我们可以在启动xml文件加更多的文件来学习。

  1. import aiml
  2. # Create the kernel and learn AIML files
  3. kernel = aiml.Kernel()
  4. kernel.learn("std-startup.xml")
  5. kernel.respond("load aiml b")
  6. # Press CTRL-C to break this loop
  7. while True:
  8. print kernel.respond(raw_input("Enter your message >> "))

加速大脑启动

当你有很多AIML文件,这需要学很长时间。这就要靠机器人大脑文件了。在机器人学习了所有的AIML文件后并可以直接把大脑存到一个文件里,这样在下次启动时就可以直接加速。

  1. import aiml
  2. import os
  3. kernel = aiml.Kernel()
  4. if os.path.isfile("bot_brain.brn"):
  5. kernel.bootstrap(brainFile = "bot_brain.brn")
  6. else:
  7. kernel.bootstrap(learnFiles = "std-startup.xml", commands = "load aiml b")
  8. kernel.saveBrain("bot_brain.brn")
  9. # kernel now ready for use
  10. while True:
  11. print kernel.respond(raw_input("Enter your message >> "))

运行中重载AIML

你可以在运行时发重载消息给机器人来重载AIML文件。记住如果你使用了之前写的大脑方法,重载不会节省刚对大脑做的改动。你需要删除大脑文件一遍下次启动时可以重建,或者你需要改代码让机器人在下次重载后的一个时间点来保存大脑。看下节写Python命令给机器人。

  1. load aiml b

加Python命令

如果你要给你的机器人加一些命令来运行Python函数,那你需要捕获机器人的输入信息并在发给kernel.respond()前处理它。上个例子我们从raw_input得到了用户的输入。我们可以从很多地方得到输入。比如一个TCP socket,或一个语音转文本的源。在它发给AIML前处理它。你需要在某些消息时跳过AIML。

  1. while True:
  2. message = raw_input("Enter your message to the bot: ")
  3. if message == "quit":
  4. exit()
  5. elif message == "save":
  6. kernel.saveBrain("bot_brain.brn")
  7. else:
  8. bot_response = kernel.respond(message)
  9. # Do something with bot_response

会话和断言

通过一个会话,AIML可以区分不同人的不同的对话。例如,如果一个人告诉机器人她的名字是Alice,另一个人告诉机器人他的名字是Bob,机器人可以区分他们。为了指定你在用哪个会话你可以传给respond()第二个参数。

  1. sessionId = 12345
  2. kernel.respond(raw_input(">>>"), sessionId)

这样每个客户都有个性化的聊天,很好。你可以生成你自己的session id(会话id)并跟踪他们。记住保存大脑文件并不会保存所有会话值。

  1. sessionId = 12345
  2. # Get session info as dictionary. Contains the input
  3. # and output history as well as any predicates known
  4. sessionData = kernel.getSessionData(sessionId)
  5. # Each session ID needs to be a unique value
  6. # The predicate name is the name of something/someone
  7. # that the bot knows about in your session with the bot
  8. # The bot might know you as "Billy" and that your "dog" is named "Brandy"
  9. kernel.setPredicate("dog", "Brandy", sessionId)
  10. clients_dogs_name = kernel.getPredicate("dog", sessionId)
  11. kernel.setBotPredicate("hometown", "127.0.0.1")
  12. bot_hometown = kernel.getBotPredicate("hometown")

在AIML中我们可以在模板中设置response来设置断言。

  1. <aiml version="1.0.1" encoding="UTF-8">
  2. <category>
  3. <pattern>MY DOGS NAME IS *</pattern>
  4. <template>
  5. That is interesting that you have a dog named <set name="dog"><star/></set>
  6. </template>
  7. </category>
  8. <category>
  9. <pattern>WHAT IS MY DOGS NAME</pattern>
  10. <template>
  11. Your dog's name is <get name="dog"/>.
  12. </template>
  13. </category>
  14. </aiml>

用上面的AIML你可以告诉机器人:

  1. My dogs name is Max

然后机器人会回复:

  1. That is interesting that you have a dog named Max

如果你问:

  1. What is my dogs name?

机器人会回答:

  1. Your dog's name is Max.

更多资料

AIML Tag Reference Table

原文:http://www.devdungeon.com/content/ai-chat-bot-python-aiml


本文来自微信平台「麦芽面包」

微信公众号「darkjune_think」转载请注明。

微信扫一扫关注公众号。

【翻译】用AIML实现的Python人工智能聊天机器人的更多相关文章

  1. 用 AIML 开发人工智能聊天机器人

    借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人.AIML 指的是 Artificial Intelligence Markup Language (人工智能标记语言),它不过是 ...

  2. Python 简易聊天机器人

    聊天机器人 | |-----MySql | |---module--"逻辑运算层" | | | |---ciku--"与词库交互" | | | |---dict ...

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

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

  4. 情人节用Python智能聊天机器人的实现|制作一个虚拟恋人

    首先项目需要的包 import urllib.request import urllib.parse from tkinter import * import time PS:另外很多人在学习Pyth ...

  5. python微信聊天机器人改进版,定时或触发抓取天气预报、励志语录等,向好友推送

    最近想着做一个微信机器人,主要想要实现能够每天定时推送天气预报或励志语录,励志语录要每天有自动更新,定时或当有好友回复时,能够随机推送不同的内容.于是开始了分析思路.博主是采用了多线程群发,因为微信对 ...

  6. 用python玩微信(聊天机器人,好友信息统计)

    1.用 Python 实现微信好友性别及位置信息统计 这里使用的python3+wxpy库+Anaconda(Spyder)开发.如果你想对wxpy有更深的了解请查看:wxpy: 用 Python 玩 ...

  7. QQ 聊天机器人API

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

  8. Python人工智能学习笔记

    Python教程 Python 教程 Python 简介 Python 环境搭建 Python 中文编码 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 ...

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

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

随机推荐

  1. SQL Server 致程序员(容易忽略的错误)

    标签:SQL SERVER/MSSQL/DBA/T-SQL好习惯/数据库/需要注意的地方/程序员/容易犯的错误/遇到的问题 概述 因为每天需要审核程序员发布的SQL语句,所以收集了一些程序员的一些常见 ...

  2. TODO:即将开发的第一个小程序

    TODO:即将开发的第一个小程序 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验.个人理解小程序是寄宿在微信平台上的一个前端框架,具有跨平台功能, ...

  3. 【资源】.Net 入门@提高 - 逆天的高薪之路!

     入门看视频,提高看书籍,飘升做项目.老练研开源,高手读外文,大牛讲低调~    官方学习计划 http://www.cnblogs.com/dunitian/p/5667901.html ----- ...

  4. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

  5. Hawk 4.4 执行器

    执行器是负责将Hawk的结果传送到外部环境的工具.你可以写入数据表,数据库,甚至执行某个特定的动作,或是生成文件等等. 在调试模式下,执行器都是不工作的.这是为了避免产生副作用.否则,每刷新一遍数据, ...

  6. [C#] 简单的 Helper 封装 -- SQLiteHelper

    using System; using System.Data; using System.Data.SQLite; namespace SqliteConsoleApp { /// <summ ...

  7. 深入理解CSS六种颜色模式

    前面的话 赏心悦目的颜色搭配让人感到舒服,修改元素颜色的功能让人趋之若鹜.但颜色规划不当,会让网站用户无所适从.颜色从<font color="">发展至今,保留了很多 ...

  8. BPM配置故事之案例7-公式计算

    行政主管发来邮件.要求物资明细表增加"单价""总价"."单价"由其审批时填写,"总价"根据"单价"与 ...

  9. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  10. 警惕!高版本VS发布时预编译导致Mono中Razor找不到视图

    早前一段时间,一位朋友在Q群里面找到我,说它按照<Linux.NET学习手记>的操作,把一个ASP.NET MVC 4.0的项目部署到Mono之后出现Razor无法找到视图的现象.当时费了 ...