器→工具, 开源项目, 术→技巧, 研发
AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由RichardS. Wallace 博士和Alicebot开源软件组织于1995-2000年间发明创造的。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式。
关于AIML详细的初级读物,可翻阅Alice Bot’s AIML Primer。你同样可以在 AIML Wikipedia page了解更多 AIML 的内容以及它能够做什么。借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人。
安装Python aiml库
获取alice资源
Python aiml安装完成后在Python安装目录下的 Lib/site-packages/aiml下会有alice子目录,这个是系统自带的一个简单的语料库。
Python下加载alice
取得alice资源之后就可以直接利用Python aiml库加载alice brain了。
# -*- coding: utf-8 -*- import aiml import sys import os def get_module_dir(name): path = getattr(sys.modules[name], '__file__', None) if not path: raise AttributeError('module %s has not attribute __file__' % name) return os.path.dirname(os.path.abspath(path)) alice_path = get_module_dir('aiml') + '/alice' #切换到语料库所在工作目录 os.chdir(alice_path) alice = aiml.Kernel() alice.learn("startup.xml") alice.respond('LOAD ALICE') while True: print alice.respond(raw_input("Enter your message >> "))
上述流程非常的简单,接下来我们要自己从0开始创建自己的机器人。
创建标准启动文件
标准的做法是,创建一个名为std-startup.xml的启动文件,作为加载AIML文件的主入口点。在这个例子中,我们将创建一个基础的文件,它匹配一个模式,并且返回一个相应。我们想要匹配模式load aiml b,然后让它加载我们的aiml大脑作为响应。我们将在一步内创建basic_chat.aiml文件。
<aiml version="1.0.1" encoding="UTF-8"> <!-- std-startup.xml --> <!-- Category是一个自动的AIML单元 --> <category> <!-- Pattern用来匹配用户输入 --> <!-- 如果用户输入 "LOAD AIML B" --> <pattern>LOAD AIML B</pattern> <!-- Template是模式的响应 --> <!-- 这里学习一个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"> <!-- basic_chat.aiml --> <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文件是一个很有趣的事,但是它将花费很大的功夫。我觉得它需要大概10,000个模式才会开始变得真实起来。幸运的是,ALICE基金会提供了大量免费的AIML文件。在Alice Bot website上浏览AIML文件。
测试新建的机器人
目前为止,所有 XML 格式的 AIML 文件都准备好了。作为机器人大脑的组成部分,它们都很重要,不过目前它们只是信息(information)而已。机器人需要活过来。你可以借助任何语言定制 AIML。这里还是使用Python。
# -*- coding: utf-8 -*- import aiml import os mybot_path = './mybot' #切换到语料库所在工作目录 os.chdir(mybot_path) mybot = aiml.Kernel() mybot.learn("std-startup.xml") mybot.respond('load aiml b') while True: print(mybot.respond(raw_input("Enter your message >> ")))
这是我们可以开始的最简单的程序。它创建了一个aiml对象,学习启动文件,然后加载剩余的aiml文件。然后,它已经准备好聊天了,而我们进入了一个不断提示用户消息的无限循环。你将需要输入一个机器人认识的模式。这个模式取决于你加载了哪些AIML文件。我们将启动文件作为一个单独的实体创建,这样,我们之后可以向机器人添加更多的aiml文件,而不需要修改任何程序源码。我们可以在启动xml文件中添加更多的可供学习的文件。
加速Brain加载
当你开始拥有很多AIML文件时,它将花费很长的时间来学习。这就是brain文件从何而来。在机器人学习所有的AIML文件后,它可以直接将它的大脑保存到一个文件中,这个文件将会在后续的运行中动态加速加载时间。
# -*- coding: utf-8 -*- import aiml import os mybot_path = './mybot' #切换到语料库所在工作目录 os.chdir(mybot_path) mybot = aiml.Kernel() if os.path.isfile("mybot_brain.brn"): mybot.bootstrap(brainFile="mybot_brain.brn") else: mybot.bootstrap(learnFiles="std-startup.xml", commands="load aiml b") mybot.saveBrain("mybot_brain.brn") while True: print(mybot.respond(raw_input("Enter your message >> ")))
记住,如果你使用了上面写的brain方法,在运行的时候加载并不会将新增改变保存到brain中。你将需要删除brain文件以便于它在下一次启动的时候重建,或者需要修改代码,使得它在重新加载后的某个时间点保存brain。
增加Python命令
如果你想要为你的机器人提供一些特殊的运行Python函数的命令,那么,你应该为机器人捕获输入消息,然后在将它发送给mybot.respond()之前处理它。在上面的例子中,我们从raw_input中获得了用户的输入。然而,我们可以从任何地方获取输入。可能是一个TCP socket,或者是一个语音识别源码。在它进入到AIML之前处理这个消息。你可能想要在某些特定的消息上跳过AIML处理。
while True: message = raw_input("Enter your message >> ") if message == "quit": exit() elif message == "save": mybot.saveBrain("bot_brain.brn") else: bot_response = mybot.respond(message) # Do something with bot_response
会话与断言
通过指定一个会话,AIML可以为不同的人剪裁不同的会话。例如,如果某个人告诉机器人,他的名字是Alice,而另一个人告诉机器人他的名字是Bob,机器人可以区分不同的人。为了指定你所使用的会话,将其作为第二个参数传给respond()
sessionId = 12345 mybot.respond(raw_input(">>>"), sessionId)
这对于为每一个客户端定制个性化的对话是很有帮助的。你将必须以某种形式生成自己的会话ID,并且跟踪它。注意,保存brain文件不会保存所有的会话值。
sessionId = 12345 # 会话信息作为字典获取. 包含输入输出历史, # 以及任何已知断言 sessionData = mybot.getSessionData(sessionId) # 每一个会话ID需要时一个唯一值。 # 断言名是机器人在与你的会话中了解到的某些/某个名字 # 机器人可能知道,你是"Billy",而你的狗的名字是"Brandy" mybot.setPredicate("dog", "Brandy", sessionId) clients_dogs_name = mybot.getPredicate("dog", sessionId) mybot.setBotPredicate("hometown", "127.0.0.1") bot_hometown = mybot.getBotPredicate("hometown")
在AIML中,我们可以使用模板中的set响应来设置断言
<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可以用来实现对话机器人,但是用于中文有以下问题:
解决方案:
相关开源项目:
参考资料:
聚圣源死亡审判场隐藏英雄密码真三蓝宝石bt物业公司起名字大全免费印尼空难破解版是什么意思优秀作文大全通宵达旦的意思商标起名字测试打分183是移动还是联通党支部工作职责可爱颂原版mv手指舞fate无限代码属马人起名字宜用字大全生辰八字婴儿起名打分重生逆流崛起股市分析软件山东体育频道现场直播装饰公司起名大全两个字鱼火锅谢咏老师起名网址信阳宝宝起名月开头的成语谷姓女孩起名字吗银行卡号查询祸水桑狸鲨鱼黑帮earmaster暗格里的秘密演员表姚姓男孩起名大全 姚姓男孩名字大全弘字的公司名字怎么起淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费