下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 聊天机器人文档

聊天机器人文档.pdf

聊天机器人文档

zsbxlw
2012-11-01 0人阅读 举报 0 0 暂无简介

简介:本文档为《聊天机器人文档pdf》,可适用于人文社科领域

聊天机器人文档一.聊天机器人基本原理二.为什么AIML解析器不支持中文三.关于标签的支持与使用四.项目结构总览五.将数据库集成到聊天机器人中一)为什么需要使用数据库二)数据库的表是怎样设计的三)数据库里面的预料怎样使用到机器人当中四)在机器人处于运行状态时修改了数据库的预料怎样做到与客户端的同步六.机器人怎样响应用户的输入七.聊天机器人学习功能实现八.聊天机器人存在的不足一.聊天机器人基本原理语料库中的pattern是模式的意思可理解为问题而相应的template可理解为回答(而这一对问答被包裹在了category标签里面)。假如你的语料库像上面的xml文件这样简单那么当你输入“你是谁”机器人就会在内存中去一个一个的匹配pattern,最后匹配到了就会回答“我是小龙”而你输入其他任何语句机器人就无从匹配了程序会出现匹配不到的错误。那么怎样避免程序出错呢?我们修改语料库如下:上图中的*是AIML中的通配符它匹配任何你输入的语句。当你输入的语句成功匹配那么返回相应的template后就不会再去匹配其他的category了。假如程序没有任何相匹配的那么*总是可以匹配你的输入机器人会输出“对不起主人还没有教我怎么回答这个问题呢?”当然AIML解析器所支持的xml标签种类远不止这些上述是最基本的。AIML所支持的标签种类目测有种。二.为什么AIMLAIMLAIMLAIML解析器不支持中文国外的一款做的很好的聊天机器人(通过了图灵测试)她叫“Alice”(你可以用英文和Alice聊天http:wwwpandorabotscompandoratalkbotid=fddeaa),它内部有很庞大的语料库几乎所有用户可能说的话语料库中都有而且它用的就是AIML解析器。然而AIML程序中有一些地方会用正则表达式将除了英文字母和数字外的其他字符全部用空格替代这就是Aiml解析器不支持中文的重要原因这种正则表达式出现在bitoflifechatterbeantextTransformations类中比如下面这个函数:其中fitting为:上面的normalization函数是用来对用户输入做规范化处理的它做了一下工作:在原始输入的内容两头加空格。把句子中间的任何个以上连续的空白字符都替换成一个空格。并对input进行字符过滤修改完正则表达式之后算是成功了一半那还需要做怎么处理呢?我们知道AIML当初仅仅是针对English语言开发的而English单词之间都是有空格的所以在前期载入语料库阶段解析器默认xml语料库中的词之间都有空格然后通过空格将句子分成一个个单词最后在内存构建一个匹配树而且在处理用户输入的句子时也是将其进行了规范化处理如下代码:而为了让它支持中文一个比较直观的方法是在对用户输入做规范化处理的时候我们将输入的中文句子中加入空格比如上述代码的chineseTranslate函数:同理在载入语料库的时候同样需要写一个类似的函数功能就是将语料库中的字之间加上空格。三.关于标签的支持与使用Aiml标签使用的官方文档http:wwwalicebotorgTRWDaimlhttp:wwwpandorabotscombotmasterentutorialch=根据上面的连接我们可以初步了解各种标签的作用和用法。然而就我现在的中文聊天机器人有些标签还不能正常使用这是需要改进的地方。下面是一些我尝试过的一些标签用法:最基本:<category><pattern>你好<pattern><template>呵呵<template><category>每一个问题和回答都被包裹在<category>标签中随机返回功能:<category><pattern>你好<pattern>(或者在后面加一个*)<template><random><li>你好呀!<li><li>嘿嘿<li><li>我很好你呢?<li><random><template><category><li>是library的意思不是list当你输入“你好”的时候机器人会从random里面随机取出一句回答你。不过默认的都是先取第一句回答。输入重定向功能(<srai>):<category><pattern>你好<pattern><template><random><li>你好呀!<li><li>嘿嘿<li><li>我很好你呢?<li><random><template><category><category><pattern>HELLO<pattern><template><srai>你好<srai><template><category>输入“hello”的时候会匹配到第二个category而srai标签的功能是将“你好”当成用户的输入并重新到语料库里去匹配最后就匹配到了第一个category。换句话说用户输入“hello”和输入“你好”的效果是一样的。但是在使用srai标签的时候有可能会形成死循环所以请慎重。另外需要注意的是如果你想要在语料库里面写英文的语料库那么英文单词都要是大写的而用户输入的英文可以不用大写。如果你觉得用大写很不爽那么你可以去修改源代码。*<think>,<set>,<get>,<star>的使用:<category><pattern>我叫*<pattern><template><think><setname="myname"><star><set><think>hello,<getname="myname"><template><category>测试结果为:yousay>我叫小龙Alice>hello,小龙标签解释:set和get里面的myname相当与参数名首先在set标签中给myname赋值然后用get标签得到相应参数的值如果myname之前没有被赋值那么就是空字符串。<star>指的是pattern标签中*所匹配的内容。它还能指定index举个例子:<pattern>我叫*呵呵*<pattern><template><think><setname="myname"><starindex=””><set><think>hello,<getname="myname"><template>那么这时star标签就会被pattern中第个*号所匹配的内容替代。而<star>其实相当与<starindex=””><think>标签可以理解为机器人在思考它只会在“脑子”里默默的记住一些事情或者完成一些不会被用户看到的工作。Condition标签使用:<category><pattern>我叫*<pattern><template><think><setname="myname"><star><set><think>hello,<getname="myname"><template><category><category><pattern>你好*<pattern><template>你好啊!<conditionname="myname"value="jack">怎么又是你?<condition><template><category>测试结果:yousay>我叫jackAlice>hello,jackyousay>你好啊Alice>你好啊!怎么又是你?yousay>我叫jobAlice>hello,jobyousay>你好啊Alice>你好啊!标签解释:<condition>标签中的myname是在set中被赋值的。然后在匹配到“你好*”后就要判断是不是“jack”input标签的用法:<category><pattern>我叫*<pattern><template><think><setname="name"><star><set><think>你好啊<getname="name"><template><category><category><pattern>嘿嘿<pattern><template>你刚才说:“<inputindex="">”?<template><category>测试结果:yousay>我叫jackAlice>你好啊jackyousay>嘿嘿Alice>你刚才说:“我叫jack”?标签解释:<input>标签指的是用户之前的输入加上一个index那就是说用户倒数第几句输入注意是“倒数”!index=””,就是用户倒数第一句输入的内容以此类推当然index是会出现越界错误的。date标签的使用:<category><pattern>现在什么时间*<pattern><template><dateformat="h:mma"><template><category>测试结果:yousay>现在什么时间啊Alice>Itis:下午Date标签将获得当前的系统时间<that>元素表示先前机器人说的话例如:<category><pattern>聊什么好呢*<pattern><template>一起聊聊电影好吗?<template><category><category><pattern>好<pattern><that>一起聊聊电影好吗?<that><template>那你喜欢什么电影呢?<template><category><category><pattern>不好<pattern><that>一起聊聊电影好吗?<that><template>那我也不知道聊什么了~<template><category>测试结果:yousay>聊什么好呢?Alice>一起聊聊电影好吗?yousay>好Alice>那你喜欢什么电影呢?yousay>聊什么好呢Alice>一起聊聊电影好吗?yousay>不好Alice>那我也不知道聊什么了~这个标签还能取前面任意机器人说的话不过不太熟没有试验过如果要取前面的前面机器人的话可以用:<thatindex=”nx,ny”>,例如:<thatindex=”,”表示取机器人倒数第句的话<thatindex=”,”>也等于<justbeforethat><thatstar>标签:<category><pattern>你好<pattern><template>计算机的型号是什么<template><category><category><pattern>*<pattern><that>*的型号是什么<that><template><star>》》这里的star标签匹配的是pattern中的*但是奇怪的如果把index改成以后却也不会出错。这个型号是<thatstar>里面<random><li>很好的商品<li><li>很流行的商品<li><li>很华丽的商品<li><random>。<template><category>测试结果:yousay>你好Alice>计算机的型号是什么yousay>dAlice>d这个型号是里面很好的商品。thatstar是匹配patternsidethat标签里面的*号的但是这里没匹配到。我想这里也还需要修改源代码。set标签也有问题。<category><pattern>他做到了<pattern><template>谁?<template><category><category><pattern>*<pattern><that>谁*<that><template>Oh,whydoyouthink<setname="他"><star><set>didthatIwouldn'texpectthatkindofbehaviorfrom<getname="他"><template><category><category><pattern>*<pattern><template>啊哦~<template><category>测试结果:yousay>他做到了Alice>谁?yousay>小龙Alice>Oh,whydoyouthinkdidthatIwouldn'texpectthatkindofbehaviorfrom假如这样写:<setname="he"><star>那么测试结果为:yousay>他做到了Alice>谁?yousay>jackAlice>Oh,whydoyouthinkjackdidthatIwouldn'texpectthatkindofbehaviorfromjack也就是说这个标签不支持中文。还是需要修改源代码。templatesideinput有问题:<aiml:inputindex=(singleintegerindex|commaseparatedintegerpair)><category><pattern>HELLO<pattern><template>吃饭了吗?<template><category><category><pattern>吃了<pattern><template>我也吃了<template><category><category><pattern>你好<pattern><template>计算机的型号是什么<template><category><category><pattern>*<pattern><that>*的型号是什么<that><template><inputindex=","><input>《《<template><category>测试结果:yousay>helloAlice>吃饭了吗?yousay>吃了Alice>我也吃了yousay>你好Alice>计算机的型号是什么yousay>Alice>helloInput标签中的index貌似当第一个参数是几就返回倒数第几个用户的说的话而第二个参数好像只能是,其他的就会出现数组越界的错误。不知道为什么?上面描述的标签部分还有问题需要改进。另外我想说的是在写xml语料库的时候一定要写一点马上重启程序测试一次看新加的预料是否工作正常否则你写了一堆的预料后在去测试如果出错的话就很难跟踪到错误的地方了。四.项目结构总览五.将数据库集成到聊天机器人中一)为什么需要使用数据库Xml文件是AIML所支持的预料载体而且凭借AIML提供的各种丰富的标签作者可以设计并编写出很人性化的语料库。显然通过这种方式写语料库的特点是灵活性很好能很容易写出“唠嗑”类型的聊天内容。然而当时对这个项目的定位是客服机器人也就是说语料库还应该包含具有业务针对的预料这部分预料将随着业务的不同而不同。于是我想把这部分预料存储在数据库中形成动态的语料库(我把xml文件中的预料称为静态预料也就是说这部分预料完善之后就不去频繁的修改)这样做的好处有一下几点:客服不用去学习怎样写xml预料降低门槛。可以避免xml中预料越来越凌乱到最后难以管理。以后可以针对数据库在开发一个语料库管理系统方便客服管理有业务针对的这部分预料。二)数据库的表是怎样设计的字段解释:Id:预料的编号自动生成(identify)Createtime:该条数据创建时间该条数据产生时自动生成(触发器)Lastmodifytime:最近更新时间该条数据的可填写字段被更新时自动修改(触发器)Question:具体问题自己填写。Replay:具体回答自己填写。Label:标签字段(词语之间用空格隔开)里面填写的词语是要能体现question字段主题的可以理解为一种补充说明例:question:书是什么?那么书应该是被讨论的主题lebel就可以填写和书意义相近的词比如课本教科书教材book,有了这个字段可以从某种程度上增强匹配效果。Copyfield:拷贝字段这个字段会在你填写完(或者更新)question,replay,label这个字段后自动生成(触发器)其内容为上述个字段的合体期间用空格隔开。这个字段是要被索引的重点字段。在以上的描述中也许你会对某些字段存在的必要性产生疑惑没有关系在下面的叙述中也许能解决你的问题。三)数据库里面的预料怎样使用到机器人当中这就是基于lucene的处理。当程序启动的时候程序会在载入xml语料库后,lucene就开始对数据库进行全量索引(这其实也是一种载入语料库行为)并在项目的根目录下产生相应的索引文件index以及时间戳文件(timesTamptxt:该文件记录了当前索引行为发生的时间。将在增量索引时用到)。索引文件会在后面响应用户输入的时候用到。下面是索引操作的代码(在comjob包):其中sql语句是这样的:四)在机器人处于运行状态时修改了数据库的预料怎样做到与客户端的同步这里将用到时间戳的概念。首先当机器人程序运行的时候里面的一个timmer任务也会同时运行这个任务做的工作是定期(比如每隔秒)进行一次增量索引lucene中的概念。增量索引所针对的数据等同与这样一条sql语句所返回的数据该sql语句满足的逻辑是:查找出数据库中所有Lastmodifytime字段值大于timesTamptxt中记录的时间。那么这样每次客服对数据库做的预料修改都会在隔一段时间后同步到客户端。六.机器人怎样响应用户的输入在没有引入数据库前只要调用Aiml提供的聊天接口就能得到一个字符串返回了但是现在加入了数据库那么我的处理的思路是这样的:我在xml语料库里面的*通配符所对应的templete做了标记如下图:注意到上面的红点了吗?我在这个回答最前面加上了“#”的标记。逻辑如下:代码如下:七.聊天机器人学习功能实现其实之前在介绍Aiml标签的时候有个很重要的标签还没有介绍到那就是<system>和<gossip>标签。在我的xml语料库中有一个文件叫Studyxml它的内容如下:(ps:如果不懂这里面一些标签的功能可以回顾之前的标签功能解释)我们看看这样的测试结果是什么:等重启聊天机器人程序的时候问同样的问题:这其中都做了哪些工作呢?下面解释:system标签的工作原理我还不是很清楚但是我们可以看一下AIML解析器对应的Systemjava里面的process方法干了什么:这个函数我暂时解释不清楚但我知道上面的语料库中system标签只是会被learn函数的返回值替代。我重点介绍一下gossip标签的工作过程:首先看AIML解析器中对应的gossipjava文件的process方法干了什么:match参数其实已经封装了上述语料库中learn函数的返回值“你的主人帅吗:帅到爆棚”。而superprocess(match)就是取出这个字符串。然后我们在看print函数:看起来像是在什么文件里面写入了什么内容我们在看outputStream()函数:上述代码中的path其实就是指的这个文件:很显然客户每一次对机器人“教学”的内容都会被写入gossiptxt文件当中而且在写操作时是append的(即不会把原来的覆盖掉)。而当每次重启机器人程序的时侯GossipLoadjava类都会去读gossiptxt的内容并构造一个gossipxml文件将其写到预料库中该类主要代码如下:Load函数在加载xml语料库到内存之前调用。这是必须的因为必须先通过load函数生成gossipxml文件后然后统一加载到内存中去。代码如下:Gossipxml中的内容如下:八.聊天机器人存在的不足数据库匹配做的不好或者说匹配率低而且还不是很准确两种语料库的结合显的有点牵强xml语料库的设计还是比较欠缺的首先预料不够丰富而且靠人工编写预料不是一个好办法

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/21

聊天机器人文档

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利