python 两个word文档之间的相似度_如何用 word2vec 计算两个句子之间的相似度?

现在是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

你可能感兴趣的:(python,两个word文档之间的相似度)