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

如何用R包识别不同数据框文本列的第1-4次匹配行索引?

解决方案:识别文本字符串列的多次匹配位置及关键词行索引

当然可以实现!我们可以用R里的tidyverse工具链(主要是stringr、dplyr和tidyr)来完成这个需求,不需要额外的小众包。下面是针对你给出的示例数据的完整解决方案:

1. 构造示例数据

首先先还原你提到的两个数据框:

library(tidyverse)

# 构造simpletext数据框
simpletext <- tibble(
  text = c(
    "does he go to that bar or for shopping?",
    "where was that bar that I wanted?",
    "I would like to go to the opera instead for shopping"
  )
)

# 构造keywords数据框,同时添加关键词的行索引列
keywords <- tibble(
  word = c("shopping", "opera", "bar"),
  keyword_index = row_number()  # 记录每个关键词在keywords中的行号
)

2. 实现匹配逻辑

我们会遍历每条文本,找到所有关键词的匹配位置,标记匹配顺序,并关联对应的关键词行索引:

# 为每个关键词构建完整单词匹配的正则表达式(避免部分匹配)
keyword_patterns <- keywords %>%
  mutate(pattern = str_c("\\b", str_replace_all(word, "\\W", "\\\\W"), "\\b"))

# 提取每条文本的所有匹配信息
match_results <- simpletext %>%
  mutate(text_id = row_number()) %>%  # 标记每条文本的行号
  rowwise() %>%
  mutate(
    matches = list(
      # 遍历所有关键词,找到当前文本中的所有匹配
      map_dfr(keyword_patterns$pattern, ~{
        locs <- str_locate_all(text, .x)[[1]]
        if(nrow(locs) > 0) {
          tibble(
            start = locs[,1],  # 匹配的起始位置
            end = locs[,2],    # 匹配的结束位置
            keyword_index = keyword_patterns$keyword_index[which(keyword_patterns$pattern == .x)],
            keyword = keyword_patterns$word[which(keyword_patterns$pattern == .x)]
          )
        } else {
          # 无匹配时返回NA
          tibble(start = NA, end = NA, keyword_index = NA, keyword = NA)
        }
      }) %>%
      drop_na() %>%  # 移除无匹配的行
      mutate(match_order = row_number())  # 标记是第几次匹配
    )
  ) %>%
  unnest(matches)  # 展开列表列

3. 整理成目标格式

将结果转成宽格式,清晰展示每条文本的第1-4次匹配信息:

final_results <- match_results %>%
  pivot_wider(
    id_cols = text_id,
    names_from = match_order,
    values_from = c(keyword_index, keyword, start, end),
    names_glue = "match_{match_order}_{.value}"
  ) %>%
  left_join(simpletext %>% mutate(text_id = row_number()), by = "text_id") %>%
  select(text_id, text, starts_with("match_"))

# 查看最终结果
print(final_results)

结果说明

运行上述代码后,你会得到直观的结构化结果:

  • text_id:simpletext中文本行的索引
  • text:原始文本内容
  • match_1_keyword_index:第1次匹配的关键词在keywords中的行号,以此类推到match_4_*
  • 同时还会返回每个匹配在文本中的起始/结束位置(如果不需要可以直接删除对应列)

针对你的示例数据,结果会清晰展示:

  • simpletext第1行文本的第1次匹配是bar(对应keywords第3行),第2次匹配是shopping(对应keywords第1行)
  • simpletext第2行文本的第1次匹配是bar(对应keywords第3行)
  • simpletext第3行文本的第1次匹配是opera(对应keywords第2行),第2次匹配是shopping(对应keywords第1行)

内容的提问来源于stack exchange,提问作者Stathis G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:55:03