行政数据中识别并修正姓名顺序颠倒问题的方法
高效修正大型数据中的姓名顺序问题
核心思路
针对数据量大的场景,全程采用精确匹配避免性能损耗,结合已知名姓参考数据集+频率统计的方式,快速识别并修正颠倒的姓名。
具体实现步骤
1. 拆分姓名为独立部分
假设所有姓名均由两个空格分隔的部分组成,先拆分目标数据中的姓名:
library(tidyverse) # 目标数据集 target_df <- tibble(names = c("MIMO DAGRYL", "LUMPERSTEIN ANASTASIA", "KEY MORPHIN", "DAGRYL MIMO", "ANASTASIA LUMPERSTEIN", "KEY MORPHIN")) # 拆分姓名为两个部分 target_df <- target_df %>% separate(names, into = c("part1", "part2"), sep = " ", remove = FALSE)
2. 构建权威名姓映射
基于参考数据集,建立正向(名→姓)和反向(姓→名)的精确映射表,用于快速校验:
# 参考数据集 ref_df <- tibble(forename = c("MIMO", "KEY", "DAVID"), surname = c("DAGRYL", "LUMPERSTEIN", "MORPHIN")) # 正向映射:合法名对应正确姓氏 name_to_surname <- ref_df %>% deframe() # 反向映射:合法姓氏对应正确名字 surname_to_name <- ref_df %>% select(surname, forename) %>% deframe()
3. 校验并修正姓名顺序
遍历拆分后的姓名,通过映射表判断顺序是否正确,直接修正颠倒的情况:
target_df <- target_df %>% mutate( # 标记当前顺序是否符合参考集 is_correct = map2_lgl(part1, part2, ~ .x %in% names(name_to_surname) && name_to_surname[.x] == .y), # 标记是否是颠倒的合法姓名 is_reversed = map2_lgl(part1, part2, ~ .x %in% names(surname_to_name) && surname_to_name[.x] == .y), # 生成修正后的姓名 corrected_name = case_when( is_correct ~ names, is_reversed ~ str_c(part2, part1, sep = " "), TRUE ~ names # 参考集未覆盖的项暂保留原内容,后续可通过频率补充修正 ) )
4. 补充处理参考集未覆盖的姓名(可选)
对于参考集没有的姓名,利用出现频率判断顺序:通常姓氏的重复率更高,或正确顺序的姓名出现次数更多:
# 统计所有姓名片段的出现频率 part_freq <- target_df %>% pivot_longer(cols = c(part1, part2), values_to = "name_part") %>% count(name_part, sort = TRUE) %>% deframe() # 基于频率修正未覆盖项:频率高的片段判定为姓氏 target_df <- target_df %>% mutate( corrected_name = case_when( is_correct ~ names, is_reversed ~ str_c(part2, part1, sep = " "), part_freq[part1] < part_freq[part2] ~ names, TRUE ~ str_c(part2, part1, sep = " ") ) )
最终效果示例
处理后target_df的corrected_name列将输出修正后的正确姓名:
| names | part1 | part2 | is_correct | is_reversed | corrected_name |
|---|---|---|---|---|---|
| MIMO DAGRYL | MIMO | DAGRYL | TRUE | FALSE | MIMO DAGRYL |
| LUMPERSTEIN ANASTASIA | LUMPERSTEIN | ANASTASIA | FALSE | FALSE | ANASTASIA LUMPERSTEIN |
| KEY MORPHIN | KEY | MORPHIN | FALSE | FALSE | KEY LUMPERSTEIN |
| DAGRYL MIMO | DAGRYL | MIMO | FALSE | TRUE | MIMO DAGRYL |
| ANASTASIA LUMPERSTEIN | ANASTASIA | LUMPERSTEIN | FALSE | FALSE | ANASTASIA LUMPERSTEIN |
| KEY MORPHIN | KEY | MORPHIN | FALSE | FALSE | KEY LUMPERSTEIN |
内容的提问来源于stack exchange,提问作者Shaq
相关产品推荐
相关产品推荐

