文本匹配任务
狭义上讲
给定一组文本,判断其是否语义相似
比如
今天天气不错 match 今儿个天不错呀 √
今天天气不错 match 你的代码有bug ×
又或者以分值形式给出相似度
今天天气不错 match 今儿个天气不错呀 0.9
今天天气不错 match 这几天天气不错 0.7
今天天气不错 match 你的代码有bug 0.1
广义上讲
给定一组文本,计算某种自定义的关联度
Natural Language inference
两句话判断是否有关联,矛盾,中立
明天要下雨vs 明天大晴天
Text Entailment
给出一段文本,和一个假设,判断文本是否能支持或反驳这个假设
主题判断
文章标题匹配内容等
文本匹配的应用
问答对话:
车载导航,聊天机器人,手机助手,智能音箱,智能客服
信息检索:
在浏览器能搜到与自己输入的文本相关的内容
短文本vs短文本 知识库问答,聊天机器人等
短文本vs长文本 文章检索,广告推荐等
长文本vs长文本 新闻,文章的关联推荐等
以智能问答中的智能客服为例,说一下文本匹配在其中的应用
基础资源:
包括faq库,书籍文档,网页,知识图谱等
问答系统:
对基础资源进行了加工处理,形成问答所需要索引和模型等
用户输入问题
问答系统给出答案
依照基础资源划分:
1. 基于faq知识库的问答
2. 基于文档/网页的书籍的问答
3. 基于图像/视频的问答
4. 基于知识图谱的问答
5. 基于表格的问答
6. 基于特定领域知识的问答
7. 基于人工规则的问答
依照答案产出方式划分
1.检索式的问答
答案原文或答案的多个片段存在于基础资源中
2.生成式的问答
答案文本不存在于基础资源,由问答系统来生成答案
3.二者结合
依照nlp相关技术划分
1. 单轮问答 每次用户提一个问题,都当作一个新的问题
2. 多轮问答 这个就是允许用户进行追问
3. 多语种问答
4. 事实性问答 比如 问姚明身高多少 就是一个定论
5. 开放性问答 比如 问姚明的地位 这个就是各有各的分析
6. 多模态问答 比如在问答场景,用户问你一张照片
7. 选择性问答 多个选一个的问答方式
8. 抽取式问答
9. 生成式问答
智能客服的价值
相比于人工客服的优势:
毫秒级响应
全年24小时在线
精通所有业务知识
只需培养管理员
保存所有业务回答数据
回复内容标准
Faq知识库问答
比如我的货还没到 ,那么我是找售后服务,还是配送查询,还是订单查询,都有道理,那么用户的体验感极差。
列表展示所有常见问题,用户需要自己找到对应的问题,对用户不友好
算法检索就可以避免这样让用户查找,而是根据用户提出query,直接给出答案
那么就让用户以自然语言描述自己的问题,算法进行fap库的检索,给出对应的答案
然后接下来先介绍一下相关名词:
问答对 :
一个(或多个相似的)问题与它对应的答案
faq库/知识库
很多问答对组成的集合
标准问
每组问答对中的问题,有多个时,为其中代表
相似问/扩展问
问答对中,标准问之外的其他问题
用户问
用户输入的问题
知识加工
人工编辑faq库的过程,相似问生成,标准问聚类,意图层级构建等
Faq库示例
运行逻辑:
1. 对用户问进行预处理
2. 使用处理后的问题,与faq库中问题计算相似度
3. 按照相似度分值排序
4. 返回最相似问题对应的答案
算法核心:
语义相似度计算是faq问答的核心
一般简称文本匹配 f(x,y) -> score
相似度分值合理,才可以找到正确的对应问题
计算分值的同时,也要考虑速度
那么有个问题就是,我们可不可以不和Faq库中问题Q匹配,而是直接和答案A匹配呢?
理论上是可以的,但是答案不一定是文本,而是视频,又或者图片,所以一般不会与答案匹配
文本匹配算法-编辑距离
两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符
示例如下
插入 估计两个字 2次操作
把 今替换明,真换更,不换好 3次操作
把错给删了 1此操作
一共6次操作
similarity = 1 - EDab/(max(La,Lb))
在上面中,EDab 就是操作次数 所以是 EDab = 6
max(La,Lb) 则是两个句子最长的那一个 所以 max(La,Lb) = 7
所以经过计算 similarity = 1- 6/max(7,8) = 0.25
两个字符串完全一致,编辑距离 = 0,相似度 = 1
两个字符串完全不一致,编辑距离 = 较长者长度, 相似度 = 0
文本编辑距离的代码怎么实现
文本匹配算法-编辑距离-优缺分析
优点:
1. 可解释性强 公式较为简单,也比较符合直觉,因为对于非专业人士,相似度比较,就是看有多少个字不一样
2. 跨语种(甚至对于非语言序列)有效 比如 DNA相似度
3. 不需要训练模型
缺点:
1. 字符之间没有语义相似度
我没钱 俺没钱 0.66
2. 受无关词/停用词影响大
我要办卡 你好我需要办卡 者两句话就是表明一个意思,但是根据计算才0.5
3. 受语序影响大
今天天气不错 天气不错今天 0.33
4. 文本长度对速度影响很大
文本匹配算法- Jaccard相似度
通用表述: 根据两个集合,不同元素所占的比例,来衡量两个样本之间的相似度
用于文本匹配:根据两个文本中,不同的字或词所占的比例,来衡量两个文本之间的相似度
Jaccard相似度: J(A,B) = |A∩B| / |A∪B| 文本元素交集/文本元素的并集
今天天气真不错 公共字: 天,气
估计明天天气更好 总字数: (7-1)+(8-1)-2 =11
jaccard相似度: 2/11 = 0.18
也可以以词为单位计算
代码展示
如果输入字符串,则得到基于字的jaccard相似度
如果输入词的列表,则得到基于词的jaccard相似度
该用词还是该用字?看场景!
比如 我去 农行 取钱
我去 农业银行 取钱
这个情况就是应该用字了
文本匹配算法 - Jaccard距离 - 优缺分析
优点:
1. 语序不影响分数(词袋模型)
今天天气不错 天气今天不错 1
2. 实现简单,速度很快
3. 可跨语种,无序训练
缺点:
1.语序不影响分数
他打了我 我打了他 1 这个也是1,但是很明显这俩不是一个意思
2.字词之间没有相似度衡量
3.受无关此影响
4. 非一致文本可能出现满分
他是不知道 他不是不知道 这个也是1,但是表达的意思不同
文本匹配算法 -BM25算法(加强版TFIDF)
常用在搜索引擎框架中,用来做文档和搜索问题的匹配,同样也可以用在问答中,作文本匹配
核心思想:
假如一个词在某类文本(假设为A类)中出现次数很多,而在其他类别文本(非A类)出现很少,那么这个词是A类文本的重要词(高权重词)
恒星,黑洞 ---> 天文
反之,如果一个词在出现在很多领域,则其对于任意类别的重要性都很差
BM25是对TFIDF的一种改进,优化其表示效果
BM25公式: Score(Q,d) = 求和WiR(qi,d)
qi 为问题中某词,fi为词频k1,k2 ,b为可调节常数dl为文档长度
avgdl 为所以文档平均长度
这些参数和改动的意义在于控制文本长度对分值的影响
BM25记住思想即可
文本匹配算法-BM25算法-优缺分析
优点:
1.通过使用TF-IDF弱化了无关词的影响,强化了重要词的影响,使得效果大幅提升
2.统计模型计算块,不需要迭代
3.词袋模型,跨语种等
缺点:
1.依然没有考虑词与词之间的相似性
2. 需要一定的训练样本(faq库本身)
3.对于新增类别,需要重新计算统计模型
4.分值未归一化
文本匹配算法 -word2vec
如何用于文本匹配?
将文本中的所有词的词向量相加取平均这里可以用TFIDF结合,可以体现出句子中重要词特征
文本->句向量
句向量维度 = 词向量维度,不论文本长度
文本相似度 = 向量相似度 = 向量夹角余弦值
向量夹角为0,余弦值为1
文本匹配算法 - word2vec - 优缺分析
优点:
1.两个文本包含语义相似的词,会提高相似度
2.训练需要的数据简单(纯文本语料即可)
3.计算速度快,可以对知识库内问题预先计算向量我们可以先把知识库问题转换为向量,然后对于用户提出的问题转化为向量后,计算相似度
4.将文本转化为数字,使后续复杂模型称为可能
缺点:
1.词向量的效果决定句向量效果
2.一词多意的情况难以处理 梨-苹果-华为
3.受停用词和文本长度影响很大 像你好这种词
4.更换语种,甚至更换领域,都需要重新训练
文本匹配-深度学习
文本匹配任务上有两种主要方式:
1.表示型
这里可以理解为同样的Encode对两句话进行向量转化,然后送入匹配层计算相似度
表示型文本的训练方式
对于两个匹配的样本预期输出分值为1
对于两个匹配的样本预期输出分值为0
本质上相当于2分类任务
另外还有其他表示型
第二种训练方式,称为Triplet loss
训练目标:
使具有相同标签的样本在embedding空间尽量接近
使具有不同标签的样本的embedding空间尽量远离
保证在输入的3个样本中,有两个是相似的,一个不相似的
Triplet loss(还用于人脸识别模型的训练)
a: anchor 原点
p: positive 与a同一类别的样本
n: negative 与a不同类别的样本
L = max(d(a,p)-d(a,n)+margin,0)
margin的作用, 假如 d(a,p) =d(a,n) 那么loss=0,那么模型不会训练,那么当d(a,p)较大的时候,Loss等于0,模型不训练那显然不合理,margin会调节的作用
在人脸识别中的应用
2.交互型
这个交互性,就是把S1和S2一起送到模型产生交互,这俩是必须的,而上面表示型则是可以S1,S2,可以单独计算。
对比- 交互性vs表示型
表示型
优点: 训练好的模型可以对知识库内的问题计算向量,在实际查找过程中,只对输入文本做一次向量化
缺点: 在向量化的过程中不知道文本重点
交互性:
优点: 通过对比把握句子重点
缺点: 每次计算需要两个输入
对比学习
找到一种自监督方法训练得到一种好EnCoder
海量向量查找
假如我们有1亿以上的候选向量
(表示型)
对于一个给定向量,希望查找距离最接近的
问答,搜索,推荐等场景均会使用
我们会把海量向量存储到数据库,数据库会为向量设计一套索引,在你输入一个向量后,它会给你找出相似的
KD树与向量索引的原理相似,那么KD树是怎么做到不遍历所有向量能找到一个相似的
空间切割
假设有一点(3,5) 正常来讲它会跟所有的点都计算一遍,然后找到最近的,经过空间切割后,(3,5),,在(7,2)的时候,根据(7,2)的切割线x=7,可以知道在(7,2)的左侧,找到(5,4)同时根据的切割知道在y=4的上面,那么我们只需要算(4,7),(5,4),(2,3) 就行因为到(7,2)以及到x=7切割平面已经超过已知点的距离
那么怎么选中间点和切割平面?
通过计算中位数和方差,为什么先把(7,2)作为顶点,因为计算6个点的中位数,选(5,4)和(7,2)都行,切割平面看方差
