Chatbot中的填槽(Slot Filling)(转)
以下内容是学习了@我偏笑发布在公众号hanniman文章后,加上自己观点重新输出配图的文章
原文链接:http://t.cn/RE0FkgD
跳槽,吐槽,匹诺曹都听过,这个填槽,emmmm,黑人问号脸???
写到这吐槽下,本来只是想写下填槽的过程,后来发现这东西不理解chatbot的对话系统的话,没法讲,看的人很容易一头雾水。
还是先简单讲下对话系统,然后再细讲填槽。
所以不知道填槽是啥往下没事,先往下看。
一、Chatbot对话系统的过程
对话系统还有很多要讲,但是今天的主角是填槽,所以初略过下。
首先,来看一个老奶奶和机器人的对话

我们来细致拆解下整个过程。
1)开放域多轮对话

这里引入一个概念——开放域对话
不太严谨的定义可以理解为 ,在不确定用户意图前的各种瞎聊,你不知道用户会问什么样千奇百怪的问题,但是chatbot都能接住,然后和用户进行对话,这种就是开放域的对话。
这里奶奶说“天气不错”,实际machine是不知道奶奶要干什么的,于是为了避免尴尬,让对话能继续下去,machine就要制造话题啦,这里machine回复了“适合去市区走走”,制造了一个新话题出来。
即使在开放域聊天的过程中,也存在着填槽的过程。
好了,引出本文主角——填槽(Slot filling)。
填槽指的是为了让用户意图转化为用户明确的指令而补全信息的过程。
例如在之前文章中提及的小爱的例子

设定闹钟这个行为,需要两个关键信息,一个是行为,一个是时间。
这两个信息可以理解为“设闹钟”行为的前置条件,就好像事有个槽空缺在那,需要先补充完整了这个槽,完成这个条件后,触发新的副本,才能继续后续的行为。
继续回来“和奶奶对话”的例子中,即使是在开放域对话过程中,用户和你聊天的内容,有一些是之后用的上的,例如对话中machine回复的“是的,奶奶”
这个“奶奶”也是一个槽,是用户称呼的槽,只不过这个槽在之前的对话中已经填过了,然后machine就一直使用。
总之,记住在没明确意图前的聊天可以看做是开放域的对话,开放域对话中也能填槽。
2)准入条件

紧接着,奶奶说天气很好,想出去走走,“帮我叫个车!”
然后话风一改,machine不再瞎聊了,直接问了一句“奶奶打算几点出发?”
machine问奶奶出发时间的时候,实际已经是转入了一个封闭域对话(具体概念下面再解释)了,从开放域转入到封闭域,中间隔着的就是准入条件了。
介绍本文的第三个概念——准入条件
从一个开放域转入到封闭域,或者从一个封闭域转入到另一个封闭域,中间的跳转是需要逻辑判断的,而这个逻辑判断就是准入条件。
当满足了准入条件后即可进入到对应的封闭域对话中,如果把封闭域对话理解为一个大门的话,那么准入条件就是钥匙啦,通过这个钥匙进入到封闭域内。
准入条件的构成由条件组和条件构成

准入条件通过条件组和条件形成了一套与或非
- 条件组和条件组是或关系
- 条件组内的条件是与的关系
- 条件本身可以是非的关系
所以,machine通过识别出有一个条件组是“用户叫车”的条件组,所以进入了用户叫车的封闭域对话中。
3)封闭域多轮对话

因为满足了准入条件,所以machine进入了叫车的封闭域对话
本文第四个概念——封闭域对话
封闭域对话是指识别用户意图后,为了明确用户目的(或者称为明确任务细节)而进行的对话
封闭域对话有很明显的两个特征
1. 输入和输出是可枚举的
例如和奶奶对话这个case中
打车必须的必填的input有3个(这3个也是槽位,需要填槽),output是两个结果,成功或失败

2. 对话有明确的目的,且有流程
在和奶奶的对话过程中,由于必填的槽有三个
其中出发时间并不知道,所以machine接着问了“奶奶打算几点出发?”
这个过程称之为澄清话术
当用户的需求中缺乏一些必要条件时,需要对话系统主动发问,把必要条件全部集齐之后再去做最终的满足执行。
这里的必要条件就是时间槽还没有填充,后续的选择快车还是顺风车也是一种澄清。
如果把打车简化为三个槽的话,那么填槽过程如下

