如何将R数据框的文章观测拆分为带对应标题的段落子观测
实现方案
核心思路是将单篇文章的段落拆分逻辑封装为可复用的函数,批量应用到全量文本后展开为「一段一行」的长表结构,自动关联对应文章标题。
前置注意事项
R语言中正则表达式的特殊字符需要用双反斜杠转义,你原代码中的正则、反斜杠匹配规则需要调整写法,否则会报错或匹配失效。
推荐方案:tidyverse 实现(代码最简洁)
# 加载依赖包 library(tidyverse) # 封装单篇文章的段落拆分函数 split_paragraph <- function(text) { pattern = "\\bM(?:rs?|s)\\.\\s" aa <- str_replace_all(text, pattern, "XXXX") bb <- unlist(strsplit(aa, "XXXX")) # 兼容无匹配的空文本场景,避免索引报错 if(length(bb) <= 1) return(character(0)) cc <- bb[-1] dd <- gsub("[\\\\]", " ", cc) paragraph_vec <- gsub("[^[:alnum:]]", " ", dd) # 可选:去除空白段落、多余空格 paragraph_vec <- str_squish(paragraph_vec) paragraph_vec[paragraph_vec != ""] } # 批量处理全量数据 result_df <- df %>% # 对每篇文章调用拆分函数,生成段落列表列 mutate(paragraph = map(text, split_paragraph)) %>% # 展开列表列,每段对应一行,自动保留所属文章的title字段 unnest(paragraph) %>% # 可选:仅保留需要的字段 select(title, paragraph)
最终输出的result_df 中每一行对应一个独立段落,title 字段即为该段落所属文章的标题。
基础R实现(无需额外安装包)
# 复用拆分函数 split_paragraph <- function(text) { pattern = "\\bM(?:rs?|s)\\.\\s" aa <- gsub(pattern, "XXXX", text, perl = TRUE) bb <- unlist(strsplit(aa, "XXXX")) if(length(bb) <= 1) return(character(0)) cc <- bb[-1] dd <- gsub("[\\\\]", " ", cc) paragraph_vec <- gsub("[^[:alnum:]]", " ", dd) paragraph_vec <- trimws(paragraph_vec) paragraph_vec[paragraph_vec != ""] } # 循环处理所有文章 para_list <- lapply(1:nrow(df), function(i) { para <- split_paragraph(df$text[i]) if(length(para) == 0) return(NULL) data.frame(title = df$title[i], paragraph = para, stringsAsFactors = FALSE) }) result_df <- do.call(rbind, para_list)
内容的提问来源于stack exchange,提问作者Foulball
相关产品推荐
相关产品推荐

