文章目录
一、对话系统概述
对话系统在电商、银行等业务场景中应用很广。从框架方面,对话系统可以分为问答系统与多轮对话系统。
二、对话系统的分类及其对应得解决方案
对话系统的分类如下:
-
闲聊式对话系统
目前,市面上闲聊机器人的解决方案baseline是基于seq2seq+Attention;同时,加入一些可控性(基于输入内容给与回复),比如:加入情感与意图;当然,也可以加入历史信息(context)
闲聊式对话系统的关键技术:
其模型设计为
基于输入会识别情感,基于情感会进行embedding,融入到decoder中,帮助我们decoder。那么如何利用情感来控制decoder呢?下面有两种解决方案:- 将训练集人每一句话人工标记情感(通过预训练情感模型来进行预测,人工打标针对机器不能识别的),训练时,decoder的第一个token加入情感标签,然后再进行生成;在预测时,通过意图识别做一个classification,识别是什么情感,然后在decoder的第一步输入的是情感。
- 第二种解决方案是学习一个可以表征情感的embedding,在每一次做decoder时,每一个time step,将表征情感的embedding向量与context vector拼接后再与上一步的输出 y t − 1 y_{t-1} yt−1输入到下一时间步。
-
检索式对话系统
人工整理QA对,存储到数据库中,
当你进行提问时,会将输入问题与数据库中的问题计算相似度,找到最相似问题,返回最相似问题对应的答案。
检索式对话系统的关键技术:- 将输入问句进行文本表征
将输入句子进行分词,通过预训练模型(word2vec、bert、elmo、GPT)得到每一个token的embedding,针对一句话的embedding进行平均(加权平均)得到句子向量表征 - 粗排recall—BM25
从数据库中得到候选问句(速度比较快,查全率);比如:从数据库(10000个问题)中找出100个相似问题,要求速度很快 - 精排(ranking)
在候选问句的基础上进行精确匹配(查准率),从召回的数据中进行ranking,召回会利用简单的模型,要求速度快;精排会利用复杂的模型(word embedding)。精排后返回top3的问题,之后需要通过阈值(相似度大于0.5)或者分类模型来决定是否输出答案 - 返回答案
检索系统(elastic search)
检索式对话系统—相似度计算- Jaccard相似度(求交集)
- Dot preduct(点乘)
- cosine similarity(余弦相似度)
余弦相似度与点乘相比,做了归一化,是计算文本相似度最常用的方式 - WMD(word Move Distance)
WMD (Word Mover’s Distance) 算法
在利用WMD计算两条文本的相似度时,会进行以下步骤:- 利用word2vec将词编码成词向量
- 去掉停用词
- 计算出每个词在文本中所占权重,一般用词频来表示
- 对于每个词,找到另一条文本中的词,确定移动多少到这个词上。如果两个词语义比较相近,可以全部移动或移动多一些。如果语义差异较大,可以少移动或者不移动。用词向量距离与移动的多少相乘就是两个词的转移代价
- 保证全局的转移代价加和是最小的
- 文本1的词需要全部移出,文本2的词需要全部移入
- 模型判断
将输入问题与最相似问题进行拼接,标签为1,其余的标签为0,通过神经网络模型,可以得到相似度
- 将输入问句进行文本表征
-
知识问答式对话系统
nl2sql:分类+抽取(命名实体)+槽填充 -
任务式对话系统
业界落地较多的是任务式对话系统,比如说订机票、订外卖、订闹钟等任务。
三、检索及倒排索引
检索(infomation retrieval)指的是从大规模非结构化数据的集合中找出满足用户信息需求的资料的过程。
如果事先通过非线性扫描方式,给文档建立文档关联矩阵(词项与文档的共现矩阵),当碰到更大数据集时,占用空间会非常的大,矩阵也非常系数,此时,就需要倒排索引。倒排索引用来缩小计算搜索的范围。倒排索引针对每一个词项,存储所有包含这个词项的文档的列表,文档列表由文档的序列号docID来组成。应当使用可变长度的记录列表(动态数组或者链表),并且,每一个文档列表按照docID排列。倒排索引就是利用词项(key)与该词项对应的文档列表(value)来构建词项字典。
举个例子:
利用分离双指针寻找交集,时间复杂度为O(m+n)
四、召回
下面介绍BM25—基于字符级别的召回,当数量很大时,还需要倒排索引。BM25是一种用来评价搜索词和文档之间相关性的算法,它是一种基于概率检索模型提出的算法:有一个query和一批文档Ds,现在计算query和每篇文档D之间的相关性,先对query进行切分(分词),得到单词 q i q_i qi,然后单词由3部分组成:
-
每个单词的权重
N表示所有文档的数目, n ( q i ) n(q_i) n(qi)包含了单词 q i q_i qi的文档数目。
I D F ( q i ) = l o g ( N − n ( q i ) + 0.5 n ( q i ) + 0.5 ) IDF(q_i)=log(\frac{N-n(q_i)+0.5}{n(q_i)+0.5}) IDF(qi)=log(n(qi