使用 BERT 的语义文本相似度

数据挖掘 Python nlp 伯特
2022-03-02 15:37:02

给定两个句子,我想基于语义相似度来量化两个文本之间的相似程度。语义文本相似性 (STS) 评估两个句子在语义上彼此等效的程度。说我的输入是有序的:

index    line1                       line2
0        the cat ate the mouse      the mouse was eaten by the cat
1        the dog chased the cat     the alligator is fat 
2        the king ate the cake      the cake was ingested by the king

应用算法后,输出需要是

index    line1                       line2                           lbl
0        the cat ate the mouse      the mouse was eaten by the cat    1
1        the dog chased the cat     the alligator is fat              0
2        the king ate the cake      the cake was ingested by the king 1

这里 lbl=1 表示句子在语义上相似,lbl=0 表示不相似。我将如何在 python 中实现它?我阅读了bert-as-a-service的文档,但由于我在这方面绝对是菜鸟,所以我无法正确理解它。

2个回答

BERT 接受了掩蔽语言建模和下一句预测的损失组合的训练。为此,BERT 接收特殊标记[CLS]、第一句标记、特殊标记[SEP]、第二句标记和最终标记的串联作为输入[SEP]

[CLS] | 第一句记号 | [九月] | 第二句记号 | [九月]

句子中的某些标记被“屏蔽”(即替换为特殊标记[MASK])。

BERT 生成与输入长度相同的序列作为输出。掩蔽语言损失确保正确猜测掩蔽标记。下一句预测损失在第一个位置(与[CLS]输入相关联的位置)获取输出,并将其用作小型分类模型的输入,以预测第二个句子是否是它们所在的原始文本中实际跟随第一个句子的那个从。

您的任务既不是掩码语言建模也不是下一句预测,因此您需要在自己的训练数据中进行训练。鉴于您的任务包括分类,您应该使用 BERT 的第一个标记输出([CLS]输出)并训练一个分类器来判断您的第一句话和第二句话是否在语义上等效。为此,您可以:

  • 训练以 BERT 的第一个令牌输出为输入的小型分类模型(重用 BERT 生成的特征)。

  • 不仅训练小型分类模型,还训练整个 BERT,但使用较小的学习率(微调)。

为了确定最适合您的情况,您可以查看这篇文章

为了实际实现它,您可以使用流行的转换器 python 包,它已经准备好在自定义任务上微调 BERT(例如,请参阅本教程)。

其他方法是使用 pip install sentence-transformers 我是从手机上发布的,如果有任何缩进问题,请见谅

`从 sentence_transformers 导入 SentenceTransformer 从 sklearn.cluster 导入 KMeans

embedder = SentenceTransformer('distilbert-base-nli-stsb-mean-tokens')

带有例句的语料库

corpus = ['一个男人在吃食物。','一个男人在吃一块面包。','一个男人在吃意大利面。','女孩怀着一个婴儿。','婴儿由女人”、“男人在骑马。”、“男人在封闭的地面上骑白马。”、“猴子在打鼓”、“穿着大猩猩服装的人在打鼓。” ', '一只猎豹在它的猎物身后奔跑。', '一只猎豹在田野上追逐猎物。']

corpus_embeddings = embedder.encode(语料库)

然后,我们使用 sklearn 执行 k-means 聚类:

从 sklearn.cluster 导入 KMeans

num_clusters = 5 clustering_model = KMeans(n_clusters=num_clusters) clustering_model.fit(corpus_embeddings) cluster_assignment = clustering_model.labels_`