大家会发现,machine并没有问奶奶从哪里出发地点,因为可能在历史的对话中已经获取到了奶奶的住址,或者通过GPS定位,也能获取到出发点,这时候就没有必要再问奶奶了。
最终响应结果,machine跑去滴滴下单,成功后回来告诉奶奶“好的,已为您预约了宝安中心到深圳湾公园9点的滴滴顺风车。”
以上就是整个对话系统的流程
1. 开放域多轮对话,瞎聊,识别用户意图
2. 准入条件,根据设定好的准入条件,进入封闭域对话
3. 封闭域对话,填槽,必填槽不完整就要澄清让用户填完整,最终执行
二、细讲填槽
通过上述的例子,明白了对话过程,接着细讲下填槽这件事情。
1)槽
1. 定义
上文中我们提到了填槽指为了让用户意图转化为用户明确的指令而补全信息的过程
填槽的专业表述:从大规模的语料库中抽取给定实体(query)的被明确定义的属性(slot types)的值(slot fillers)——网络文章定义
所以这里槽可以理解为
实体已明确定义的属性
例如打车中的,出发地点槽,目的地槽,出发时间槽中的属性分别是“出发地点”、“目的地”和“出发时间”
2. 槽与槽位
槽是由槽位构成的,举个例子
出发地点槽,是打车必填的,要填充这个槽,可以通过历史对话取得值,也可以通过询问用户取得值,还可以通过GPS定位取得值等等。
这里的必填是槽的属性,而不同的取值方式是不同槽位的属性

先来讲讲槽的属性
3. 槽的属性:可默认填写/不可默认填写
有些槽是不可默认填写的,不填没办法继续下去,有些即使不填,有默认值也可。
例如machine在刚开始和你对话的时候,称呼你为“主人”,但你觉得不够逼格,于是你让他叫你“女王大人”。
这里的用户昵称槽就是用户没有指定,可默认填写的
4. 槽的属性: 澄清话术
当槽不可默认填写同时又没有填写的时候,就要进行澄清
为了澄清而表达的内容,就是澄清话术
不同槽的澄清话术不同,例如打车三槽中,目的地的澄清话术可能是“请告诉我您的目的地”,而出发时间的槽可能是“请告诉我您的出发时间”
5. 槽的属性:澄清顺序
当有多个槽需要澄清的时候,就存在先后顺序的问题,所以需要一个澄清顺序,先问什么,再问什么。
6. 槽的属性:平级槽或依赖槽
根据槽和槽之间是否独立,后续的槽是否依赖前面槽的结果。
可以将槽之间的关系分为
- 平级槽,槽与槽之间没有依赖,例如打车中的三槽
- 依赖槽,后续的槽是否依赖前面槽的结果,例如手机号码槽,不同国家手机号码格式不同(槽的属性不同),所以国家槽会影响选择哪个手机号码槽。
7. 槽的能力:多轮记忆状态
槽还有记忆的能力,先再看个例子

