如何最大化利用UNIT的特性进行开发 Impulse干货系列:2.如何让UNIT快速学习
goJhou 发布于2017-08 浏览:2614 回复:1
2
收藏

 那欢迎各位看我的贴子,我是Impulse. 大家好

 本干货系列教程,所有最终的目的是与C#进行交互,而不是单纯使用UNIT,所以在以后的帖子中,可能会涉及到除UNIT以外的服务。

 我在UNIT的摸索学习中,有一些小经验可以分享给大家

 之后可能会时不时写干货给大家,如果能帮助到大家开发了,我也会感到很愉快

 话不多说,我们开始吧


上一节我们讲到了如何合理的设置对话单元

上一节传送门:http://developer.baidu.com/forum/topic/show?topicId=242208


这一节,我们就要开始UNIT比较核心的部分了---意图识别与校正

只有教会了UNIT,如何分析用户话语中的意图。最后的UNIT才是最智慧的。

一、对话样本集训练

  在我们进行了对话单元后,我们应该将一些生活中最平常语气和有时候出现的语句,以及很少说的语句,尽可能的补全,让UNIT学习到每种情况的应对方式。

  例如:在打开设备意图下,我们可能会出现以下的例句

  开灯

  开卧室的灯

  开厨房的电风扇

  帮我把卧室的灯打开,谢谢 

  把我的五彩神灯打开!

  急急如律令,神灯听我令,开!

 

  那以上就有正常人型,客气型,还有蛇精病型。我们要做的,就是尽可能的收集这样的句子   

那目前UNIT并没有推出相关的,调用接口时的query(话语请求,也就是用户对UNIT发的话)记录,所以我们需要在前期有很严谨的遍历,以满足各个人群的语法特点。

否则在之后如果有用户说了UNIT不认识的语法,可能UNIT就会不指向,或有错误的意图指向

那对话样本集,是一个最直接的教给UNIT如何识别意图的   硬性设置。我们在通过text遍历所有的语法的时候,再丢到样本集导入时又要一个个一个补充词槽,这是很麻烦的事情,也是很耗时间的。

那么事实上,其实UNIT提供了在编写文档时手动指定词槽的编写方法,如下所示。

在以上的撰写中,我们将语句填在当前行第一个空,使用TAB符分割一行的多个参数,格式为如下所示:

句子[Tab符]意图名[Tab符]词槽A:该是词槽A的内容[Tab符]词槽B:xxxxxxxxxxxxx[回车符]


一行句子中不能有其他多余的符号,否则就识别不出啦!

完成撰写后请以UTF-8编码形式保存方可上传样本集

那因为我们在样本集中都标注了意图和词槽,只需要点一键确认

那这个样本集就标注完成啦。这样子是不是很方便很快捷呢???


那样本集所带来的好处就是,不同的人说同样的句子能带来相同的回馈,坏处就是,只能适用于正常人。

如果突然冒出个什么蛇精病说急急如律令而配置人员没想到的话,那就GG了是不是。


于是乎,UNIT便存在有对话模板集针对于不同的人群去配置(不知道官方是不是这么想的,我感觉应该差不多)


二、对话模板集训练

   那在模板集下有以下几个玩法给大家介绍一下

  一个是特征词,他可以预先定义一些特征词,特征词影响模板的调用,也可以作为模板优先的筛选,只有当匹配到特征词了才会继续匹配后续的模板。

 那我配置了以下几个简单的具有代表性特征词供大家参考理解特征词的作用。

那如果使用特征词去制作模板,不出现特征词的他也就不匹配模板了。这也是一种很方便的功能

可以用一系列特征词与词槽  制造几个模板,就可以泛化出上万句对话样本集(当然模板匹配到的样本集是不可见的)

那以下是我制作的一些模板,供大家参考一下基本的玩法。

[W:0-X]表示任意字符匹配,X代表长度。

那我在配置模板时用了一些自己的奇技淫巧。

例如,user_color是COLOR意图中独有的词槽,UNIT默认不具备独有词槽跳转意图的功能。我可以通过自己新建一条只针对color词槽的模板,就能智能匹配这些特别的意图了


模板有一个优先级的设定,虽然在我的模板集里并没有出什么差错,但希望各位在制作模板的时候要考虑好优先级,否则会出现一些错误的特殊情况


那么在你完成了以上的诸多设定后,我们就可以开始让UNIT去学习了!(它会智能的通过样本集和模板进行泛化生成模型)

进入训练与验证界面  训练并生效新模型

等待数分钟后,我们的模型就训练完成了。

当训练进度已生效 并且上侧的 状态为启动成功时,我们就可以开始测试实际使用效果了!(不知不觉都49个版本了)

之后就可以在左侧的对话框中,去调教你家的UNIT bot了!


可以看到,他能比较智能的反馈给c#该执行什么函数,并且该使用到的参数(词槽)。

那目前这个模板调用意图的功能是存在BUG的。

开发组给我的答复是下个版本上线时会修复,所以这里需要注意一下


看过我上一章的同学,应该知道,我在词槽的词典中大量使用了归一的做法去做,那这里归一的效果为什么没有体现出来呢?

答案是它其实已经体现出来了

拍黑板!!!这里也是个重点!!!!

在做有归一的词槽中,返回的json要注意使用哪个。

original_word代表着用户输入的词槽(根据模板或样本集抓得的词槽)

那经过UNIT内置的一个归一模块识别后 normalized_word  为归一后的词  

我们在后期的C#使用中,应大量以normalized_word为标准进行匹配参数。

左为亮度百分比归一到整数

左为颜色返回成响应RGB数值


   那么这节课,我说到了很多东西,这些都能很好的为我们C#之后的调用提供了很大的便利性。


希望对各位有所帮助和启发。如果有更好的建议,随时欢迎跟贴喔!!!

收藏
点赞
2
个赞
共1条回复 最后由goJhou回复于2017-08
#2goJhou回复于2017-08

那如果出现发出的话语和真正想实现的意图不一样时,可以通过@命令来进行修正。

训练后的任何变更(包括词槽,词典,样本集,模板集),都需要重新训练才能生效。

所以请尽量发现多一点,一次性训练比较提高效率

如何提高自己UNIT模型的智慧度

可以参考:http://developer.baidu.com/forum/topic/show?topicId=241620

这个比较烦,一下子生成一千多条,一条一条标注简直炸锅(我标了200条左右就放弃了)

0
TOP
切换版块