智能客服 对话实现--python aiml包
利用了python的aiml包进行应答
什么是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/con...
智能客服 对话实现--python aiml包的更多相关文章
- 基于Elasticsearch的智能客服机器人
本次分享主要会介绍一下ES是如何帮我们完成NLP的任务的.在做NLP相关任务的时候,ES的相似度算法并不足以支撑用户的搜索,需要使用一些与语义相关的方法进行改进.但是ES的很多特性对我们优化搜索体验是 ...
- 瓜子IM智能客服系统的数据架构设计(整理自现场演讲)
本文由ITPub根据封宇在[第十届中国系统架构师大会(SACC2018)]现场演讲内容整理而成. 1.引言 瓜子业务重线下,用户网上看车.预约到店.成交等许多环节都发生在线下.瓜子IM智能客服系统的目 ...
- 【Google Cloud技术咨询】「Contact Center AI」引领我们走向高度智能客服的时代
前提背景 我们距离"不再智障"的智能客服还有多远?对于智能客服,用户一直都是"批评多于褒奖",究其原因是在于人们对于AI客服的期待很高,而AI客服在实际应用中的 ...
- C# 响应微信发送的Token验证,文字、图文自动回复、请求客服对话.....
代码如下,有需要的可以参考: using System; using System.Collections.Generic; using System.Linq; using System.Web; ...
- AI人工客服开发 小程序智能客服 智能客服微信小程序 智能客服系统怎么做 如何设计智能客服系统
今天我们就来给大家分享下如何做 小程序的智能客服问答系统. 首先请确保你的小程序在线客服已经开通使用,并使用代码自己对接好了,将客户的提问自动做了拦截,拦截到了你自己开发的接口上. 做好了拦截以后,我 ...
- 厌倦了“正在输入…”的客服对话,是时候pick视频客服了
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 什么?! ...
- 关于ajax在微信智能客服管理端的使用
ajax的语法样例: $.ajax({ 'url':url, 'type':'GET', 'dataType':'json', 'data':data, success:function (data) ...
- 智能客服 利用python运行java代码
因为需要在linux中用python来进行分析,顾需要利用python来运行java中语音转文字和文字转语音代码 在python中运行java代码需要利用jpype
- List分组 用于客服对话分组场景
工作用可能会用到会话分组: Message是消息实体对象,里面有toId和fromId 指明接收方ID和发送方Id,通过组合形式"12-22-" 为map的key public M ...
随机推荐
- MySQL----MySQL数据库入门----第二章 数据库和表的基本操作
2.1 数据库和数据库表的创建 ①数据库的创建(在数据库系统中划分一块存储数据的空间): create database 数据库名称 [charset 字符集]: ②数据库表的创建 use 数据库名 ...
- jQuery|简单tab栏切换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Node.js发送电子邮件
电子邮件作为最广泛使用的一种网络服务和我们的工作学习生活已经密不可分.接受信用卡的账单,注册网站,找回密码等等都需要用到它.今天在就来学习下如何在node下来发送邮件,为当前做的项目提供邮箱校验的功能 ...
- Mysql only_full_group_by 引起的错误
SQLSTATE[]: Syntax error or access violation: Expression # of SELECT list is not in GROUP BY clause ...
- Symfony 框架实战教程——第一天:创建项目(转)
这个系列的实战博客真是太有用了,很多例子自己调试也是通的,不同于很多网上不同的实战例子...附上原文地址 https://www.chrisyue.com/symfony-in-action-day ...
- 调试日志——基于stm32的智能声光报警器(三)
智能声光报警器基本功能调试完成. 1.通过拨码开关来设置LED闪烁的频率. 2.关门时喇叭不想,灯熄灭. 3.旁路模式时,灯处于闪烁状态,此时关门灯扔闪烁. 关于此次代码我觉得还是有可以优化的地方,电 ...
- 树莓派3B+SimpleCV上连接iPhone4s摄像头
目的:把iPhone4s当成网络摄像头,通过wifi连接到树莓派上,做为树莓派的摄像头. 1. iPhone4s上安装mini WebCam应用. 很旧的一个app, 没有密码,简单,无广告,免费. ...
- java int 与 Integer之间的区别
int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
- java入门---修饰符&访问修饰符&非访问修饰符
Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class ...