如何计算两个排名列表之间的距离?

2024-05-15 20:59:57 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一些排名表:

A = ['cat', 'dog', 'bat']
B = ['dog', 'cat', 'cow']

如何计算列表a和B之间的相似性分数,该分数考虑了列表之间重叠的项目数量及其相对顺序。这是nDCG的用途吗


Tags: 项目列表数量顺序相似性用途分数cat
2条回答

您可以使用Kendall's Tau。 您需要生成一个“秩”向量(向量中的每个值都是对应项的秩)

首先,根据这些“排名”向量:

A = ['cat', 'dog', 'bat', 'mouse']
B = ['dog', 'cat', 'cow']

创建域(所有项目):

domain = list(set(A + B))

列表中每个项目的索引都很重要,因为它有助于生成“排名”向量:

['cat', 'dog', 'bat', 'mouse', 'cow']

然后生成A和B的排名(与域大小相同),缺少的项目作为联系(最后一个排名)

A_rank = [1, 2, 3, 4, 5]
B_rank = [2, 1, 4, 4, 3]

您可以为此编写一个函数

最后,使用肯德尔的Tau得到-1到1之间的分数:

from scipy import stats
correlation = stats.kendalltau(A_rank, B_rank)

这是一个不同寻常的要求。通常,列表是基于共享元素的数量进行比较的,而不管它们的位置如何,或者基于列表中元素的绝对顺序。 相对定位(“foo”后面的“bar”,不管它们在列表中的绝对位置如何)是非常罕见和困难的情况

有时这是在NLP字段中完成的,这可能对您有用,因为您的示例包含字符串列表

  1. 识别语料库中的短语(所有要比较的列表)。这可以使用gensim.phrases模型(https://radimrehurek.com/gensim/models/phrases.html)完成
  2. 将字符串列表转换为弓形向量(示例:https://maelfabien.github.io/machinelearning/NLP_2/#2-bow-in-sk-learn
  3. 使用余弦相似性计算向量之间的相似性

结束度量将同时考虑列表之间的总体相似性和列表中元素的相对顺序

这可能取决于特定的用例。如果您正在处理文本数据,并且您试图确定一个单词在另一个单词(即短语)之后使用的实例,然后根据所用词汇的总体相似性和精确的短语比较两个文档

相关问题 更多 >