




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《微信公众平台技术》第4章消息的接收与响应人民邮电出版社工业和信息化“十三五”高职高专人才培养规划教材能力CAPACITY要求掌握微信公众平台消息的流程及其分类。掌握接收与回复消息的方法。掌握聊天机器人及其开发流程消息交互流程接收普通用户消息接收事件推送回复消息聊天机器人4.1接收普通用户消息
4.1.1封装接收消息结构
微信公众号能够接收普通用户发送的6种格式的消息,包括文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息和链接消息。当用户向公众号发送消息时,微信服务器将消息以XML格式通过POST的方式发送到填写的URL上。开发者文档上定义了每种普通消息类型的结构,不难发现每种类型的消息都包含参数ToUserName、FromUserName、CreateTime、MsgType与MsgId。4.1接收普通用户消息
4.1.1封装接收消息结构
参数名称描述ToUserName开发者微信号FromUserName发送方帐号(一个OpenID)CreateTime消息创建时间(整型)MsgType消息类型MsgId消息id,64位整型所有消息的公有参数说明
由于所有的消息体都有参数说明表所示的5个公有字段,为了减少代码冗余,我们可以将这些参数提取出来封装成一个接收消息基类,不同的消息实体继承这个基类。4.1接收普通用户消息
4.1.1封装接收消息结构接收消息基类
publicclassBaseMessage{///<summary>///开发者微信号///</summary>publicstringToUserName{get;set;}///<summary>///发送方账号(OpenID)///</summary>publicstringFromUserName{get;set;}///<summary>///消息创建时间///</summary>publicDateTimeCreateTime{get;set;}///<summary>///消息类型///</summary>publicstringMsgType{get;set;}///<summary>///消息id///</summary>publicstringMsgId{get;set;}}4.1接收普通用户消息
4.1.1封装接收消息结构
为了方便管理和代码编写,我们可以把所有消息类型写一个枚举。///<summary>///用户发送消息类型枚举///</summary>publicenumRequestMsgType{text,image,voice,video,shortvideo,location,link,}4.1接收普通用户消息
4.1.1封装接收消息结构
建立消息基类///<summary>///用户发送消息基类///</summary>publicclassRequestMessageBase:BaseMessage{///<summary>///用户发送消息类型///</summary>
publicclassvirtualRequestMsgTypeMsgType{get{returnRequestMsgType.Text;}}///<summary>///消息ID///</summary>publiclongMsgId{get;set}}4.1接收普通用户消息
4.1.2文本消息当用户向公众号发送文本消息时,微信公众号接收到POST消息的XML数据格式如下:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[thisisatest]]></Content><MsgId>1234567890123456</MsgId></xml>4.1接收普通用户消息
4.1.2文本消息
接收文本消息代码:///<summary>///接收文本消息///</summary>publicclassRequestTextMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.text;}}///<summary>///消息内容///</summary>publicstringContent{get;set;}}4.1接收普通用户消息
4.1.3图片消息当用户向公众号发送图片消息时,微信公众号接收到POST消息的XML数据格式如下:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[image]]></MsgType><PicUrl><![CDATA[thisisaurl]]></PicUrl><MediaId><![CDATA[media_id]]></MediaId><MsgId>1234567890123456</MsgId></xml>4.1接收普通用户消息
4.1.3图片消息
接收图片消息代码如下:publicclassRequestImageMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.image;}}///<summary>///图片链接///</summary>publicstringPicUrl{get;set;}///<summary>///图片消息媒体id///</summary>publicstringMediaId{get;set;}}4.1接收普通用户消息
4.1.4语音消息当用户向公众号发送语音消息时,微信公众号接收到POST消息的XML数据格式如下:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[voice]]></MsgType><Format><![CDATA[Format]]></Format><MediaId><![CDATA[media_id]]></MediaId><MsgId>1234567890123456</MsgId></xml>4.1接收普通用户消息
4.1.4语音消息
接收语音消息代码如下:publicclassRequestVoiceMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.voice;}}///<summary>///语音格式///</summary>publicstringFormat{get;set;}
///<summary>///语音消息媒体id///</summary>publicstringMediaId{get;set;}///<summary>///语音识别,UTF8编码///</summary>publicstringRecognition{get;set;}}4.1接收普通用户消息
4.1.5视频消息当用户向公众号发送视频消息时,微信公众号接收到POST消息的XML数据格式如下:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[video]]></MsgType><MediaId><![CDATA[media_id]]></MediaId><ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId><MsgId>1234567890123456</MsgId></xml>4.1接收普通用户消息
4.1.5视频消息
接收视频消息代码如下:///<summary>///接收视频消息///<summary>publicclassRequestVideoMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.video;}}
///<summary>///视频消息缩略图id///</summary>publicstringThumbMediaId{get;set;}///<summary>///视频消息媒体id///</summary>publicstringMediaId{get;set;}}4.1接收普通用户消息
4.1.6小视频消息当用户向公众号发送小视频消息时,微信公众号接收到POST消息的XML数据格式为:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[shortvideo]]></MsgType><MediaId><![CDATA[media_id]]></MediaId><ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId><MsgId>1234567890123456</MsgId></xml>4.1接收普通用户消息
4.1.6小视频消息
接收小视频消息代码如下:///<summary>///接收小视频消息///<summary>publicclassRequestShortVedioMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.shortvideo;}}
///<summary>///视频消息缩略图id///</summary>publicstringThumbMediaId{get;set;}///<summary>///视频消息媒体id///</summary>publicstringMediaId{get;set;}}4.1接收普通用户消息
4.1.7地理位置消息当用户向公众号发送地理位置消息时,微信公众号接收到POST消息的XML数据格式为:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![CDATA[位置信息]]></Label><MsgId>1234567890123456</MsgId></xml>4.1接收普通用户消息
4.1.7地理位置消息
接收地理位置消息代码如下:publicclassRequestLocationMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.location;}}///<summary>///纬度///</summary>publicstringLocation_X{get;set;}///<summary>///经度///</summary>publicstringLocation_Y{get;set;}///<summary>///地图缩放///</summary>publicstringScale{get;set;}///<summary>///地理位置信息///</summary>publicstringLabel{get;set;}}4.1接收普通用户消息
4.1.8链接消息当用户向公众号发送链接消息时,微信公众号接收到POST消息的XML数据格式为:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[link]]></MsgType><Title><![CDATA[公众平台官网链接]]></Title><Description><![CDATA[公众平台官网链接]]><Description><Url><![CDATA[url]]></Url><MsgId>1234567890123456</MsgId></xml>4.1接收普通用户消息
4.1.8链接消息
接收链接消息代码如下:publicclassRequestLinkMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.link;}}///<summary>///消息标题///</summary>publicstringTitle{get;set;}///<summary>///消息描述///</summary>publicstringDescription{get;set;}///<summary>///消息链接///</summary>publicstringUrl{get;set;}}4.1接收普通用户消息
4.1.7地理位置消息当用户向公众号发送地理位置消息时,微信公众号接收到POST消息的XML数据格式为:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![CDATA[位置信息]]></Label><MsgId>1234567890123456</MsgId></xml>4.1接收普通用户消息
4.1.7地理位置消息
接收地理位置消息代码如下:publicclassRequestLocationMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.location;}}///<summary>///纬度///</summary>publicstringLocation_X{get;set;}///<summary>///经度///</summary>publicstringLocation_Y{get;set;}///<summary>///地图缩放///</summary>publicstringScale{get;set;}///<summary>///地理位置信息///</summary>publicstringLabel{get;set;}}接收普通用户消息接收事件推送回复消息聊天机器人4.2接收事件推送
4.2.1封装事件
与普通消息类似,当用户对公众账号进行某种操作时微信服务器会以XML格式通过POST方式将相应事件消息发送到我们填写的服务器地址中,开发者文档上定义了每种事件的消息结构,不难发现每种类型的消息都包含参数ToUserName、FromUserName、CreateTime、MsgType与Event4.2接收事件推送
4.2.1封装事件事件基类
publicclassBaseEvent{///<summary>///开发者微信号///</summary>publicstringToUserName{get;set;}///<summary>///发送方账号(OpenID)///</summary>publicstringFromUserName{get;set;}
///<summary>///消息创建时间///</summary>publicstringCreateTime{get;set;}///<summary>///消息类型///</summary>publicstringMsgType{get;set;}///<summary>///事件类型///</summary>publicstringEvent{get;set;}}4.2接收事件推送
4.2.1封装事件事件推送基类
publicclassRequestBaseEvent{///<summary>///接收事件消息基类///</summary>publicclassRequestBaseEvent:BaseEvent{get{returnRequestMsgType.Event;}}///<summary>///事件类型///</summary>publicvirtualEventEvent{get{returnEvent.CLICK;}}///<summary>///事件key值///</summary>publicvirtualEventEvent{get;set;}4.2接收事件推送
4.2.2关注/取消事件推送XML数据包示例:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[subscribe]]></Event><MsgId>1234567890123456</MsgId></xml>4.2接收事件推送
4.2.2关注/取消事件与关注/取消关注XML数据包示例对应的代码为:///<summary>///接收关注/取消关注事件///</summary>publicclassSubscribeEvent:RequestBaseEvent{publicoverrideEventEvent{get{returnEvent.subscribe;}}}4.2接收事件推送
4.2.3扫描带参数二维码事件用户未关注时,进行关注后的事件推送,推送XML数据包示例:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[subscribe]]></Event><EventKey><![CDATA[qrscene_123123]]></EventKey><Ticket><![CDATA[TICKET]]></Ticket></xml>4.2接收事件推送
4.2.3扫描带参数二维码事件扫描带参数二维码事件的代码:///<summary>///接收扫描带参数二维码事件///</summary>publicclassQRCodeEvent:RequestBaseEvent{publicoverrideEventEvent{get{returnEvent.scan;}}///<summary>///二维码的ticket///</summary>publicstringTicket{get;set;}}4.2接收事件推送
4.2.4上报地理位置事件推送XML数据包示例:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[LOCATION]]></Event><Latitude>23.137466</Latitude><Longitude>113.352425</Longitude><Precision>119.385040</Precision></xml>4.2接收事件推送
4.2.4上报地理位置事件上报地理位置事件的消息结构对应的类如下:///<summary>///上报地理位置事件///</summary>publicclassLocationEvent:RequestBaseEvent{publicoverrideEventEvent{get{returnEvent.LOCATION;}}///<summary>///纬度///</summary>publicstringLatitude{get;set;}
///<summary>///经度///</summary>publicstringLongitude{get;set;}///<summary>///精度///</summary>publicstringPrecision{get;set;}}4.2接收事件推送
4.2.5自定义菜单事件单击菜单拉取消息时的事件,推送XML数据包示例:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[CLICK]]></Event><EvenKey><![CDATA[EVENTKEY]]></EvenKey></xml>4.2接收事件推送
4.2.4自定义菜单事件自定义菜单事件的消息结构对应的代码如下:///<summary>///自定义菜单事件///</summary>publicclassMenuEvent:RequestBaseEvent{publicoverrideEventEvent{get{returnEvent.CLICK;}}}接收普通用户消息接收事件推送回复消息聊天机器人4.3回复消息
回复消息
回复消息被动响应消息主动调用消息接口客服消息接口群发消息接口模版消息接口4.3回复消息
4.3.1被动响应消息
被动响应消息是指当用户发送消息给公众号或某些特定的用户操作引发的事件推送时,会产生一个POST请求,开发者可以在响应包中返回特定XML结构,来对该消息进行响应,支持回复文本、图片、图文、语音、视频、音乐等类型。4.3回复消息
4.3.1被动响应消息
如果开发者希望增强安全性,可以在开发者中心处开启消息加密,这样,用户发给公众号的消息以及公众号被动回复用户消息都会继续加密。消息加解密的具体做法为:(1)在接收授权公众号消息或事件时,除了时间戳timestamp和随机数nonce之外,还增加两个参数,分别是加密类型encrypt_type与消息体签名msg_signature。加密类型为AES,消息体签名用于验证消息体的正确性。(2)POST数据中的XML体,将使用第三方平台申请时的接收消息的加密symmetric_key(也称为EncodingAESKey)来进行加密。4.3回复消息
4.3.1被动响应消息
加解密流程如下:(1)用户发送消息的解密函数(2)开发者回复消息的加密函数4.3回复消息
4.3.2客服消息接口
客服消息接口是指当用户与公众号产生特定动作的交互时,微信会将消息数据推送给开发者,开发者可以在一段时间内(目前为48小时)调用客服接口,通过POST一个JSON数据包发送消息给普通用户。4.3回复消息
4.3.2客服消息接口
调用客服消息接口允许的动作范围如下:1、用户发送消息2、单击自定义菜单,只有单击推事件、扫码推事件、扫码推事件且弹出“消息接收中”提示框这三种事件类型会触发客服消息接口。3、关注公众号4、扫描二维码5、支付成功6、用户维权4.3回复消息
4.3.2客服消息接口——客服帐号管理(1)添加客服帐号开发者可以通过客服消息接口添加客服账号,其中每个公众号可以添加10个客服账号。该接口调用请求如下:HTTP请求方式:POSThttps:///customservice/kfaccount/add?access_token=ACESS_TOKEN4.3回复消息
4.3.2客服消息接口——客服帐号管理(1)添加客服帐号POST示例数据:{“kf_account”:”test1@test”,“nickname”:”客服1”,“password”:”pswmd5”,}正确时Json返回结果如下:{“errcode”:0,“errmsg”:”ok”,}4.3回复消息
4.3.2客服消息接口——客服帐号管理(2)修改客服帐号开发者可以通过客服消息接口为公众号修改客服账号。此接口的调用请求如下:HTTP请求方式:POSThttps:///customservice/kfaccount/update?access_token=ACESS_TOKEN4.3回复消息
4.3.2客服消息接口——客服帐号管理(3)删除客服帐号开发者可以通过客服消息接口为公众号删除客服账号。此接口的调用请求如下:HTTP请求方式:GEThttps:///customservice/kfaccount/del?access_token=ACESS_TOKEN4.3回复消息
4.3.2客服消息接口——设置客服帐号头像开发者可调用客服帐号头像接口来上传图片作为客服人员的头像,头像图片文件必须是jpg格式,推荐使用640*640大小的图片以达到最佳效果。该接口调用请求如下:HTTP请求方式:POST/FORM/customservice/kfaccount/uploadheadimg?access_token=ACESS_TOKEN&kf_account=KFACCOUNT4.3回复消息
4.3.2客服消息接口——获取所有客服帐号开发者可以通过获取所有客服帐号接口获得公众号中设置的客服信息,包括客服工号、客服昵称登录账号。返回的Json包示例如下:kf_list[{“kf_account”:”test1@test”,“nickname”:”ntest1”,“kf_id”:”1001”,“kf_headimgurl”:””,};
{“kf_account”:”test2@test”,“nickname”:”ntest2”,“kf_id”:”1002”,“kf_headimgurl”:””,};{“kf_account”:”test3@test”,“nickname”:”ntest3”,“kf_id”:”1003”,“kf_headimgurl”:””,};]4.3回复消息
4.3.2客服消息接口——客服接口-发消息客服发消息接口调用请求如下:HTTP请求方式:POST/cbg-bin/message/custom/send?access_token=ACESS_TOKEN可以发送文本、图片、语音、视频、音乐、图文消息4.3回复消息
4.3.3回复消息代码实现1、定义回复消息枚举ResponseMsgType2、创建回复消息基类ResponseBaseType3、创建回复消息实体(回复文本、图片、视频、音乐、图文等消息)4、关注消息与消息自动回复接收普通用户消息接收事件推送回复消息聊天机器人4.4聊天机器人
4.4.1聊天机器人介绍
聊天机器人是一个用来模拟人类对话或聊天的程序,世界上最早的聊天机器人诞生于20世纪80年代,名为“阿尔贝特”,用Basic语言编写而成。现在比较有名的聊天机器人有Bily,Alise等,由于中文对“词”划分的模糊和语义繁多等等原因,国内聊天机器人发展相对较慢,有白丝魔里沙、赢思软件的小i、爱博的小A、小强、图灵机器人等。4.4聊天机器人
4.4.1聊天机器人介绍
在微信公众号中接入聊天机器人的功能,有两种方式:一是在现有聊天机器人API接口基础上搭建的微信聊天机器人。
目前中文聊天机器人有小黄鸡、图灵机器人等,其中图灵机器人API接口免费,接入流程简单。接入现有聊天机器人的方法简单,无需编程即可实现。以图灵机器人为例,只需申请图灵机器人账号,设置机器人信息以及接入微信公众平台的配置信息等就可完成。二是自行开发聊天机器人。
开发聊天机器人需要了解聊天机器人的原理和开发过程。聊天机器人实现的原理与一般流程是预先采集大量的问答知识,当收到用户的提问时,系统对问题进行分词,判断该话题在系统知识库中应存放的位置,为用户返回相应回答。4.4聊天机器人
4.4.1聊天机器人介绍
聊天机器人原理图4.4聊天机器人
4.4.1聊天机器人介绍1、问答知识库
问答库中的记录越多,涉及的知识面越广,能够回答的问题就越多,回答的准确率也就越高。对于企业公众账号而言,用户提的问题基本都可以通过企业客服知识库解决。4.4聊天机器人
4.4.1聊天机器人介绍1、问答知识库
(1)问答知识表的建表语句createtable‘knowledge’(‘id’intnotnullprimarykeycomment’主键标识’,‘question’varchar(2000)notnullcomment’问题’,‘answer’text(8000)notnullcomment‘答案’,‘category’intnotnullcomment‘知识的类别(1:普通话2:英语3:上下文)’)comment=’知识问答表’;4.4聊天机器人
4.4.1聊天机器人介绍1、问答知识库
(2)问答知识分表的建表结构createtable‘knowledge_sub’(‘id’intnotnullauto_incrementprimarykeycomment‘主键标识’,‘pid’intnotnullcomment‘与knowledge表中的id相对应’,‘answer’text(8000)notnullcomment‘答案’)comment=’问答知识分表’;4.4聊天机器人
4.4.1聊天机器人介绍1、问答知识库
(3)笑话表createtable‘joke’(‘joke_id’int(8)primarykeynotnullauto_incrementcomment‘笑话id’,‘joke_content’text(8000)notnullcomment’笑话内容’,)comment=’笑话表’;4.4聊天机器人
4.4.1聊天机器人介绍1、问答知识库
(4)聊天记录表createtable‘chat_log’(‘id’intnotnullauto_incrementprimarykeycomment‘主键标识’,‘open_id’varchar(30)notnullcomment‘用户的OpenID’,‘create_time’varchar(20)notnullcomment‘消息的创建时间’,‘req_msg’varchar(2000)notnullcomment‘用户上行的消息’,‘resp_msg’varchar(2000)notnullcomment‘公众账号回复的消息’,‘chat_category’intcomment‘聊天话题的类别(0:未知1:普通对话2:笑话3:上下文)’)comment=’聊天记录表’;4.4聊天机器人
4.4.1聊天机器人介绍2、中文分词方法
(1)基于字符串匹配的分词算法
又称为机械分词或字典算法。这种方法是按照一定策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。该方法有三个核心要素:扫描方向、匹配优先策略以及词典。
根据扫描方向的不同分为正向匹配、逆向匹配和双向匹配。
根据不同长度匹配优先策略,分为最大(最长)优先和最小(最短)优先。常用的基于字符串匹配的分词算法有正向最大匹配法、逆向最大匹配法与最小切分法。将正向最大匹配和逆向最大匹配方法结合起来的方法就是双向最大匹配法。4.4聊天机器人
4.4.1聊天机器人介绍2、中文分词方法
(2)基于统计的分词算法
基于统计的分词算法是按照相邻字出现的次数来判断构成一个词语的可能性。从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好地反映成词的可信度。4.4聊天机器人
4.4.1聊天机器人介绍2、中文分词方法
(3)基于理解的分词算法
该方法是计算机模拟人对计句子的理解进行分词的算法,基本思想是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。
它通常包括三个部分:分词子系统、句法语义子系统、总控部分。4.4聊天机器人
4.4.1聊天机器人介绍3、L与中文分词算法
(1)Lucene的结构
L的最新版本为2012年发行的L3.0.3版本。从Lucene官网上下载最新源码,其源码包含9个包:Analysis,Document,Index,Messages,QueryParser,Search,Store,Support,Util。源码结构如下图所示。4.4聊天机器人
4.4.1聊天机器人介绍3、L与中文分词算法
Lucene的索引过程4.4聊天机器人
4.4.1聊天机器人介绍3、L与中文分词算法
(2)分词器IKAnalyzerNet
IKAnalyzer是基于JAVA的开源的第三方分词工具包。而IKAnalyzerNet是IKAnalyzer在.net的移植版本。该工具包采用正向迭代最细粒度切分算法,支持智能分词和最细粒度分词两种切分模式,使其分词结果更准确,更智能化。4.4聊天机器人
4.4.2聊天机器人实现
1.开发准备2.封装数据库操作3.封装聊天服务类ChatService4.实现CoreService类4.4聊天机器人
4.4.2聊天机器人实现1、开发准备在VisualStudio2012或其他版本上创建一个web项目,要注意将几个文件复制到项目的引用下,分别是:Apache-Lucene.Net-3.0.3-RC2.binL.dllIKAnalyzerNet.dll4.4聊天机器人
4.4.2聊天机器人实现2、封装数据库操作聊天机器人功能涉及的数据库操作主要有获取问答知识表所有记录,获取上一次聊天类别,并根据知识id从问答知识分表随机获取一个答案、随机获取一个笑话和保存聊天记录。需要将这些功能都封装在工具类中。4.4聊天机器人
4.4.2聊天机器人实现3、封装聊天服务类ChatService
该类主要是获取问答知识表中的所有记录,并对其创建索引;从索引文件中检索匹配指定问题的问答知识;封装一个提供给外部使用的聊天方法。4.4聊天机器人usingSystem;usingLucene.Net.Document;usingLucene.Net.Store;usingLucene.Net.Util;namespaceWeixin.Chatbot{publicclassChatService{//得到索引存储目录publicstaticStringgetIndexDir(){//得到.class文件所在路径Stringclasspath=ChatService.class.getResource(“/”).getPath();//将classpath中的%20替换为空格classpath=classpath.replaceAll(“%20”,””);returnclasspath+”index/”;}//创建索引publicstaticcoidcreateIndex(){//取得问答知识库中的所有记录List<Knowledge>knowledgeList=SQLSeverUtil.findAllKnowledge();Directorydirectory=null;IndexWriterindexWriter=null;try{directory=FSDirectory.open(newFile(getIndexDir()));IndexWriterConfigiwConfig=newIndexWriterConfig(Version.LUCENE_46,NewIKAnalyzer(true));indexWriter=newIndexWriter(directory,iwConfig);Documentdoc=null;//遍历问答知识库创建索引for(Knowledgeknowledge:knowledgeList){doc=newDocument();//对question进行分词doc.add(newTextField(“question”,knowledge,getQuestion(),Store.YES));//对id、answer、category不分词存储doc.add(newIntField(“id”,knowledge,getId(),Store.YES));doc.add(newStringField(“answer”,knowledge,getAnswer(),Store.YES));doc.add(newIntField(“category”,knowledge,getCategory(),Store.YES));indexWriter.addDocument(doc);}indexWriter.close();directory.close();}catch(Exceptione){e.printStackTrace();}}//从索引文件中根据问题检索答案privatestaticKnowledgesearchIndex(Stringcontent){Knowledgeknowledge=null;try{Directorydirectory=FSDirectory.open(newFile(getIndex()));IndexReaderreader=IndexReader.open(directory);IndexSearchersearcher=newIndexSearcher(reader);//使用查询解析器创建QueryQueryParserquestParser=newQueryParser(Version.LUCENE_46,“question”,newIKAnalyzer(true));Queryquery=questParser.parse(QueryParser.escape(content));//检索得分最高的文档TopDocstopDocs=searcher.search(query,1);if(topDocs.totalHits>0){knowledge=newKnowledge();ScoreDoc[]scoreDoc=topDocs.scoreDocs;for(ScoreDocsd:scoreDoc){Documentdoc=searcher.doc(sd.doc);
4.4聊天机器人knowledge.setId(doc.getField(“id”).numericValue().intValue());knowledge.setQuestion(doc.get(“question”));knowledge.setAnswer(doc.get(“answer”));knowledge.setCategory(doc.getField(“catagory”).numericValue().intValue());}}reader.close();directory.close();}catch(Exceptione){knowledge=null;e.printStackTrace();}returnknowledge;}//聊天方法(根据question返回answer)publicstaticStringchat(StringopenId,StringcreateTime,Stringquestion){Stringanswer=null;intchatCategory=0;Knowledgeknowledge=searchIndex(question);//找到匹配项if(null!=knowledge){//笑话if(2==knowledge.getCategory()){answer=MySQLUtil.getJoke();chatCategory=2;}//上下文elseif(3==knowledge.getCategory()){//判断上一次的聊天类别intcategory=MySQLUtil.getLastCategory(openId);//如果是笑话,本次继续回复笑话给用户if(2==category){answer=MySQLUtil.getJoke();chatCategory=2;}else{answer=knowledge.getAnswer();chatCategory=knowledge.getCategory();}}//普通对话else{answer=knowledge.getAnswer();//如果答案唯恐,根据知识id从问答知识份表中随机获取一条if(“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 买羊购销合同范本
- 味多美工作合同范例
- 升降平台加工合同范本
- 厨房杂件采购合同范本
- 咨政课题申报书范文
- 吊扇购销合同范例
- 净菜供货合同范例
- 北京买房还是租房合同范例
- 品牌对接推广合同范本
- 中电投合同范本
- 安徽2025年安徽医科大学第一附属医院临床医技护理管理岗位招聘156人笔试历年参考题库附带答案详解
- 旅游景区股份合作开发协议书范本
- 2025年湖南有色金属职业技术学院单招职业技能测试题库汇编
- 2025年湖南信息职业技术学院单招职业技能测试题库参考答案
- 学情分析方案及学情分析报告范文
- 《CRISPR-Cas9及基因技术》课件
- 《急性冠状动脉综合征》课件
- 【博观研究院】2025年跨境进口保健品市场分析报告
- 游戏直播平台推广合作协议
- 《高科技服装与面料》课件
- 《马克思生平故事》课件
评论
0/150
提交评论