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

R中基于连续字母匹配两个数据框文本列的实现方法

R实现两数据集按连续重合字母匹配方案

针对Excel处理数据量上限低、逐格比对效率差的问题,以下方案基于常用R扩展包实现,支持十万级行数据快速匹配,匹配规则可灵活调整连续重合字母长度。

依赖包加载

先加载用到的扩展包,未安装的先运行install.packages("包名")完成安装:

library(dplyr)
library(stringr)
library(purrr)
library(tidyr)

实现思路

不采用效率极低的全量笛卡尔积逐行两两比对,而是通过子串索引的方式提速:

  • 第一步做文本标准化:统一转小写、剔除非字母字符,避免大小写、标点、数字干扰匹配结果
  • 第二步给两个数据集的所有文本,切分出所有指定长度(默认5,可改6)的连续字母子串
  • 第三步通过公共子串做快速关联合并,最后去重得到唯一的原始文本-匹配文本对应关系

完整可运行代码

# 1. 示例数据构造,实际使用时替换为你自己的Original_df和Matching_df即可
Original_df <- tibble(
  original_id = 1:3,
  original_text = c(
    "I love drinking apple juice every morning",
    "The statistical report was released last Friday",
    "We plan to hike the mountain trail this weekend"
  )
)

Matching_df <- tibble(
  match_id = 1:4,
  match_text = c(
    "pineapple flavor is the best",
    "statistical analysis shows positive trend",
    "mountain climbing requires proper gear",
    "completely unrelated random content here"
  )
)

# 2. 匹配函数定义
# 参数n:要求连续重合的字母长度,默认5,可按需调整为6
# 参数ignore_case:是否忽略大小写,默认TRUE即不区分大小写
consecutive_match <- function(original_df, match_df, n = 5, ignore_case = TRUE) {
  # 文本清洗:仅保留英文字母,统一大小写
  clean_text <- function(txt) {
    txt %>% 
      str_remove_all("[^a-zA-Z]") %>% 
      {if(ignore_case) str_to_lower(.) else .}
  }
  
  # 切分指定长度的所有连续子串
  split_substr <- function(txt, len) {
    txt_len <- nchar(txt)
    if(txt_len < len) return(character(0))
    map_chr(1:(txt_len - len + 1), ~str_sub(txt, .x, .x + len - 1))
  }
  
  # 为匹配数据集建立子串索引
  match_table <- match_df %>%
    mutate(clean_txt = clean_text(match_text)) %>%
    mutate(sub_str = map(clean_txt, ~split_substr(.x, n))) %>%
    select(match_id, match_text, sub_str) %>%
    unnest(sub_str) %>%
    rename(common_str = sub_str) %>%
    distinct()
  
  # 原始数据集切分子串后关联索引,输出结果
  result <- original_df %>%
    mutate(clean_txt = clean_text(original_text)) %>%
    mutate(sub_str = map(clean_txt, ~split_substr(.x, n))) %>%
    select(original_id, original_text, sub_str) %>%
    unnest(sub_str) %>%
    rename(common_str = sub_str) %>%
    inner_join(match_table, by = "common_str", relationship = "many-to-many") %>%
    select(original_text, match_text) %>%
    distinct()
  
  return(result)
}

# 3. 运行匹配
# 按5个连续字母匹配
res_5 <- consecutive_match(Original_df, Matching_df, n = 5)
# 按6个连续字母匹配
res_6 <- consecutive_match(Original_df, Matching_df, n = 6)

使用说明

  • 示例数据运行后,可正确识别3组有效匹配:含"apple"的原句匹配到含"pineapple"的文本、含"statistical"的原句匹配到同词根的统计类文本、含"mountain"的原句匹配到登山相关文本,无公共连续字母的无关内容会被自动过滤
  • 实际使用时,直接把你本地的Original_df和Matching_df传入函数即可,两个数据集只需要保证存储文本的列名和示例一致(即原数据集文本列叫original_text,匹配数据集文本列叫match_text),如果列名不同,修改代码里对应列名即可
  • 性能表现:普通PC上处理两个各10万行的数据集,运行时间通常在1分钟以内,不存在Excel的行数上限问题
  • 若需要保留两个数据集里的其他字段(比如ID、分类标签等),在最后select步骤中加入对应字段名即可
  • 若需要区分大小写匹配,把函数参数ignore_case设为FALSE即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:12:22