如何匹配两个DataFrame字符串并输出同义词典的行名?
高效实现同义词组匹配与对应行名输出
问题说明
现有两个DataFrame:
thesaurus:每行对应一组同义词,行名为唯一编号PKV_clean:存储待匹配的记录文本
核心需求:当PKV_clean的记录中出现thesaurus任意一行的同义词时,输出该行的行名(示例匹配结果为0070、0110)。此前尝试grep匹配行名失败,手动构建0/1矩阵在数据量较大时操作繁琐,需高效解决方案。
基于R语言的高效实现方案
1. 预处理同义词组,生成匹配模式
将thesaurus每行的同义词整合成正则匹配模式,并关联对应的行名:
library(dplyr) library(stringr) # 将行名转为列,每行同义词合并为|分隔的正则模式 syn_patterns <- thesaurus %>% rownames_to_column("syn_id") %>% rowwise() %>% # 若同义词含正则特殊字符,需添加str_escape转义 mutate(pattern = str_c(str_escape(c_across(-syn_id)), collapse = "|")) %>% ungroup() %>% select(syn_id, pattern)
2. 批量匹配记录文本
定义匹配函数,对PKV_clean的每条记录文本,批量匹配所有同义词模式并提取对应行名:
# 传入单条文本,返回匹配到的同义词组编号 match_syn_ids <- function(text) { match_flag <- str_detect(text, syn_patterns$pattern) syn_patterns$syn_id[match_flag] } # 对PKV_clean的文本列应用函数,得到每条记录的匹配结果 PKV_clean$matched_syn_ids <- lapply(PKV_clean$你的文本列名, match_syn_ids)
3. 整理匹配结果(可选)
若需将匹配结果展开为每行对应一个匹配项,可使用unnest:
library(tidyr) PKV_matched_result <- PKV_clean %>% unnest(matched_syn_ids, keep_empty = TRUE)
注意事项
- 若同义词中包含
.、*这类正则特殊字符,必须用str_escape转义,否则会导致匹配错误 - 该方案通过正则批量匹配替代手动矩阵构建,在数据量大时能显著提升效率
内容的提问来源于stack exchange,提问作者KC-Migo
相关产品推荐
相关产品推荐

