如何在R语言中批量提取文本中两类关键词的所有组合生成数据框
高效实现R语言中关键词对的匹配组合提取
针对长关键词列表的场景,推荐使用向量化字符串匹配+嵌套数据展开+内连接的方案,替代暴力grepl+merge,大幅提升效率。以下是具体实现:
依赖包加载
library(tidyverse) library(stringr)
测试数据构造
# 示例数据框(ID+文本列) df <- tibble( ID = c(1, 2, 3), text = c( "苹果和香蕉都是水果,还有橙子", "猫和狗是宠物,兔子也是", "汽车和自行车属于交通工具,火车也是" ) ) # 示例关键词列表 listX <- c("苹果", "猫", "汽车") listY <- c("香蕉", "狗", "自行车")
核心实现步骤
1. 提取每行匹配的listX关键词
使用str_extract_all一次性提取文本中所有匹配的X关键词,再通过unnest展开成ID-X的一对一关系:
# 可选:添加\\b边界符避免部分字符匹配(如"苹果"不会匹配"苹果派") pattern_x <- str_c("\\b", listX, "\\b", collapse = "|") matches_x <- df %>% mutate(X = str_extract_all(text, pattern_x)) %>% unnest(X) %>% filter(!is.na(X)) # 过滤无匹配的行
2. 提取每行匹配的listY关键词
同X关键词的提取逻辑:
pattern_y <- str_c("\\b", listY, "\\b", collapse = "|") matches_y <- df %>% mutate(Y = str_extract_all(text, pattern_y)) %>% unnest(Y) %>% filter(!is.na(Y))
3. 生成X-Y匹配组合
通过ID内连接两个匹配表,自动生成该行所有X-Y的笛卡尔积组合:
result <- matches_x %>% inner_join(matches_y, by = "ID")
结果展示
执行print(result)会得到如下输出:
# A tibble: 3 × 3 ID X Y <dbl> <chr> <chr> 1 1 苹果 香蕉 2 2 猫 狗 3 3 汽车 自行车
效率优势
str_extract_all是向量化操作,比循环调用grepl快数倍,尤其当关键词列表和数据行数较多时;- 仅保留有匹配的行/关键词,避免了暴力merge产生的大量冗余数据;
- 逻辑清晰,易于扩展(如添加更多关键词列表)。
内容的提问来源于stack exchange,提问作者tlmoore
相关产品推荐
相关产品推荐

