如何用dplyr计算R数据框两列逐行的Jaccard相似度索引
问题原因
你当前代码返回全0的核心原因是:address和gmap_var两列存储的都是单个完整字符串,而intersect()/union()对长度为1的字符串向量计算时,只有两个字符串完全相等才会得到非0交集长度,你的示例数据中没有完全相等的两个字段值,因此结果全为0。
解决方法
你需要先把每行的地址字符串按分隔符拆分为独立的片段/词向量,再计算Jaccard相似度,代码示例如下:
library(dplyr) library(stringr) example <- example %>% rowwise() %>% mutate( # 按逗号+空格拆分字符串为向量,统一转大写避免大小写差异影响计算 address_split = str_split(address, ",\\s*") %>% unlist() %>% str_to_upper(), gmap_split = str_split(gmap_var, ",\\s*") %>% unlist() %>% str_to_upper(), # 计算Jaccard相似度 jaccard_sim = length(intersect(address_split, gmap_split))/length(union(address_split, gmap_split)) ) %>% # 可选:删除中间生成的拆分列 select(-address_split, -gmap_split)
如果需要更细粒度的分词(比如按空格拆分每个独立单词),可以把拆分规则改成str_split(address, ",\\s*|\\s+"),会同时按逗号、空格拆分所有词汇,相似度计算精度会更高。
内容的提问来源于stack exchange,提问作者AnEostig
相关产品推荐
相关产品推荐

