我有N对字符串列表(第1组中的N到第2组中的N)需要通过Jaccard相似度与最接近的一对配对。这意味着我需要计算N ^ 2的距离,并为集合1中的每个元素获取最大相似度wrt set 2。
运行它的简单代码是
import numpy as np
def jaccard_similarity(a, b):
intersection = set(a).intersection(set(b))
union = set(a).union(set(b))
return len(intersection)/len(union)
set_1 = [['Pisa','Tower','River','Tuscany'],['London','City','UK','England'],['Berlin','Germany','Munich']]
set_2 = [['Pisa','Arno','River','Tuscany','Florence','London','Tower'],['Germany','German','UBanh'],['London','City','UK','England','Europe']]
pairs = []
for vect_1 in set_1:
dist = []
for vect_2 in set_2:
dist.append(jaccard_similarity(vect_1,vect_2))
pairs.append(np.argmax(dist))
print(pairs)
我知道这具有O(N ^ 2)的时间复杂度,但是我想知道是否可能存在一些优化/启发式算法,以使平均情况更好。
同样,是否有关于代码本身可以优化的东西?
编辑:我修改了问题,使其更加精确。
您应该能够使用scipy.spatial.distance.cdist,它可以为给定指标计算整个矩阵。时间的复杂性是不可避免的,但是科学的速度使其变得很快。
https://docs.scipy.org/doc/scipy/reference/generation/scipy.spatial.distance.cdist.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句