python - 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
解决方案
由于您的数据不大,您可以尝试使用稍微不同的方法进行广播:
# 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. ]])
推荐阅读
- c++ - 尝试在 antlr4 中生成解析器时出现问题
- performance - ActiveMQ 在处理大量(数千万)消息时性能不佳
- c++ - 将指针分配给循环链表的头部时崩溃
- typescript - 如何检查值是打字稿中的类型?
- javascript - 在带有条件的 JS 中,如果我如何生成“您输入了一个单词,我们需要一个数字”或“负数在这里不起作用”的输出?
- c# - MSTest 单元测试在 VS Code 中不起作用:VS 命名空间不存在?
- python - 如何在异步单元测试中模拟方法?
- elixir - 将 Ecto Query 转换为地图
- css - 如何倾斜文本的背景?
- firebase - 如何使用 FCM v1 http api 设置徽章