词嵌入在NLP领域已经很流行了,它可以让我们很简单地计算两个单词的相似度,或者去找到一个目标词最相似的词,然而,我们对两个长的句子或短文本相似度更感兴趣。在这篇博客中,我们比较最流行的方法计算句子相似度,研究他们的表现.代码链接
很多NLP应用需要计算短文本在语义层面的相似度。比如搜索引擎,需要对文档的关联性建模去查找,而不是根据句子的重叠单词。问答网站,比如quora,需要去决定一 个问题是否之前已经被问过,这种类型的语义相似度经常通常先得到两个短文本的embedding,然后计算他们的余弦相似度,尽管word2vec和glove已经变成标准的单词相似度计算方法了,但是目前仍然没有一致的意见在句子embedding计算的问题上,接下来,我们会回顾一些最流行的方法并比较他们的表现在两个已经建立的基准线上。
数据集
我们会评估所有的方法在两个广泛使用的数据集上和人类的相似度判断能力。
- STS Benchmark 在 句子相似度任务在2012-2017
- SICK data 包涵10000个英语句子对,标注了它们的语义相关性和蕴含关系
基准线
最简单的方法去计算语义相似度是计算两个句子中所有词向量的平均,然后计算两个向量的cosine,很明显,这种baseline留出了很大的改进空间,我们将研究去除停用词的影响,和计算tf-idf加权平均值。
Word Mover Distance
一个有趣的替代基准线就是单词移动距离 --词向量的欧式距离
平滑逆频率
从语义上来讲,采用单词词词向量的平均值容易给不相关单词太多的权重。平滑逆频率尝试解决这个问题从两个方面:
- 每个词的权重被加权a/(a + p(w)) a是一个参数被设置为0.01,p(w)是一个估计的频率
- 常见成分的去除,SIF计算出句子中结果向量的重要成分,然后减去这些句子中他们在第一个主成分方向的投影。这样可以消除那些从语义上将不相关的词。
总之,SIF降低不重要词的权重,保留重要的信息。
预训练编码器
所有上述的方法都拥有两个重要的特点。首先,作为词袋模型,他们没有考虑到词序。其次,他们使用的词嵌入已经被学习通过词嵌入的方式。这两个特点都是潜在存在问题的。因为不同的词序往往带来不同的句意。比如,狗咬人和人咬狗有不同的意思,我们应该让我们的句向量体现出这种变化。另外,监督学习可以帮句子可以帮助句子向量更好的学到句子的含义。
这就是预训练编码器的用武之地。
- facebook 的InferSent:它是一个BiLSTM加max pooling,训练在57万个句子对上,标签是三种关系:蕴含,矛盾,中立。
- 谷歌:transformer模型 DAN
结论
句子相似度是一个复杂的现象,句子的意思不仅取决于它包含的单词,还依赖于他们组织的方式。句子相似问题可能有几个维度,句子可能在一个维度相似,另外的维度相反,当前的句嵌入方法可能只触及了其表面。
经验:
- word2vec 可能比glove更安全。
- SIF更好
- 选用谷歌 的句子编码器更好