栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

计算两个列表之间的相似度

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

计算两个列表之间的相似度

collections.Counter()
也许使用;从数据类型的角度来看,这些是多集或袋:

from collections import CountercounterA = Counter(listA)counterB = Counter(listB)

现在,您可以按条目或频率比较这些:

>>> counterACounter({'apple': 3, 'orange': 2, 'banana': 1})>>> counterBCounter({'apple': 2, 'orange': 1, 'grapefruit': 1})>>> counterA - counterBCounter({'orange': 1, 'apple': 1, 'banana': 1})>>> counterB - counterACounter({'grapefruit': 1})

您可以使用以下公式计算它们的余弦相似度:

import mathdef counter_cosine_similarity(c1, c2):    terms = set(c1).union(c2)    dotprod = sum(c1.get(k, 0) * c2.get(k, 0) for k in terms)    magA = math.sqrt(sum(c1.get(k, 0)**2 for k in terms))    magB = math.sqrt(sum(c2.get(k, 0)**2 for k in terms))    return dotprod / (magA * magB)

这使:

>>> counter_cosine_similarity(counterA, counterB)0.8728715609439696

该值越接近1,则两个列表越相似。

余弦相似度是您可以计算的 一个
分数。如果您关心列表的长度,则可以计算另一个。如果您也将分数保持在0.0到1.0之间,则可以将这两个值相乘得到最终分数在-1.0到1.0之间。

例如,要考虑相对长度,可以使用:

def length_similarity(c1, c2):    lenc1 = sum(c1.itervalues())    lenc2 = sum(c2.itervalues())    return min(lenc1, lenc2) / float(max(lenc1, lenc2))

然后合并为一个将列表作为输入的函数:

def similarity_score(l1, l2):    c1, c2 = Counter(l1), Counter(l2)    return length_similarity(c1, c2) * counter_cosine_similarity(c1, c2)

对于您的两个示例列表,结果为:

>>> similarity_score(['apple', 'orange', 'apple', 'apple', 'banana', 'orange'], ['apple', 'orange', 'grapefruit', 'apple'])0.5819143739626463>>> similarity_score(['apple', 'apple', 'orange', 'orange'], ['apple', 'orange'])0.4999999999999999

您可以根据需要混合其他指标。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/382135.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号