如何生成相似姓名映射表?解决数据库同人物异名匹配问题
解决方案
核心思路是先按职业(occupation)和机构(organization)分组——同一人物的这两个字段完全一致,只需在同组内匹配相似姓名,同时排除自身匹配的情况。
实现步骤及代码
- 加载所需工具包:
library(dplyr) library(stringdist) library(tidyr)
- 对原始数据分组处理,计算组内姓名相似度并筛选有效匹配:
# 按机构和职业分组,生成组内所有姓名组合 name_matches <- df1 %>% group_by(organization, occupation) %>% expand(name1 = name, name2 = name) %>% # 排除自身匹配的行 filter(name1 != name2) %>% # 计算姓名间的Jaro-Winkler距离(适合姓名匹配,阈值可调整) mutate(distance = stringdist(name1, name2, method = "jw")) %>% # 筛选距离小于阈值的匹配(示例用0.15,可根据实际数据调整) filter(distance < 0.15) %>% # 保留核心映射字段 select(name1, name2) %>% ungroup() # 查看最终映射表 name_matches
结果说明
运行代码后会得到如下映射结果:
# A tibble: 2 × 2 name1 name2 <chr> <chr> 1 Anne Sue Frank Anne S. Frank 2 John S. Gooble Johnatan Sue Google
你可以根据实际数据调整stringdist的距离计算方法(比如lv代表莱文斯坦编辑距离)和阈值,提升匹配准确性。如果需要避免双向重复(比如同时出现name1=A,name2=B和name1=B,name2=A),可在filter(name1 != name2)后添加filter(name1 < name2)去重。
内容的提问来源于stack exchange,提问作者Vitoria Sanchez
相关产品推荐
相关产品推荐

