艾巴生活网

您现在的位置是:主页>科技 >内容

科技

计算文本相似度几种最常用的方法并比较它们之间的性能

2024-08-05 18:19:56科技帅气的蚂蚁
编者按:Yves Peirsman是NLP领域的专家。在这篇博文中,作者比较了各种计算句子相似度的方法,并了解了它们是如何操作的。词嵌入在自然语

计算文本相似度几种最常用的方法并比较它们之间的性能

编者按:Yves Peirsman是NLP领域的专家。在这篇博文中,作者比较了各种计算句子相似度的方法,并了解了它们是如何操作的。词嵌入在自然语言处理领域得到了广泛的应用,它使得我们可以很容易地计算两个词之间的语义相似度,或者找到与目标词最相似的词。然而,人们更关注两个句子或短文之间的相似性。如果你对代码感兴趣,附上Jupyter笔记本解释细节的地址。以下是《论志》的编纂。

许多NLP应用程序需要计算两个短文段之间的相似度。例如,搜索引擎需要对文本和问题之间的相关性进行建模和评估,这不仅仅涉及查看文本是否重叠。同样,像Quora这样的问答网站也有这个需求,他们需要判断一个问题之前是否出现过。判断这种文本相似度,首先要嵌入两个短文本,然后计算它们之间的余弦相似度。虽然word2vec、GloVe等单词嵌入已经成为寻找单词间语义相似度的标准方法,但是对于句子嵌入应该如何计算,仍然存在不同的声音。接下来,我们将回顾几种最常用的方法,并比较它们的性能。

数据

我们将在两个广泛使用的数据集上测试所有的相似度计算方法,并与人类的判断进行比较。这两个数据集是:

STS benchmark收集了2012-2017年SemEval的所有英语数据。

SICK数据库包含10000对英语句子,其中的标签解释了它们之间的语义关联和逻辑关系。

下表是STS数据集中的几个例子。可以看出,两个句子之间的语义关系通常很小。例如,第四个例子:

一个男人在弹竖琴。

一个男人正在弹键盘。

通过判断,这两个句子“差别很大”,尽管它们的句法结构相同,单词嵌入也相似。

STS数据集中的示例

相似性检测方法

计算两个句子语义相似度的方法有很多,下面是常用的方法。

基准方法

估算两个句子之间语义相似度最简单的方法是,求出嵌入在句子中的所有词的平均值,然后计算嵌入在两个句子中的词之间的余弦相似度。显然,这种简单的对标方法会带来很多变数。我们会研究如果忽略终结者,用TF-IDF计算平均重量会怎么样。

单词移位距离

两个文本之间的单词移位距离是指一个文本中的所有单词与第二个文本中的单词之间的最小累积距离。

取代上述基准方法的一个有趣的方法是Word Mover的距离。单词移位距离使用两个文本之间的单词嵌入来测量一个文本中的单词在语义空间中移动到另一个文本单词所需的最短距离。

平滑逆频率

从语义上讲,求单词嵌入句子的平均值,似乎给了不相关的单词太多的权重。平滑逆频率试图以两种方式解决这个问题:

权重:就像上面用的TF-IDF和SIF一样,取句子中嵌入单词的平均权重。每个单词嵌入用a/(a p(w))加权,其中a的值往往设置为0.01,p(w)是单词在语料库中的期望出现频率。

常见元素删除:接下来,SIF计算句子嵌入中最重要的元素。然后减去嵌入在这些句子中的主要成分。这样可以删除与频率和语法相关的变量,与语义联系不大。

最后,SIF降低了一些不重要的词的权重,比如but,just等。同时保留对语义有很大贡献的信息。

预训练编码器

这两种方法都有两个重要的特点。首先,作为简单的单词包方法,它们不考虑单词的顺序。其次,他们使用的嵌入这个词是在无监督的情况下学习的。这两个特征都有潜在的威胁。因为不同的词序有不同的含义(比如“狗咬人”和“人咬狗”),所以我们想让句子的嵌入对这种变化有所反馈。此外,监督训练可以帮助句子嵌入更直接地学习句子意义。

