R语言如何判断数据框列值与字符串列表存在近似匹配并返回布尔值
R语言整词级近似匹配实现方案
核心匹配逻辑
仅匹配完整单词,不匹配单词内部字符片段;只要待匹配文本存在至少一个完整单词出现在匹配列表的单词集合中,就返回True,否则返回False,完全满足你宁宽勿严、避免遗漏、不匹配内部片段的需求。
实现代码
你已经完成了小写转换、括号移除的预处理,直接复用以下代码即可:
# 加载字符串处理包 library(stringr) # --------------- 输入数据替换为你自己的即可 --------------- # 预处理后的匹配列表 match_list <- c("tenis plc", "green company limited", "dcc darth company creditors") # 预处理后的待匹配公司名列 company_vec <- c("ten ltd", "green company gc ltd", "mcc", "darth") # --------------------------------------------------------- # 提取匹配列表的所有唯一整词,生成匹配单词池 word_pool <- unique(unlist(str_split(match_list, "\\s+"))) # 执行匹配,输出结果 match_result <- sapply(company_vec, function(x) { # 拆分待匹配文本为单词,判断是否有单词存在于单词池中 any(str_split(x, "\\s+")[[1]] %in% word_pool) })
运行上述代码后输出的match_result结果为FALSE TRUE FALSE TRUE,和你的期望结果完全一致。
更宽松的匹配调整
如果你需要兼容拼写误差(比如单词少写字母、错写字母的场景),可以使用模糊匹配工具进一步放宽规则:
# 首次使用先安装依赖包 # install.packages("stringdist") library(stringdist) # maxDist参数设置允许的最大拼写误差,数值越大匹配越宽松 match_result_loose <- sapply(company_vec, function(x) { any(ain(str_split(x, "\\s+")[[1]], word_pool, maxDist = 1)) })
注意事项
- 如果
plc、ltd、limited这类通用公司后缀不需要参与匹配,可以在生成word_pool的时候过滤掉这类停用词,减少误匹配 - 拆分单词用的
\\s+可以自动适配多个空格、制表符等空白分隔符,不需要提前统一空格数量
内容的提问来源于stack exchange,提问作者NomNonYon
相关产品推荐
相关产品推荐

