句子相似性模型没有捕捉到相反的句子

Posted

技术标签:

【中文标题】句子相似性模型没有捕捉到相反的句子【英文标题】:Sentence similarity models not capturing opposite sentences 【发布时间】:2021-11-21 05:38:44 【问题描述】:

我尝试了不同的方法来句子相似度,即:

spaCy 模型en_core_web_mden_core_web_lg

变形金刚:使用包sentence-similaritysentence-transformers,我尝试过distilbert-base-uncasedbert-base-uncasedsentence-transformers/all-mpnet-base-v2等模型。

通用句子编码:使用包spacy-universal-sentence-encoder,模型en_use_mden_use_cmlm_lg

然而,虽然这些模型通常可以正确检测等效句子的相似性,但在输入否定句子时它们都失败了。例如,这些相反的句子

“我喜欢下雨天,因为它们让我感到轻松。” “我不喜欢下雨天,因为它们不会让我感到放松。”

返回与模型en_use_md相似度为 0.931

但是,可以认为非常相似的句子:

“我喜欢下雨天,因为它们让我感到轻松。” “我喜欢下雨天,因为它们让我感到平静。”

返回一个较小的相似度:0.914

我的问题是:有没有办法解决这个问题?在计算相似度时是否有其他模型/方法可以考虑句子的肯定/否定性质?

【问题讨论】:

关于转换器:distilbert-base-uncased、bert-base-uncased 没有经过训练来检测相似性。此外,具有相反含义的句子仍然可以相似。也许你可以尝试一个释义模型或寻找一个数据集,你可以使用它来微调一个关于句子含义的转换器。 【参考方案1】:

处理否定是 NLP 中的难题之一。

很多相似性方法都可以通过平均一个句子中单词的向量来工作,在这种情况下,一个句子是另一个句子加上单词“not”的向量,这不会有太大的不同。反义词通常也经常一起讨论,因此它们在这个意义上是“相似的”,这也是 NLP 中“相似”一词的常用用法。

有一些方法可以解决这个问题,通常用于情绪分析,但它们通常不会“正常工作”。如果你能缩小你期望看到的否定类型,你可能会取得更大的成功。 negspaCy 是一个非官方的 spaCy 组件,可以帮助检测命名实体的否定,例如,这在医学文本(“没有癌症”)中通常很有用。但是你必须弄清楚如何处理这些信息,它对相似度得分没有帮助。

使用经过训练对蕴含进行分类的模型可能会有一些运气 - 可以对某些陈述是否暗示、矛盾或与另一陈述无关。

【讨论】:

感谢您的回复。正如你所说,简单地检测否定仍然行不通,因为例如,“我不喜欢网球”和“我不喜欢网球”的意思基本相同,但第一个被否定,第二个不是。但是,我会看看蕴含,这似乎是一种合理的方法:)【参考方案2】:

你的问题很中肯,我相信这个想法在某个时候已经出现在每个人的脑海中。

如果你想评估两个句子之间的逻辑联系,在一些预先确定的嵌入之上使用余弦相似度或欧几里得距离是不够的。

两个句子之间的实际逻辑联系可以通过RTE 任务(识别文本蕴涵)来确定。

多流派自然语言推理 (MultiNLI):https://cims.nyu.edu/~sbowman/multinli/,是专门针对 TE(自然语言推理上下文中的文本蕴涵)任务构建的数据集。本质上,有 3 个标签(矛盾、中性和蕴涵)。

在宾夕法尼亚大道的另一端,人们开始排队等候 白宫之旅。

人们在宾夕法尼亚大道的尽头排起了队。

在这种情况下,两个句子之间存在蕴涵。

HuggingFace 还为 MNLI 提供了一些预先构建的模型。您可以检查 distilbert-base-uncased-mnliroberta-large-mnli 等模型,这些模型专门针对此任务进行了微调,并将上述模型作为您任务的起点。

【讨论】:

以上是关于句子相似性模型没有捕捉到相反的句子的主要内容,如果未能解决你的问题,请参考以下文章

fasttext 预训练句子相似度

使用 TF-IDF 加权的空间向量模型实现句子相似度计算

如何抓取语义相似的句子

利用lda.collapsed.gibbs.sampler怎样去预测新的样本文档

英文句子相似性判断

论文泛读85基于上下文的句子相似度