比较两个知识点时,单独的文本相似度的比较不足以完整比较出两个文本的差别,所以我们要同时结合语义相似度的比较,语义相似度相比文本相似度的实现就较为困难了点。
我们采用余弦相似度来比较语义,余弦相似度(是一种衡量两个向量方向相似程度的指标,广泛应用于自然语言处理(NLP)、信息检索、推荐系统等领域。其核心思想是:通过计算两个向量之间的夹角余弦值,判断它们在 语义或特征空间中的相似性,而不仅仅是数值上的接近程度。
它的计算公式采用如下方式:
我们采用下面的具体方式来实现:
def cos_score(entity1,entity2):
embeddings1 = model.encode(entity1)
embeddings2 = model.encode(entity2)
score = cos_sim(embeddings1, embeddings2)
if score.shape[0] > 1:
# print(score)
score = torch.max(score)
return float(score)
-
文本向量化(Embedding)
- 我们使用预训练的Bert模型,将输入的
entity1
和entity2
转换为向量表示(embeddings1
和embeddings2
)。
- 我们使用预训练的Bert模型,将输入的
-
计算余弦相似度
- 使用
cos_sim()
计算两个向量的相似度,结果范围[-1, 1]
(通常0~1
表示相似性)。 - 如果输入的是 多个句子(如
entity1 = ["A", "B"]
),则score
会是一个相似度矩阵,此时取最大值(torch.max(score)
)。
- 使用
-
返回标量值
- 最终返回一个
float
类型的相似度分数。
- 最终返回一个
以下是它在我们代码里的具体应用:
def list_score(list1,list2):
score1 = word_score(''.join(list1),''.join(list2))
score2 = cos_score(list1,list2)
res =(score1 + score2) / 2
# print("得分:", res)
return res
词重叠率(Jaccard相似度):
将两个列表拼接成字符串,计算基于字符的 word_score(即 Jaccard 相似度)。
余弦相似度(cos_score):
直接计算两个列表的向量余弦相似度(需确保 cos_score 已实现)。
综合得分:
取 word_score 和 cos_score 的平均值作为最终相似度