在比较两个文本语义是否相同的时候,通常的做法是
- 使用传统方法:one-hot word vector -> tf-idf/BM25 加权 -> 使用欧式距离或者cosine相似系数
- 使用深度学习方法:
a. 得到词的embedding,对词的embedding做(加权)平均得到句子向量,再用度量方法;
b. 借助深度模型得到句子的embedding,在句子语义层面上使用度量方法。
下面主要讨论深度学习中除欧式距离和cosine相似系数的一些度量方法
主要参考自: Wang S, Jiang J. A compare-aggregate model for matching text sequences[J]. arXiv preprint arXiv:1611.01747, 2016.
这篇论文解决的问题是句子匹配任务, 作者搭建了一个模型,并且重点比较了几种相似度度量方法
先大致说一下这个模型,感兴趣的可以看原文和相关分析,分为四个步骤:
- Preprocess, 对原始的问题和答案进行预处理,使每个词获得句子的上下文信息,使用的是只保留了输入门的lstm;
- Attention, 传统的attention机制,用问题对答案加attention
- Comparison,整合,用于比较相似度
- Aggregation,结合CNN,构建输出网络
下面主要说一下两个vector的整合方式:
-
NN: 就是将两个向量拼接起来,然后过一层神经网络;
-
Euc+Cos: 计算两个向量的欧式距离以及它们的余弦相似度,再把两者的结果拼接起来。
-
Sub/Mult : 两个向量按位减后乘或者直接相乘
-
Sub/Mult + NN:在3的基础上将二者拼起来,接一个NN
NTN: neural tensor network,张量网络,能比较好的获得词向量间交叉乘积的能力,不过还是element-wise,具体原理可以参考Quora上的回答和论文原文
得到的是一个L维的向量,类似于CNN的filter可以定义多个,这里可以理解成定义了多个相乘关系。
实验结果:
可以看到这篇文章的模型在三个数据集上取得了非常好的结果,其中element-wise multiplication相关的方式是比较好的comparison function,比我们之前常用的余弦相似度,欧氏距离等要高出不少。