鉴于我有两个列表,每个列表包含一个公共超集的单独子集,是 有一个算法给我一个相似性测量?
示例:
<=> A = {John,Mary,Kate,Peter}和B = {Peter,James,Mary,Kate}这两个名单有多相似?请注意,我不知道常见超集的所有元素。
更新: 我不清楚,我可能以一种草率的方式使用'set'这个词。我很抱歉。 澄清:秩序很重要。 如果相同的元素在列表中占据相同的位置,则我们对该元素具有最高的相似性。 相似性降低了相同元素的距离越远。 如果元素仅存在于其中一个列表中,则相似性甚至更低。
我甚至可以添加额外的维度,即较低的索引具有更大的值,因此aa [1] == b [1]的价值超过[9] == b [9],但这主要是因为我我很好奇。
答案 0 :(得分:13)
Jaccard Index ( aka Tanimoto系数)正好用于OP问题中所述的用例。
Tanimoto coeff, tau 等于 Nc 除以 Na + Nb - Nc ,或
tau = Nc / (Na + Nb - Nc)
Na ,第一组中的项目数
Nb ,第二组中的项目数
Nc ,两组的交集,或唯一项目的数量 a和b共同
这里的Tanimoto编码为Python函数:
def tanimoto(x, y) :
w = [ ns for ns in x if ns not in y ]
return float(len(w) / (len(x) + len(y) - len(w)))
答案 1 :(得分:2)
我会探讨两种策略:
答案 2 :(得分:1)
如果你真的有集(即,一个元素只是存在或不存在,没有附加计数)并且只有两个,只需添加共享元素的数量并除以总数元素的数量可能与它一样好。
如果你有(或可以得到)计数和/或两个以上的计数,你可以比cosine simliarity或TFIDF更好一些(术语频率*倒置文档频率) )。
后者试图对所有(或几乎)所有“文件”中出现的单词给予较低的权重 - 即单词集。
答案 3 :(得分:0)
您对“相似度测量”的定义是什么?如果你想要的只是集合中有多少项是相同的,你可以找到A和B的基数,将基数加在一起,并从A和B的并集的基数中减去。
答案 4 :(得分:0)
如果订单有问题,您可以使用Levenshtein distance或其他类型Edit distance