于是预训练编码器出现了。预训练的句子编码器的目的是充当word2vec和GloVe,但是对于句子嵌入,它们生成的嵌入可以用于很多应用,比如文本分类、近似文本检测等等。一般来说,编码器在许多监督和非监督任务中接受训练,以便获得尽可能多的一般语义信息。目前,有几种这样的编码器。我们以InferSent和Google Statement Encoder为例。

预训练自然语言推理等任务自语句编码器学习语句嵌入,以便在未来的迁移任务中使用。

InferSent是脸书开发的预训练编码器。这是一个游泳池最大的游泳池。它是在SNLI数据集上训练的,该数据集包含570,000对英语句子,所有这些句子都属于三个类别之一:推断关系、矛盾关系和中性关系。

为了与脸书竞争,谷歌还推出了自己的语句编码器,它有两种形式:

一种高级模型使用由变换的模型编码子图生成的上下文感知单词所表示的元素的总和。

另一种是更简单的深度平均网络(DAN),其中输入单词和两个字符的嵌入相加得到平均值,平均值通过前馈深度神经网络传递。

基于变换的模型结果较好,但编写时只有基于DAN的编码器可用。与InferSent不同,谷歌的orange编码器是在监督数据和非监督数据上联合训练的。

结果

我们在SICK和STS数据集上对上述方法进行了测试,得到了句子对之间的相似度,并与人类的判断进行了比较。

基准方法

虽然它们很简洁,但是寻找平均单词嵌入之间的余弦相似性的基准方法表现得非常好。但是,前提还是需要满足一些条件:

简单的word2vec嵌入比手套嵌入表现更好。

使用word2vec时,不清楚是使用非索引字表还是TF-IDF加权更有帮助。在STS上,有时是有用的;它对病态不起作用,只计算所有word2vec嵌入的未加权平均值是非常好的。

使用GloVe时,停用词表对于取得良好效果非常重要。使用TF-IDF加权没有帮助。

我们简单的基准测试方法都表现良好。

单词移位距离

基于我们的结果,似乎没有必要使用单词移位距离,因为上述方法已经表现得非常好了。只有在STS-TEST上,并且只有在有停用词表的情况下,单词移位距离才能和简单的基准方法相抗衡。

字移距离的表现令人失望。

平滑逆频率

应力强度因子是试验中最稳定的方法。在病态数据集上,其性能与简单基准方法相近,但在STS数据集上明显优于它们。注意,word2vec单词嵌入的SIF和GloVe单词嵌入的SIF有一些区别。这种差异是显著的,它显示了去除公共元素后SIF的加权和非信息噪声的减少。

SIF性能最稳定。

预训练编码器

预训练编码器的情况更复杂。然而,我们的结果表明,编码器不能充分利用训练结果。Google的句子编码器看起来比InferSent好,但是Pearson相关系数的结果和SIF相差不大。

预训练的编码器表现不错,但SIF比他们差不了多少。

Spearman相关系数的影响更直接。这可能表明谷歌的句子编码器可以更好地理解句子的正确顺序,但它无法区分其中的差异。

Spearman相关系数显示了与Pearson不同的效果。

结论

句子相似是一种复杂的现象,句子的意义不仅取决于其中的单词,还取决于它们的组合。就像我们一开始举的例子(竖琴和键盘),语义相似度有几个维度,句子可能在一个维度上相似,但在其他维度上不同。目前,句子嵌入的方法只是表面的。通常我们测试皮尔逊相关,除了在某些情况下斯皮尔曼相关会有不同的结果。

判断句子相似度的各种方法的比较

那么,如果要计算句子相似度,你会选择哪种方法呢?我们的建议如下:

Word2vec比手套安全。

虽然句子中的未加权平均单词嵌入是一个简单的基准,但平滑逆频是一个更强大的选择。

如果你可以使用一个预先训练好的编码器,选择谷歌的。但是记住它的表现可能并不总是那么惊艳。