赞
踩
本人由于前段时间参加了讯飞中文重复问题识别挑战赛,对文本匹配这个方向做一下简单的梳理,方便参考学习以及面试。
短文本匹配即计算两个短文本的相似度,通常分成无监督方式、有监督方式、有监督+无监督方式
考虑文本表征和相似度计算两个方面
文本表征:词袋模型(one-hot 、TF)、词向量预训练(word2vector、fasttext、glove)
相似度计算:余弦相似度、曼哈顿距离、欧氏距离、jaccard距离(某个公司的笔试考过公式)等
常用做法是通过word2vec等预训练模型得到词向量,然后对文本做分词,通过embedding_lookup得到每个token对应的词向量,然后得到短文本的句向量。对两个文本的句子向量采用相似度计算方法如余弦相似度、曼哈顿距离、欧氏距离等。无监督方式取得的结果取决于预训练词向量的效果。
对Query进行语素解析,生成语素qi。对于每个搜索结果D,计算每个语素qi与D的相关性得分,最后将qi相对于D的相关性得分进行加权求和,从而得到Query与D的相关性得分。
公式一般如下:
Q表示Query,qi即Q分词后的每一个解析语素(对中文而言,我们可以把对Query的分词作为语素分析,每个词看成语素qi)。d表示一个搜索结果文档,Wi表示语素qi的权重,R(qi,d)表示语素qi与文档d的相关性得分。
判断一个词与一个文档的相关性的权重定义Wi方法有多种,较常用的是IDF。公式如下:
N为索引中的全部文档数,n(qi)为包含了qi的文档数。
根据IDF的定义可以看出当很多文档都包含了qi时,qi的区分度就不高,因此使用qi来判断相关性时的重要度就较低。
求R(qi,d)具体的公式可以参考文本相似度-BM25算法
在做文本匹配的时候(如重复问题检测)可以尝试BM25的方法,但在搜索领域中,有时候搜索query和候选文档的长度是不一样甚至差距很大,所以BM25在计算相似性的时候需要对文档长度做一定的处理。
孪生体现在使用相同的编码器(sentence encoder),将文本转为高维向量。具体步骤为,有文本A和文本B分别输入 sentence encoder 进行特征提取和编码,将输入映射到新的空间得到特征向量u和v;最终通过u、v的拼接组合,经过下游网络来计算文本A和B的相似性。
在上述孪生网络的基础上,得到特征u、v但是不直接计算向量相似度,而是通过注意力机制将两个文本进行信息交互,最后通过全连接层得到相似度。
代表的模型有ESIM,BIMPM等
以ESIM为例
第一阶段,使用通用的预料库训练语言模型,然后第二阶段预训练的语言模型(BERT相关衍生的模型)做相似度任务,得到信息交互后的向量,然后连接全连接层,输出概率。即将两个短文本拼接(CLS A1 A2 … A 10 SEP B1 B2 … B10 SEP),然后CLS向量连接全连接层,判断相似与否。
这种模型参数多,并且使用了通用的语料库,能够获取到短文本之间隐藏的交互信息,效果较好。
题外话:感觉用拼接的方法类似“单塔”,孪生网络的方法类似“双塔”
无监督:直接相加得到句向量,不能很好的表达语义信息,并且词的位置信息没有得到体现,也不包含上下文的语义信息。
有监督学习:时间复杂度太高。可以将标准库中的句向量计算完成并存储。新的文本来临时,只需要解决用户问题即可,然后与存储在库中的标准问句进行距离度量。
可以使用BERT代替孪生网络的CNN或LSTM结构,获取更多语义信息的句向量,还可以通过蒸馏降低BERT模型的参数,节约时间成本。
文章链接:https://arxiv.org/pdf/1908.10084.pdf
论文代码:https://github.com/UKPLab/
为了让BERT更好地利用文本信息,作者们在论文中提出了如下的SBERT模型。SBERT沿用了孪生网络的结构,文本Encoder部分用同一个BERT来处理。之后,作者分别实验了CLS-token和2种池化策略(Avg-Pooling、Mean-Pooling),对Bert输出的字向量进一步特征提取、压缩,得到u、v。
关于u、v整合,作者提供了3种策略:
使用NLI和STS为代表的匹配数据集,在分类目标函数训练时,作者测试了不同的整合策略,结果显示“(u, v, |u-v|)”的组合效果最好。这里面最重要的部分是元素差:(|u - v|)。句向量之间的差异度量了两个句子嵌入维度间的距离,确保相似的pair更近,不同的pair更远。
有用的文章参考链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。