Python AIML搭建聊天机器人的过程介绍

AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由RichardS. Wallace 博士和Alicebot开源软件组织于1995-2000年间发明创造的。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式。

AIML的设计目标如下:

AIML应当为大众所易学易会。
AIML应当使最小的概念得以编码使之基于L.I.C.E支持一种刺激-响应学科系统组件。
AIML应当兼容XML。
书写AIML可处理程序文件应当简单便捷。
AIML对象应当对人而言具有良好的可读性和清晰度。
AIML的设计应当正式而简洁。
AIML应当包含对其他语言的依附性。
关于AIML详细的初级读物,可翻阅 Alice Bot’s AIML Primer 。你同样可以在 AIML Wikipedia page 了解更多 AIML 的内容以及它能够做什么。借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人。

1、安装Python aiml库

pipinstallaiml
2、获取alice资源

Python aiml安装完成后在Python安装目录下的 Lib/site-packages/aiml下会有alice子目录,这个是系统自带的一个简单的语料库。

3、Python下加载alice

取得alice资源之后就可以直接利用Python aiml库加载alice brain了。

# -*- coding: utf-8 -*-
importaiml
importsys
importos
 
 
defget_module_dir(name):
    path = getattr(sys.modules[name], '__file__', None)
    if not path:
        raiseAttributeError('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:
printalice.respond(raw_input("Enter your message >> "))
上述流程非常的简单,接下来我们要自己从0开始创建自己的机器人。

创建标准启动文件

标准的做法是,创建一个名为std-startup.xml的启动文件,作为加载AIML文件的主入口点。在这个例子中,我们将创建一个基础的文件,它匹配一个模式,并且返回一个相应。我们想要匹配模式load aiml b,然后让它加载我们的aiml大脑作为响应。我们将在一步内创建basic_chat.aiml文件。

<aimlversion="1.0.1" encoding="UTF-8">
    <!-- std-startup.xml -->
 
    <!-- Category是一个自动的AIML单元 -->
    <category>
 
        <!-- Pattern用来匹配用户输入 -->
        <!-- 如果用户输入 "LOAD AIML B" -->
        <pattern>LOADAIML 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的内容。我们将匹配两个基本的模式和响应。

<aimlversion="1.0.1" encoding="UTF-8">
<!-- basic_chat.aiml -->
<aiml>
 
    <category>
        <pattern>HELLO</pattern>
        <template>
            Well, hello!
        </template>
    </category>
 
    <category>
        <pattern>WHATAREYOU</pattern>
        <template>
            I'm a bot, silly!
        </template>
    </category>
 
</aiml>
随机响应

你也可以像下面这样添加随机响应。它将在接受到一个以”One time I”开头的消息的时候随机响应。*是一个匹配任何东西的通配符。

    <category>
        <pattern>ONETIME I *</pattern>
        <template>
            <random>
                <li>Goon.</li>
                <li>Howoldareyou?</li>
                <li>Bemorespecific.</li>
                <li>I didnot knowthat.</li>
                <li>Areyoutellingthetruth?</li>
                <li>I don't knowwhatthatmeans.</li>
                <li>Try to tellmethatanotherway.</li>
                <li>Areyoutalkingaboutananimal, vegetableor mineral?</li>
                <li>Whatis it?</li>
            </random>
        </template>
    </category>
使用已存在的AIML文件

编写你自己的AIML文件是一个很有趣的事,但是它将花费很大的功夫。我觉得它需要大概10,000个模式才会开始变得真实起来。幸运的是,ALICE基金会提供了大量免费的AIML文件。在 Alice Bot website 上浏览AIML文件。

测试新建的机器人

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

# -*- coding: utf-8 -*-
importaiml
importos
 
 
mybot_path = './mybot'
#切换到语料库所在工作目录
os.chdir(mybot_path)
 
mybot = aiml.Kernel()
mybot.learn("std-startup.xml")
mybot.respond('load aiml b')
 
while True:
    printmybot.respond(raw_input("Enter your message >> "))
这是我们可以开始的最简单的程序。它创建了一个aiml对象,学习启动文件,然后加载剩余的aiml文件。然后,它已经准备好聊天了,而我们进入了一个不断提示用户消息的无限循环。你将需要输入一个机器人认识的模式。这个模式取决于你加载了哪些AIML文件。我们将启动文件作为一个单独的实体创建,这样,我们之后可以向机器人添加更多的aiml文件,而不需要修改任何程序源码。我们可以在启动xml文件中添加更多的可供学习的文件。

加速Brain加载

当你开始拥有很多AIML文件时,它将花费很长的时间来学习。这就是brain文件从何而来。在机器人学习所有的AIML文件后,它可以直接将它的大脑保存到一个文件中,这个文件将会在后续的运行中动态加速加载时间。

# -*- coding: utf-8 -*-
importaiml
importos
 
 
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:
    printmybot.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()
    elifmessage == "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响应来设置断言

<aimlversion="1.0.1" encoding="UTF-8">
  <category>
      <pattern>MYDOGSNAMEIS *</pattern>
      <template>
        Thatis interestingthatyouhave a dognamed <setname="dog"><star/></set>
      </template> 
  </category> 
  <category>
      <pattern>WHATIS MYDOGSNAME</pattern>
      <template>
        Yourdog's nameis <getname="dog"/>.
      </template> 
  </category> 
</aiml>
使用上面的AIML,你可以告诉机器人:

Mydogsnameis Max
而机器人会回答你:

Thatis interestingthatyouhave a dognamedMax
然后,如果你问机器人:

Whatis mydogsname?
机器人将会回答:

Yourdog's nameis Max.
aiml可以用来实现对话机器人,但是用于中文有以下问题:

中文规则库较少。规则库相当于对话机器人的“大脑”,一般来说,规则库越丰富,对话机器人的应对就更像人。目前英文的规则库已经很丰富,涵盖面很广,而且是公开可获取的。但公开的中文规则库就基本没有。
AIML解释器对中文支持不好。实际上,Python下的Pyaiml模块(解析器)已经能比较好的支持中文,但是也存在以下问题:英文单词间一般都有空格或标点区分,因此具备一种“自然分词”特性,由于中文输入没有以空格分隔的习惯,以上会在实践中造成一些不便。比如要实现有/无空格的输入匹配,就需要在规则库中同时包含这两种模式。

时间: 2024-09-19 16:27:58

Python AIML搭建聊天机器人的过程介绍的相关文章

用 Tensorflow 搭建能理解语境的聊天机器人!

想掌握对话沟通,语境为王. 我们将使用Tensorflow构建一个聊天机器人框架,向大家示范如何实现上下文的语境处理. 有没有想过为什么大多数聊天机器人缺乏会话语境? 我们将创建一个聊天机器人框架,为一个小岛上的轻便摩托车租赁店建立一个对话模型.这家小店的聊天机器人需要处理营业时间,预订选项等简单问答.我们也希望它能处理客户根据上下文提出的问题,例如关于同一天租金的查询.体验能做好的话,可以让客户的假期留下美好回忆! 这将通过三个步骤实现: 将对话意图的定义转换为Tensorflow模型 接下来

聊天机器人需有独立三观 而不仅仅只是预设

10月10日消息,据国外科技媒体VentureBeat报道,聊天机器人其实只是在数月之前才刚刚进入公众的视线,但它们如今已经变得无处不在了.据悉,目前已有超过18000个聊天机器人被部署在了Facebook的Messenger平台上,而它们中的大多数,都像它们在被设计时所预想的那样,正兢兢业业地处于努力工作的状态. 就目前来说,当我们在谈论聊天机器人时,我们所谈论的话题往往是它能做些什么?有些聊天机器人能帮你在网上订一份披萨,有些聊天机器人可以很轻松地帮你设置一连串的提醒,还有一些聊天机器人会帮

如何运用Python建立你的第一个Slack聊天机器人?

聊天机器人(Bot) 是一种像 Slack 一样的实用的互动聊天服务方式.如果你之前从来没有建立过聊天机器人,那么这篇文章提供了一个简单的入门指南,告诉你如何用 Python 结合 Slack API 建立你第一个聊天机器人. 我们通过搭建你的开发环境, 获得一个 Slack API 的聊天机器人令牌,并用 Pyhon 开发一个简单聊天机器人. 我们所需的工具 我们的聊天机器人我们将它称作为"StarterBot",它需要 Python 和 Slack API.要运行我们的 Pytho

基于规则和检索的聊天机器人引擎

第一篇传送门:<聊天机器人的发展状况与分类>.在上一篇文章中,介绍了聊天机器人目前的发展.本篇主要介绍基于规则的,检索的聊天机器人引擎 - Bot Engine. 问题域 Speech to Text => Logic => Text to Speech   STT和TTS,目前有很多厂商提供技术产品: Speech to Text 语音识别技术 Google Cloud Platform, IBM Watson API, 云知声,科大讯飞 Text to Speech 语音合成技

如何利用深度学习技术训练聊天机器人语言模型?

第一篇传送门:聊天机器人的发展状况与分类 第二篇传送门:基于规则和检索的聊天机器人引擎 本篇文章以这个开源项目为主线进行. 数据预处理 模型能聊的内容也取决于选取的语料.如果已经具备了原始聊天数据,可以用SQL通过关键字查询一些对话,也就是从大库里选取出一个小库来训练.从一些论文上,很多算法都是在数据预处理层面的,比如Mechanism-Aware Neural Machine for Dialogue Response Generation就介绍了,从大库中抽取小库,然后再进行融合,训练出有特

nlp文本处理开源工具,及聊天机器人实现

原文地址:http://www.leiphone.com/news/201702/4OZau7OfcNO0v1u5.html 第一篇传送门:聊天机器人的发展状况与分类 第二篇传送门:基于规则和检索的聊天机器人引擎 本篇文章以这个开源项目为主线进行. 数据预处理 模型能聊的内容也取决于选取的语料.如果已经具备了原始聊天数据,可以用SQL通过关键字查询一些对话,也就是从大库里选取出一个小库来训练.从一些论文上,很多算法都是在数据预处理层面的,比如Mechanism-Aware Neural Mach

聊天机器人的“高情商”炼成术

聊天机器人,是一种通过自然语言模拟人类进行对话的程序.通常运行在特定的软件平台上,如PC平台或者移动终端设备平台,而类人的硬件机械体则不是必需的承载设备. 聊天机器人的研究源于图灵(Alan M. Turing)在1950年<Mind>上发表的文章<Computing Machinery and Intelligence>,文章开篇提出了"机器能思考吗?"("Can machines think?")的设问,并且通过让机器参与一个模仿游戏(I

清华大学黄民烈博士:如何让聊天机器人理解人类情感?

以微软小冰为代表的聊天机器人已经渗透到我们的日常生活中,虽然小冰会卖萌懂幽默,但距离真正的共情.理解人类的情绪还是有一定的距离.清华大学计算机系朱小燕.黄民烈老师团队今年的一项研究工作希望让聊天机器人具备这样的能力. 在这个名为 ECM(Emotional Chatting Machine:情绪化聊天机器人).基于深度学习的情感对话模型中,团队首次将情感因素引入了基于深度学习的生成模型中. 相关论文可查看<Emotional Chatting Machine: Emotional Convers

深度:解密巨头们所关注的聊天机器人

雷锋网(公众号:雷锋网)按:本文作者张俊,文章将会详细解密1)聊天机器人所要解决的三个问题:2)以及它们所使用的模式. 引言: chatbot是最近一段时间非常火的一个词或者一个应用,不仅仅各大新闻媒体在热炒bot的概念,各大巨头也投入巨大的资源进行研发,arxiv上刷出bot相关的paper也更是家常便饭.炒作归炒作,PR归PR,不得不说一个尴尬的事实是市面上确实难以找到一个真正好用的bot.bot按照涉及的领域,分为开放域(open-domain)和面向具体任务(task-oriented)