如何使用R的rebus包从字符串中提取向量的所有最长匹配项
问题根因
- 正则
|匹配的顺序优先逻辑:or1()会按你传入匹配词的顺序拼接正则选项,短词条Heart排在长词条前面时,匹配到Heart就会直接返回结果,不会继续尝试更长的词条 - 拼写错误:示例代码中匹配词写为
Heart rythm,但待匹配文本中对应表述是Heart rhythm,拼写不一致导致漏匹配
实现最长匹配的方案
1. 预处理匹配词向量
将匹配词向量按字符长度从长到短排序后再生成正则,保证正则优先尝试匹配更长的词条,没有命中才会匹配短词条:
# 你的5000个匹配词条替换此处symp_vec即可 symp_vec <- c("Heart", "Heart rhythm", "Heart valve") # 按长度降序排序 symp_vec_sorted <- symp_vec[order(-nchar(symp_vec))] # 生成全词匹配正则 symp.rx <- or1(whole_word(symp_vec_sorted))
2. 批量处理数据框
stringi本身支持向量化操作,直接对整列执行提取即可,后续可以按需求整理匹配结果的存储格式:
library(stringi) library(rebus) # 假设原始数据框为df,待匹配文本列名为text # 提取匹配结果,默认存储为列表格式,每行对应一个匹配结果向量 df$match_result <- stri_extract_all_regex(df$text, symp.rx) # 若需要将每行结果去重后拼接为字符串存储,可追加以下代码 df$match_result <- sapply(df$match_result, function(x) { if (all(is.na(x))) return("") paste0(unique(x), collapse = ",") })
用你提供的示例文本测试修正后代码,返回的匹配结果为:
"Heart" "Heart" "Heart rhythm" "Heart" "Heart valve" "Heart" "Heart",可正常命中所有长短目标词条。
内容的提问来源于stack exchange,提问作者ayeh
相关产品推荐
相关产品推荐

