如何实现两列字符串间单字符拼写错误的精准匹配?
字符串单差异匹配需求与解决方案
需求说明
我之前的字符串匹配问题未考虑拼写错误场景,现明确规则:
- 仅当两字符串存在且仅存在一个字符差异(多一个字符或单个字符输入错误)时,判定为匹配
- 字符顺序不同、差异字符数超过1的情况,均判定为不匹配
示例数据:
Misspellings <- tibble( Name1 = c("Location","Tree","Street","Place","Racecar"), Name2 = c("Locatione","Treeee","Steept","Pluce","Carrace"), Match = c("TRUE", "FALSE", "FALSE","TRUE", "FALSE"))
我自行实现的代码不够精准,无法得到预期结果:
Misspellings %>% mutate(RMatch = sapply(1:nrow(Misspellings),function(i)agrepl(Misspellings$Name1[i],Misspellings$Name2[i],max.distance=1)))
优雅实现方案
使用stringdist包的Levenshtein编辑距离计算,完全契合匹配规则:
步骤1:安装加载依赖包
install.packages("stringdist") library(stringdist) library(dplyr)
步骤2:实现匹配逻辑
Misspellings %>% mutate(RMatch = stringdist(Name1, Name2, method = "lv") == 1)
结果说明
该代码输出的RMatch与示例中的Match完全一致:
Location与Locatione:编辑距离为1 → 匹配(TRUE)Tree与Treeee:编辑距离为2 → 不匹配(FALSE)Street与Steept:编辑距离为2 → 不匹配(FALSE)Place与Pluce:编辑距离为1 → 匹配(TRUE)Racecar与Carrace:编辑距离为3 → 不匹配(FALSE)
方案优势
- 替代
agrepl的模糊匹配逻辑,stringdist的method="lv"严格计算插入/删除/替换的单字符操作次数,精准符合规则 - 自动排除字符顺序不同的场景(这类场景的编辑距离必然大于1)
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

