R语言提取GO词元搭配时如何关联原数据行id值
核心问题:你当前的写法直接对整列文本执行提取后统一压平,丢失了每个匹配结果和原数据行id的对应关系,在提取阶段保留行对应关系再合并即可实现需求。
方法1:基于tidyverse列表列+unnest实现(推荐)
# 加载依赖包 library(tidyverse) # 原有词形、匹配规则定义不变 lemma_GO <- c("go", "goes", "going", "gone", "went", "gon na") pattern_GO <- paste0("\\b(", paste0(lemma_GO, collapse = "|"), ")\\b") # 提取+关联id df_GO <- df %>% # 先将每行的提取结果存为列表列 mutate( left = str_extract_all(go, paste0("('?\\b[a-z']+\\b|^)(?=\\s?", pattern_GO, ")")), node = str_extract_all(go, pattern_GO), right = str_extract_all(go, paste0("(?<=\\s?", pattern_GO, "\\s?)('?\\b[a-z']+\\b|$)")) ) %>% # 移除原文本列,展开列表列得到结构化结果 select(-go) %>% unnest(cols = c(left, node, right))
方法2:逐行处理绑定id
library(tidyverse) lemma_GO <- c("go", "goes", "going", "gone", "went", "gon na") pattern_GO <- paste0("\\b(", paste0(lemma_GO, collapse = "|"), ")\\b") df_GO <- df %>% pmap_dfr(function(id, go) { left <- str_extract_all(go, paste0("('?\\b[a-z']+\\b|^)(?=\\s?", pattern_GO, ")"))[[1]] node <- str_extract_all(go, pattern_GO)[[1]] right <- str_extract_all(go, paste0("(?<=\\s?", pattern_GO, "\\s?)('?\\b[a-z']+\\b|$)"))[[1]] tibble(left, node, right, id) })
两种方法输出的df_GO都和你给出的期望结果完全一致,包含关联的原数据id字段。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