这里Julian先要预约打车,进入封闭域A,machine进行打车填槽
槽内已经填充了2个信息。
出发地:西丽
目的地:空(缺乏)
时间:明天上午9点30分
machine进行澄清,要求填槽目的地。
但是这时候突然Julian要求设定提醒事件,machine响应设定提醒事件。
Julian再继续回到原有的打车事件中,仅说了目的地,machine没有再次询问出发地和时间,直接完成打车填槽。
这里所使用的就是多轮记忆状态,它能在对话的过程中,在被打断回到之前的封闭域对话后,能记住原有填槽的内容,减少重复填槽。
2)槽位
上面我们提到槽是由槽位构成的,一个槽位就是一种填槽的方式
1. 槽位的属性:接口槽与词槽
- 词槽,通过用户对话的关键词获取信息的填槽方式
- 接口槽,通过其他方式获取信息的填槽方式
2. 槽位的属性:槽位优先级
当有多个槽位的时候,槽该采用那个信息,这时候有个优先级。
还是之前的出发地点槽,如果用户通过词槽指定了出发地点是A,优先级就应该是最高的,其次才是通过不同的接口槽获取的B,C等
---------------------
本文来自 mishidemudong 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u010159842/article/details/80759428?utm_source=copy
转自:https://blog.csdn.net/u010159842/article/details/80759428
Chatbot中的填槽(Slot Filling)(转)的更多相关文章
- Qt5中的信号槽
Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...
- qt信号signal和槽slot机制
内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...
- Qt 5中信号和槽的新语法
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...
- QT_5_ Qt中信号和槽 + 自定义信号和槽 + lambda 表达式
1.Qt中信号和槽 1.1 需求:点击按钮关闭窗口 1.2 利用connect进行链接 1.3 参数1 信号发送者(指针) 参数2 发送的信号(信号地址) 参数3 信号的接受者(指针) 参数4 处理槽 ...
- 自己用纯C++实现简单的QT中信号与槽机制
前天在我很久以前的一篇博文 (http://blog.csdn.net/liukang325/article/details/45742675) 中有人回复说看到我的博文很激动,希望我详细介绍一下信号 ...
- Qt中信号(signal)和槽(slot)的几种关联方法
声明,个人总结,不一定正确! 1.最常见的,使用connect语句.比如:connect(btnSend,SIGNAL(clicked()),this,SLOT(clear()); 2.在 .ui设计 ...
- qt5中信号和槽的新语法
qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...
- qt中信号与槽机制
一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...
- Qt在多线程中使用信号槽的示例
之前对线程理解得不深入,所以对Qt的线程机制没有搞清楚,今天写一篇文章总结一下,如有错误,欢迎指出. 首先需要理解线程是什么,线程在代码中的表现其实就是一个函数,只不过这个函数和主线程的函数同时运行, ...
随机推荐
- 深入理解Apache Flink
Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注.本文将深入分析Flink的一些关键技术与特性,希望能够帮 ...
- C#的两种类据类型:值类型和引用类型
注:引用类型相等赋值是地址赋值,不是值赋值. 什么是值类型,什么是引用类型 概念:值类型直接存储其值,而引用类型存储对其值的引用.部署:托管堆上部署了所有引用类型. 引用类型:基类为Objcet 值类 ...
- sql server与C#中的字符串相等等效写法
sql server两个字段相等判断默认不区分大小写,并且字符串进行Unicode规范化处理. 等效c#中的相等为s=="字符".ToLower().Normalize(Syste ...
- 基于Linux命令行KVM虚拟机的安装配置与基本使用
背景 由于生产环境的服务器并不会安装桌面环境,简单操作的图形化安装也不适合批量部署安装.因此,我还是更倾向于在命令下安装配置KVM虚拟机.结合了一些资料和个人使用的状况,我大致列出了一些基本和常用的使 ...
- NIO读写文件并加锁
一.读取文件 package lock; import java.io.File; import java.io.FileNotFoundException; import java.io.IOExc ...
- QNetworkAccessManager post()和get()方法
GET方式提交的数据最多只能有1024字节,而POST则没有此限制. 大文件传输用post(),小文件用get(), 第一次接触Qt的Http项目,今天看了一下Post和Get的基本使用方法,就开始尝 ...
- Jquery在表格中搜索关键字
<!DOCTYPE html><html><head> <title>ddd</title></head><body> ...
- 数电——全减器分析(用74HC138设计提示)
-1=1(即Di=1). Di=(Y1' * Y2' * Y4' * Y7')'可以得到74HC138来表示,(注意:Ai,Bi,Ci-1的各自位权对应A2,A1,A0) Ci同理可得.
- Photoshop 辅助线和标尺的使用技巧
1.拖动辅助线时按住Alt键可以在水平辅助线和垂直辅助线之间切换.按住Alt键点击一条已经存在的垂直辅助线可以把它转为水平辅助线,反之亦然. 注意:辅助线是通过从标尺中拖出而建立的,所以要确保标尺是打 ...
- c# group by list
ViewBag.PnlTotal = pnlTotal; // 柱形图 string data = ""; string cat = ""; string bu ...