使用Python AIML搭建聊天机器人的方法示例

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

AIML的设计目标如下:

  1. AIML应当为大众所易学易会。
  2. AIML应当使最小的概念得以编码使之基于L.I.C.E支持一种刺激-响应学科系统组件。
  3. AIML应当兼容XML。
  4. 书写AIML可处理程序文件应当简单便捷。
  5. AIML对象应当对人而言具有良好的可读性和清晰度。
  6. AIML的设计应当正式而简洁。
  7. AIML应当包含对其他语言的依附性。

关于AIML详细的初级读物,可翻阅Alice Bot's AIML Primer。你同样可以在AIML Wikipedia page了解更多 AIML 的内容以及它能够做什么。借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人。

1、安装Python aiml库

pip install aiml

2、获取alice资源

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

3、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可以用来实现对话机器人,但是用于中文有以下问题:

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

解决方案:

  • 自己搭建语料库(比如从字幕文件中获取训练)
  • 自己中文分词工具(如jieba)

相关开源项目:

https://github.com/leo108/aliceCN
https://github.com/messense/wechat-bot
https://github.com/Program-O/Program-O

参考资料:

http://www.w3ii.com/aiml/aiml_introduction.html
http://www.devdungeon.com/content/ai-chat-bot-python-aiml
http://www.alicebot.org/documentation/aiml-reference.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python实现的多任务版udp聊天器功能案例

    本文实例讲述了python实现的多任务版udp聊天器.分享给大家供大家参考,具体如下: 说明 编写一个有2个线程的程序 线程1用来接收数据然后显示 线程2用来检测键盘数据然后通过udp发送数据 要求 实现上述要求 总结多任务程序的特点 参考代码: import socket import threading def send_msg(udp_socket): """获取键盘数据,并将其发送给对方""" while True: # 1. 从键盘输入

  • Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例

    本文实例讲述了Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能.分享给大家供大家参考,具体如下: [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些爱好代码.喜欢收藏代码的朋友,看到别人的代码就粘贴复制过来.可是起码你也试试运行看啊大哥 [正文] 昨日修改运行了UDP协议的C/S聊天程序,可是TCP协议的怎么都不行.各种试,各种坑. 做了下面几个修改后,终于可以了: 1.对发送.接收的信息,分别进行编码和解码 2.客户端的第10行bind改为c

  • 快速实现基于Python的微信聊天机器人示例代码

    最近听说一个很好玩的图灵机器人api,正好可以用它做一个微信聊天机器人,下面是实现 # test.py import requests import itchat #这是一个用于微信回复的库 KEY = '8edce3ce905a4c1dbb965e6b35c3834d' #这个key可以直接拿来用 # 向api发送请求 def get_response(msg): apiUrl = 'http://www.tuling123.com/openapi/api' data = { 'key' :

  • Python实现基于C/S架构的聊天室功能详解

    本文实例讲述了Python实现基于C/S架构的聊天室功能.分享给大家供大家参考,具体如下: 一.课程介绍 1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端. 2.知识点 服务器端涉及到asyncore.asynchat和socket这几个模块,客户端用到了telnetlib.wx.time和thread这几个模块. 3.所需环境 本次课中编写客户端需要用到wxPython,它是一个GUI工具包,请先使用下面的命令安装: $ sudo apt-get install python-wxt

  • python使用udp实现聊天器功能

    聊天器简易版 使用udp实现一个简单的聊天器程序,要求如下: •在一个电脑中编写1个程序,有2个功能 •1.获取键盘数据,并将其发送给对方 •2.接收数据并显示 •并且功能数据进行选择以上的2个功能调用 例子程序如下: import socket def send_message(udp_socket): # 输入对方的ip/port dest_ip = input("请输入对方的ip:") dest_port = int(input("请输入对象的port:"))

  • Python基于Socket实现的简单聊天程序示例

    本文实例讲述了Python基于Socket实现的简单聊天程序.分享给大家供大家参考,具体如下: 需求:SCIENCE 和MOOD两个人软件专业出身,厌倦了大众化的聊天软件,想着自己开发一款简易的聊天软件,满足他们的个性化需求,又不失"专业水准",Talk is easy, try to code it. 技术:socket,详细可参考前文:Python Socket实现简单TCP Server/client功能 语言:python 尽管socket区分服务器和客户端,但是在聊天程序中两

  • python实现多人聊天室

    本文实例为大家分享了python实现多人聊天室的具体代码,供大家参考,具体内容如下 一.目的 以实现小项目的方式,来巩固之前学过的Python基本语法以及相关的知识. 二.相关技术 1.wxpython GUI编程 2.网络编程 3.多线程编程 4.数据库编程 5.简单的将数据导出到Excel表 三.存在的漏洞以及不足 1.由于数据库编码的问题,无法使用中文. 2.在客户端关闭后,其相关的线程仍然存在于服务器的用户线程队列中,所以服务器会错误地往已关闭的客户端传送信息. 3.客户端初始登录并加载

  • 教你用Python创建微信聊天机器人

    最近研究微信API,发现个非常好用的python库:wxpy.wxpy基于itchat,使用了 Web 微信的通讯协议,实现了微信登录.收发消息.搜索好友.数据统计等功能. 这里我们就来介绍一下这个库,并在最后实现一个聊天机器人. 有没有很兴奋?有没有很期待? 好了,接下来,开始我们的正题. 准备工作 安装非常简单,从官方源下载安装 pip install -U wxpy 或者从豆瓣源安装 pip install -U wxpy -i "https://pypi.doubanio.com/sim

  • Python socket C/S结构的聊天室应用实现

    Python socket C/S结构的聊天室应用 服务端: #!/usr/bin/env python #coding:utf8 import socket,select def broadcast_data (sock,message): for socket in conn_list: if socket != server_socket and socket != sock : try : socket.send(message) except : socket.close() conn

  • 使用Python AIML搭建聊天机器人的方法示例

    AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由RichardS. Wallace 博士和Alicebot开源软件组织于1995-2000年间发明创造的.AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式. AIML的设计目标如下: AIML应当为大众所易学易会. AIML应当使最小的概念得以编码使之基于L.I.C.E支持一种刺激-响应学科系统组件. AIML应当兼容XM

  • 基于Python如何使用AIML搭建聊天机器人

    借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人.AIML,全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由Richard Wallace和世界各地的自由软件社区在1995年至2002年发明的. AIML 是什么? AIML由Richard Wallace发明.他设计了一个名为 A.L.I.C.E. (Artificial Linguistics Internet Comp

  • python实现AI聊天机器人详解流程

    前言 开始几天,我是使用很原始的方法,自己去获取天气预报截图,再手动发送给小姐姐.连续几天之后我一想:不对呀,我怎么说也是一个程序猿,怎么能用这么 low 的方式呢. 联想起之前看到的一个开源 python 库-- wxpy,一个非常强大的微信 api 调用类库,正好满足我当前的需要,那话不多说,开干. 任务分解 调用微信 api 发送简单消息 获取当日天气预报截图信息 设置定时任务 调用微信 api 发送简单消息 本程序主要是通过 wxpy 库使用的,参考其官网文档,我们需要做如下准备工作:

  • SpringBoot搭建go-cqhttp机器人的方法实现

    目录 参考文档: 一.搭建go-cqhttp机器人 二.搭建SpringBoot环境 1.HTTP通信 2.WebScoket 通信 三.补充 百度一下搭建go-cqhttp,千篇一律都是采用python搭建的,Java搭建根本没有.导致自己在搭建的时候可折磨了,出现了许多的问题.唯一能参考就只有官方文档.文档对小白也不是太友好,所以出这篇博客弥补一下Java 的搭建版本. 搭建环境: winndows 系统 + Java + Idea 2020.2 注意:本博客写的比较简单,存在很多不完善的地

  • 使用python接入微信聊天机器人

    本文实例为大家分享了python接入微信聊天机器人的具体代码,供大家参考,具体内容如下 1.安装库wxpy: pip install -U wxpy or pip install -U wxpy -i https://pypi.doubanio.com/simple/ 2.简单操作上手: from wxpy import * bot = Bot(cache_path=True) #扫码登录验证 friends_stat = bot.friends().stats() friend_loc = [

  • Python实现微信翻译机器人的方法

    相信大家在日常学习或者是阅读英文文章的过程中,难免会出现几个不认识的单词,或者想快速翻译某段英文的意思. 今天,利用Python爬虫等知识,教大家打造一个微信下的翻译小助手.好吧,开始干活. 先来看看效果如何 发送要翻译的内容给我们的翻译小助手,它会自动回复翻译好的内容. 环境配置: Python版本:3.6.0 系统平台:Windows 10 X64 IDE:pycharm 相关模块: json模块 itchat模块 re模块 request模块 parse模块 以及一些Python自带的模块

  • 用Python一键搭建Http服务器的方法

    今天好友问我怎么从阿里云服务器上把文件下载下来.我一听之下觉得办法很多啊,随意搭个服务器,然后把文件一丢就可以下载了:弄个FTP也行:直接用远程桌面往下拖也可以. 考虑到便捷性,觉得上面的办法都比较麻烦,最好能有个直接解决问题的办法.然后就找到了Python里面. Python3请看 python -m http.server 8000 Python2请看 python -m SimpleHTTPServer 8000 总之就是一条Python命令就能在当前目录起一个Http服务器,然后就可以下

  • python 调用钉钉机器人的方法

    以text格式的消息为例:(只需修改content后的内容) Import json Import requests url='https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxx' HEADERS={"Content-Type":"application/json;charset=utf-8"} String_textMsg={"msgtype":"text&

  • Python3 搭建Qt5 环境的方法示例

    1.检查本机python 版本: 2.安装Qt5 执行如下指令: pip install PyQt5 -i https://pypi.douban.com/simple #在后面加上"-i https://pypi.douban.com/simple"表示使用豆瓣所提供的镜像 3.安装Qt5图形设计工具,指令如下: pip install PyQt5-tools -i https://pypi.douban.com/simple #工具包含(图形界面开发工具qt designer.翻译

随机推荐