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

R语言高效匹配上市公司名称分词词库与百万级含噪文本数据

问题背景

需要完成14000个上市公司拆分后的词库Have1,和130万行高噪文本Have2的匹配,输出每行Have2对应命中的Have1词汇的结果表Want。原代码运行效率极低,核心问题出在三处:

  • 嵌套循环逐行扫描文本矩阵,时间复杂度为O(n*m),数据量上来后耗时指数级上升
  • 循环内反复用rbind追加结果,每次都要重新分配内存
  • 额外生成have3矩阵属于冗余操作,不需要拆分Have2再逐词匹配

优化后代码

library(data.table)
library(stringr)

# 样例数据准备
company_name_data <- c("amazon inc", "apple inc", "radiation inc", "xerox inc", "notgoingtomatch inc")
# 生成Have1:去通用词+统计频次
have1 <- data.table(table(str_split(company_name_data, "\\W+", simplify = TRUE)))[!V1 %in% c("inc", "company", "corporation", "corp")]
setnames(have1, c("have1_word", "freq"))

have2 <- c("ceo and director, apple inc",
           "current title - senior manager amazon, inc., division of radiation exposure, subdivision of corporate anarchy",
           "xerox inc., president and ceo",
           "president and ceo of the amazon apple assn., division 4")

# 核心匹配逻辑:向量化操作,无循环
# 先给Have2加行索引,方便后续匹配
have2_dt <- data.table(have2_text = have2, row_id = 1:.N)
# 生成正则匹配模式:所有Have1词汇的词边界匹配
pattern <- paste0("\\b", have1$have1_word, "\\b")
# 批量检测每个Have1词汇命中哪些Have2行
match_list <- lapply(pattern, function(p) {
  hit_rows <- str_detect(have2_dt$have2_text, p)
  if (sum(hit_rows) == 0) return(NULL)
  # 返回命中的行和对应的词汇
  data.table(row_id = have2_dt$row_id[hit_rows], have1_word = str_remove_all(p, "\\\\b"))
})
# 合并所有匹配结果,关联回Have2原文
want <- rbindlist(match_list)[have2_dt, on = "row_id"][, .(have2_text, have1_word)]
# 去掉未命中的行
want <- want[!is.na(have1_word)]

优化效果说明

  • 时间复杂度降到O(n),130万行文本+1.4万词汇的匹配,常规配置下耗时可以控制在10分钟以内,比原代码效率提升至少百倍
  • 输出的Want表完全符合要求,包含have2_text(来自Have2的原文)和have1_word(匹配到的Have1词汇)两个字段
  • 可以根据实际需求调整have1生成步骤里的通用词过滤列表,把不需要的后缀词全部加入过滤即可

内容的提问来源于stack exchange,提问作者J M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:15:03