我尝试了不同的方法来解决句子相似度,即:
en_core_web_md
和 en_core_web_lg
。
sentence-similarity
和sentence-transformers
,我尝试过诸如distilbert-base-uncased
、bert-base-uncased
或sentence-transformers/all-mpnet-base-v2
等模型。
spacy-universal-sentence-encoder
,以及模型en_use_md
和en_use_cmlm_lg
。
然而,虽然这些模型通常可以正确检测等效句子的相似性,但在输入否定句子时它们都会失败。例如,这些相反的句子:
返回与模型en_use_md
的
相似度0.931。
但是,可以考虑的句子非常相似:
返回较小的相似度:0.914。
我的问题是:有什么办法解决这个问题吗?在计算相似度时是否有其他模型/方法考虑句子的肯定/否定性质?
你的问题很中肯,我相信这个想法在某个时候已经出现在每个人的脑海中。
如果你想评估两个句子之间的逻辑联系,在一些预先确定的嵌入之上使用余弦相似度或欧氏距离是不够的。
两个句子之间的实际逻辑连接可以通过
RTE
任务(识别文本蕴涵)来确定。
多流派自然语言推理(MultiNLI):https://cims.nyu.edu/~sbowman/multinli/,是专门针对 TE(自然语言上下文中的文本蕴涵)任务构建的数据集推理)。本质上有3个标签(矛盾、中立和蕴含)。
在宾夕法尼亚大道的另一端,人们开始排队等候 白宫之旅。
人们在宾夕法尼亚大道的尽头排起了长队。
在这种情况下,两个句子之间存在蕴含关系。
HuggingFace 也有一些针对 MNLI 的预构建模型。您可以检查
distilbert-base-uncased-mnli
、roberta-large-mnli
等模型,它们是专门针对此任务进行微调的,并将上述模型视为您任务的起点。
处理否定是 NLP 中的难题之一。
许多相似性方法的工作原理是对句子中单词的向量进行平均,在这种情况下,一个句子是另一个句子加上单词“not”的向量,这不会有很大不同。对立面通常也经常一起讨论,因此它们在这个意义上是“相似的”,这就是 NLP 中通常使用“相似”一词的方式。
有很多方法可以解决这个问题,通常用于情感分析,但它们通常并不“有效”。如果你能缩小你期望看到的否定类型,你可能会取得更大的成功。 negspaCy 是一个非官方的 spaCy 组件,可以帮助检测命名实体的否定,例如,这在医学文本中通常很有用(“没有癌症”)。但你必须弄清楚如何处理这些信息,这对相似度分数没有帮助。
您可能会运气好,使用训练有素的模型来分类蕴涵——对某个陈述是否暗示、矛盾或与另一个陈述无关进行分类。
我也遇到过类似的问题。你能想出一些解决办法吗?