比较句子相似度方法
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
编者按:本文作者为Yves Peirsman,是NLP领域的专家。在这篇博文中,作者比较了各种计算句子相似度的方法,并了解它们是如何操作的。词嵌入(word embeddings)已经在自然语言处理领域广泛使用,它可以让我们轻易地计算两个词语之间的语义相似性,或者找出与目标词语最相似的词语。然而,人们关注更多的是两个句子或者短文之间的相似度。如果你对代码感兴趣,文中附有讲解细节的Jupyter Notebook地址。以下是论智的编译。 许多NLP应用需要计算两段短文之间的相似性。例如,搜索引擎需要建模,估计一份文本与提问问题之间的关联度,其中涉及到的并不只是看文字是否有重叠。与之相似的,类似 数据我们将在两个被广泛使用的数据集上测试所有相似度计算方法,同时还与人类的判断作对比。两个数据集分别是:
下面的表格是STS数据集中的几个例子。可以看到,两句话之间的语义关系通常非常微小。例如第四个例子
通过判断,两句话之间“非常不相似”,尽管它们的句法结构相同,并且其中的词嵌入也类似。 相似度方法有很多方法可以计算两个句子之间的意思相似度。在这里,我们看一下最常见的那些。 基准方法估计两句子间语义相似度最简单的方法就是求句子中所有单词词嵌入的平均值,然后计算两句子词嵌入之间的余弦相似性。很显然,这种简单的基准方法会带来很多变数。我们将研究,如果忽略终止词并用TF-IDF计算平均权重会带来怎样的影响。 词移距离替代上述基准方法的其中一种有趣方法就是词移距离(Word Mover’s Distance)。词移距离使用两文本间的词嵌入,测量其中一文本中的单词在语义空间中移动到另一文本单词所需要的最短距离。 Smooth Inverse Frequency从语义上来讲,求一句话中词嵌入的平均值似乎给与不相关的单词太多权重了。而Smooth Inverse Frequency试着用两种方法解决这一问题:
最后,SIF使一些不重要的词语的权重下降,例如but、just等,同时保留对语义贡献较大的信息。 预训练编码器上述两种方法都有两个重要的特征。首先,作为简单的词袋方法,它们并不考虑单词的顺序。其次,它们使用的词嵌入是在一种无监督方法中学习到的。这两种特点都有潜在的威胁。由于不同的词语顺序会有不同的意思(例如 于是就出现了预训练编码器。预训练的句子编码器的目的是充当
为了与Facebook竞争,谷歌也推出了自己的语句编码器,它有两种形式:
基于变换的模型的结果更好,但是在书写的时候,只有基于DAN的编码器可用。与InferSent不同,谷歌的橘子编码器是在监督数据和非监督数据上共同训练的。 结果我们在 基准方法尽管他们很简洁,在平均词嵌入之间求余弦相似性的基准方法表现得非常好。但是,前提仍要满足一些条件:
词移距离基于我们的结果,好像没有什么使用词移距离的必要了,因为上述方法表现得已经很好了。只有在STS-TEST上,而且只有在有停止词列表的情况下,词移距离才能和简单基准方法一较高下。 Smooth Inverse FrequencySIF是在测试中表现最稳定的方法。在SICK数据集上,它的表现和简单基准方法差不多,但是在STS数据集上明显超过了它们。注意,在带有word2vec词嵌入的SIF和带有GloVe词嵌入的SIF之间有一些差别,这种差别很显著,它显示了SIF的加权和去除常用元素后减少的非信息噪音。 预训练编码器预训练编码器的情况比较复杂。但是我们的结果显示编码器还不能完全利用训练的成果。谷歌的句子编码器看起来要比InferSent好一些,但是皮尔森相关系数的结果与SIF的差别不大。 而斯皮尔曼相关系数的效果更直接。这也许表明,谷歌的句子编码器更能了解到句子的正确顺序,但是无法分辨其中的差别。 结论语句相似度是一个复杂现象,一句话的含义并不仅仅取决于当中的词语,而且还依赖于它们的组合方式。正如开头我们举的那个例子(harp和keyboard),语义相似度有好几种维度,句子可能在其中一种维度上相似,而在其他维度上有差异。目前的句子嵌入方法也只做到了表面。通常我们在皮尔森相关系数(Pearson correlation)上进行测试,除了有些情况下斯皮尔曼相关系数(Spearman correlation)会有不一样的结果。 所以,如果你想计算句子相似度,你会选择哪种方法呢?我们的建议如下:
Google 编码器GitHub地址
模型
Google Research(Universal Sentence Encoder): https://www.dazhuanlan.com/2019/11/21/5dd5876d6a9da/ 该文章在 2023/3/22 18:34:53 编辑过 |
关键字查询
相关文章
正在查询... |