现在是2018年7月,在这里总结这个问题下已有的答案,并补充一些2017年以来这方面研究的新进展。
从大类上分,计算句子相似度的方法可以分为两类:
1)无监督的方法,即不使用额外的标注数据,常用的方法有:
(1)对句子中所有词的word vector求平均,获得sentence embedding
(2)以每个词的tf-idf为权重,对所有词的word vector加权平均,获得sentence embedding
(3)以smooth inverse frequency[1](简称SIF)为权重,对所有词的word vector加权平均,最后从中减掉principal component,得到sentence embedding
(4)通过Word Mover’s Distance[2](简称WMD),直接度量句子之间的相似度
2)有监督的方法,需要额外的标注数据,常见的有监督任务有:
(1)分类任务,例如训练一个CNN的文本分类器[3],取最后一个hidden layer的输出作为sentence embedding,其实就是取分类器的前几层作为预训练的encoder
(2)sentence pair的等价性/等义性判定([4][5]),这种方法的好处是不仅可以得到sentence embedding,还可以直接学习到距离度量函数里的参数
Yves Peirsman的这篇博客[6]里比较了常见方法在计算句子相似句上的效果:
从图中可以看到在这几个评估数据上:
1)WMD方法(WMD-W2V)相对于其他无监督方法并没有明显的优势
2)简单加权的词向量平均(AVG-W2V和AVG-W2V-TFIDF)已经可以作为一个较好的baseline,但是考虑SIF加权的词向量平均(SIF-W2V)通常可以得到更好的效果
3)这里比较了两种预训练的encoder(InferSent/INF和Google's Sentence Encoder/GSE),相对而言GSE效果更好一些,但要注意它的性能并不一定在所有的数据集上都稳定
另外,从实践中的经验来看,如果要在无标注的数据上从零开始实现相似度的计算,可以综合几种方法来得到更好的效果。一种可能的步骤如下:
1)使用某种无监督方法,对于句子集合做简单归类和标注
2)通过1中得到的标注数据,训练分类模型或者句子对模型,从而得到相似度模型
3)评估模型效果,适当引入新的标注数据,重复步骤1)2)
Reference:
[1] Sanjeev Arora, et al. 2017. A Simple but Tough-to-Beat Baseline for Sentence Embeddings
[2] Matt J. Kusner, et al. 2015. From Word Embeddings To Document Distances
[3] Yoon Kim. 2014. Convolutional Neural Networks for Sentence Classification
[4] Jonas Mueller, et al. 2016. Siamese Recurrent Architectures for Learning Sentence Similarity
[5] Paul Neculoiu, et al. 2016. Learning Text Similarity with Siamese Recurrent Networks
[6] Yves Peirsman. 2018. Comparing Sentence Similarity Methods