如何在Python中计算包含字符串的两个列表的Jaccard相似度?

Ave*_*nus 10 python similarity python-3.x

我有两个用户名列表,我想计算Jaccard相似度.可能吗?

线程显示了如何计算两个字符串之间的Jaccard相似度,但是我想将其应用于两个列表,其中每个元素是一个单词(例如,用户名).

Ave*_*nus 21

毕竟我最终写了自己的解决方案:

def jaccard_similarity(list1, list2):
    intersection = len(list(set(list1).intersection(list2)))
    union = (len(list1) + len(list2)) - intersection
    return float(intersection) / union
Run Code Online (Sandbox Code Playgroud)

  • 该函数将始终返回 0.0 (3认同)
  • 该解决方案简单而优雅,但并非 100% 正确。您应该将相应的行更改为:`union = (len(set(list1)) + len(set(list2))) - junction` (3认同)

iam*_*lcc 12

@aventinus我没有足够的声誉为你的答案添加评论,但为了让事情更清楚,你的解决方案测量jaccard_similarity但是函数被误称为jaccard_distance,实际上是1 - jaccard_similarity


w4b*_*4bo 7

对于Python 3:

def jaccard_similarity(list1, list2):
    s1 = set(list1)
    s2 = set(list2)
    return len(s1.intersection(s2)) / len(s1.union(s2))
list1 = ['dog', 'cat', 'cat', 'rat']
list2 = ['dog', 'cat', 'mouse']
jaccard(list1, list2)
>>> 0.5
Run Code Online (Sandbox Code Playgroud)

对于Python2使用 return len(s1.intersection(s2)) / float(len(s1.union(s2)))

  • 这也将给出 0.0 作为结果。返回语句应该修改: return float(len(s1.intersection(s2))) / float(len(s1.union(s2))) (4认同)

kla*_*aus 6

假设您的用户名不重复,您可以使用相同的想法:

def jaccard(a, b):
    c = a.intersection(b)
    return float(len(c)) / (len(a) + len(b) - len(c))

list1 = ['dog', 'cat', 'rat']
list2 = ['dog', 'cat', 'mouse']
# The intersection is ['dog', 'cat']
# union is ['dog', 'cat', 'rat', 'mouse]
words1 = set(list1)
words2 = set(list2)
jaccard(words1, words2)
>>> 0.5
Run Code Online (Sandbox Code Playgroud)