You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:45:04