【翻译】用AIML实现的Python人工智能聊天机器人
前言
用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文件。
<aiml version="1.0.1" encoding="UTF-8">
<!-- std-startup.xml -->
<!-- Category is an atomic AIML unit -->
<category>
<!-- Pattern to match in user input -->
<!-- If user enters "LOAD AIML B" -->
<pattern>LOAD AIML B</pattern>
<!-- Template is the response to the pattern -->
<!-- This learn an aiml file -->
<template>
<learn>basic_chat.aiml</learn>
<!-- You can add more aiml files here -->
<!--<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">
<!-- 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"开始的消息时会随机回复。 *是一个占位符代表能匹配任何字符。
<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文件很有意思,但会是个很大的工作量。我想它需要大约一万的模式才能看起来真实一点。幸好,ALICE基金提供很多免费的AIML文件。可以在Alice Bot网站看看AIML文件。那有个叫std-65-percent.xml文件包括了常规65%的场景。那也有一个可以让你玩21点(BlackJack)的机器人。
写Python
到目前为止,所有的东西都是AIML XML文件。这些是可以构造机器人大脑的重要部分,但这些只是一些信息。机器人需要变活。你需要用一些语言来实现AIML规范,但一些好心人已经用Python做了。
先用pip装aiml包。
pip install aiml
记住aiml包只能在Python 2下用。 Python 3可以用GitHub上的Py3kAiml替代。
简单Python程序
这是我们能启动的最简单的程序。它建一个aiml对象,学习启动文件,并加载剩下的aiml文件。这之后,就可以聊天了,然后我们进入一个无限循环并持续让用户输入消息。你需要输入一个机器人能识别的模式。模式识别依赖于你之前加载的AIML文件。
我们写个单独的启动文件,这样我们可以不用动程序源码加载更多的aiml文件。我们可以在启动xml文件加更多的文件来学习。
import aiml
# Create the kernel and learn AIML files
kernel = aiml.Kernel()
kernel.learn("std-startup.xml")
kernel.respond("load aiml b")
# Press CTRL-C to break this loop
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 now ready for use
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)
# Do something with bot_response
会话和断言
通过一个会话,AIML可以区分不同人的不同的对话。例如,如果一个人告诉机器人她的名字是Alice,另一个人告诉机器人他的名字是Bob,机器人可以区分他们。为了指定你在用哪个会话你可以传给respond()第二个参数。
sessionId = 12345
kernel.respond(raw_input(">>>"), sessionId)
这样每个客户都有个性化的聊天,很好。你可以生成你自己的session id(会话id)并跟踪他们。记住保存大脑文件并不会保存所有会话值。
sessionId = 12345
# Get session info as dictionary. Contains the input
# and output history as well as any predicates known
sessionData = kernel.getSessionData(sessionId)
# Each session ID needs to be a unique value
# The predicate name is the name of something/someone
# that the bot knows about in your session with the bot
# The bot might know you as "Billy" and that your "dog" is named "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中我们可以在模板中设置response来设置断言。
<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.
更多资料
原文:http://www.devdungeon.com/content/ai-chat-bot-python-aiml
本文来自微信平台「麦芽面包」
微信公众号「darkjune_think」转载请注明。
微信扫一扫关注公众号。
【翻译】用AIML实现的Python人工智能聊天机器人的更多相关文章
- 用 AIML 开发人工智能聊天机器人
借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人.AIML 指的是 Artificial Intelligence Markup Language (人工智能标记语言),它不过是 ...
- Python 简易聊天机器人
聊天机器人 | |-----MySql | |---module--"逻辑运算层" | | | |---ciku--"与词库交互" | | | |---dict ...
- 一个使用 Python 的人工智能聊天机器人框架
一个Python 的 AI Chatbot框架 建立一个聊天室可以听起来很棒,但它是完全可行的. IKY是一个内置于Python中的AI动力对话对话界面. 使用IKY,很容易创建自然语言会话场景,无需 ...
- 情人节用Python智能聊天机器人的实现|制作一个虚拟恋人
首先项目需要的包 import urllib.request import urllib.parse from tkinter import * import time PS:另外很多人在学习Pyth ...
- python微信聊天机器人改进版,定时或触发抓取天气预报、励志语录等,向好友推送
最近想着做一个微信机器人,主要想要实现能够每天定时推送天气预报或励志语录,励志语录要每天有自动更新,定时或当有好友回复时,能够随机推送不同的内容.于是开始了分析思路.博主是采用了多线程群发,因为微信对 ...
- 用python玩微信(聊天机器人,好友信息统计)
1.用 Python 实现微信好友性别及位置信息统计 这里使用的python3+wxpy库+Anaconda(Spyder)开发.如果你想对wxpy有更深的了解请查看:wxpy: 用 Python 玩 ...
- QQ 聊天机器人API
QQ机器人是腾讯陆续推出的的人工智能聊天机器人的总称. 都说小Q妹妹聪明好学,我们能够教她说话.也能够请他帮忙查询邮编.手机号,或者解释成语.翻译成语,据说她还会查询手机号码归属地.应用科学计算器. ...
- Python人工智能学习笔记
Python教程 Python 教程 Python 简介 Python 环境搭建 Python 中文编码 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 ...
- 使用Recast.AI创建具有人工智能的聊天机器人
很多SAP顾问朋友们对于人工智能/机器学习这个话题非常感兴趣,也在不断思考如何将这种新技术和SAP传统产品相结合.Jerry之前的微信公众号文章C4C和微信集成系列教程曾经介绍了Partner如何利用 ...
随机推荐
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- ASP.NET是如何在IIS下工作的
ASP.NET与IIS是紧密联系的,由于IIS6.0与IIS7.0的工作方式的不同,导致ASP.NET的工作原理也发生了相应的变化. IIS6(IIS7的经典模式)与IIS7的集成模式的不同 IIS6 ...
- 【翻译】MongoDB指南/CRUD操作(三)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...
- mybatis_开发篇
一.使用mybatis的动态代理方式开发 需求:这里以crm系统中分页条件查询所有的客户信息的功能为例? 1.创建工程 2.引入所需的jar包 3.引入日志文件.数据库连接参数的配置文件等 4.创建m ...
- 【Reading Note】算法读书杂记
1 排序 排序基本信息 稳定性:排序前大的数在排序后,大的数依然保持不变就是稳定排序,反之不稳定 内外排序:根据待排序的记录是否放在内存里面区分的.诸如:插入排序(直接插入&希尔).交换排序( ...
- C#中Length和Count的区别(个人观点)
这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- Dynamics CRM 之ADFS 使用 WID 的联合服务器场
使用 WID 的联合服务器场 默认拓扑 Active Directory 联合身份验证服务 (AD FS) 是联合服务器场,使用 Windows 内部数据库 (WID). 在这种拓扑, AD FS 使 ...
- Android事件分发机制浅谈(一)
---恢复内容开始--- 一.是什么 我们首先要了解什么是事件分发,通俗的讲就是,当一个触摸事件发生的时候,从一个窗口到一个视图,再到一个视图,直至被消费的过程. 二.做什么 在深入学习android ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...