假設我有 3 個串列:
l1 = ["a", "b", "c"]
l2 = ["c", "e", "f"]
l3 = ["c", "b", "a"]
對于 Jaccard 相似性,我使用以下函式:
def jaccard_similarity(list1, list2):
intersection = len(list(set(list1).intersection(list2)))
union = (len(set(list1)) len(set(list2))) - intersection
return float(intersection) / union
如何計算所有組合的 Jaccard 相似度,即:
(l1,l1), (l1,l2), (l1, l3)
(l2,l1), (l2,l2), (l2, l3)
(l3,l1), (l3,l2), (l3, l3)
我想避免為每對串列手動執行此操作。此外,最終輸出需要是一個3x3矩陣。
uj5u.com熱心網友回復:
您可以在原始函式中洗掉listfrom list(set(...))。當您使用“浮點除法運算子”時,也無需轉換intersection為 a :float
def jaccard_similarity(list1, list2):
intersection = len(set(list1).intersection(list2))
union = (len(set(list1)) len(set(list2))) - intersection
return intersection / union
您可以product從itertools模塊中使用來生成串列對,并將它們starmap與您的函式一起使用:
from itertools import product, starmap
l1 = ['a', 'b', 'c']
l2 = ['c', 'e', 'f']
l3 = ['c', 'b', 'a']
inputs = product([l1, l2, l3], [l1, l2, l3])
result = list(starmap(jaccard_similarity, inputs))
print(result)
輸出:
[1.0, 0.2, 1.0, 0.2, 1.0, 0.2, 1.0, 0.2, 1.0]
接下來,要創建一個矩陣,您可以查看以下grouper檔案中的配方itertools:https ://docs.python.org/3/library/itertools.html#itertools-recipes
grouper這是該函式的簡化示例:
def group_three(it):
iterators = [iter(it)] * 3
return zip(*iterators)
print(list(group_three(result)))
輸出:
[(1.0, 0.2, 1.0), (0.2, 1.0, 0.2), (1.0, 0.2, 1.0)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/439175.html
下一篇:for回圈的Python性能
