首页 > 解决方案 > pandas:根据另一列中的值计算每一行的jaccard相似度

问题描述

我有一个如下数据框,只有更多行:

import pandas as pd

data = {'First':  ['First value', 'Second value','Third value'],
'Second': [['old','new','gold','door'], ['old','view','bold','door'],['new','view','world','window']]}

df = pd.DataFrame (data, columns = ['First','Second'])

为了计算 Jaccard 相似度,我在网上找到了这篇文章(不是我的解决方案):

def lexical_overlap(doc1, doc2): 
    words_doc1 = set(doc1) 
    words_doc2 = set(doc2)

    intersection = words_doc1.intersection(words_doc2)
    union = words_doc1.union(words_doc2)
    
    return float(len(intersection)) / len(union) * 100

因此,我想要得到的结果是度量将第二列的每一行作为文档并迭代地比较每一对并输出具有第一列中行名称的度量,如下所示:

First value and Second value = 80 

First value and Third value  = 95

Second value and Third value = 90

标签: pythonpandassimilarity

解决方案


由于您的数据不大,您可以尝试使用稍微不同的方法进行广播:

# dummy for each rows
s = pd.get_dummies(df.Second.explode()).sum(level=0).values

# pair-wise jaccard
(s@s.T)/(s|s[:,None,:]).sum(-1) * 100

输出:

array([[100.        ,  33.33333333,  14.28571429],
       [ 33.33333333, 100.        ,  14.28571429],
       [ 14.28571429,  14.28571429, 100.        ]])

推荐阅读