如何用R提取文本各段落首句并保留原有段落结构?
R 语言提取段落首句实现方案
首先明确默认分隔规则,你可以根据自己的文本格式调整规则:
- 段落分隔:默认以连续2个及以上换行符作为段落边界
- 句子分隔:默认以中文句号
。、感叹号!、问号?,或英文./!/?作为句子结束标记
显式Loop实现(符合你的需求)
# 替换为你自己的输入文本 input_text <- "这是第一段的第一句话。这是第一段的第二句话,后面还有更多内容。 这是第二段的开头,也就是我们要提取的首句?第二段剩下的内容不需要提取。 第三段的第一句在这里。第三段还有其他内容,全部忽略。" # 步骤1:拆分原始文本为独立段落 paragraphs <- unlist(strsplit(input_text, split = "\\n\\s*\\n")) # 拆分规则适配两个换行中间有空白字符的排版场景 # 步骤2:初始化结果存储向量 first_sentences <- c() # 步骤3:遍历每个段落提取首句 for (p in paragraphs) { # 匹配第一个句子结束标记的位置 end_pos <- regexpr("[。!?.!?]", p)[1] if (end_pos == -1) { # 段落无结束标记时直接取整段 first_sent <- p } else { # 提取从开头到结束标记的完整首句 first_sent <- substr(p, 1, end_pos) } first_sentences <- c(first_sentences, first_sent) } # 步骤4:拼接为首句各成独立段落的结果 output_text <- paste(first_sentences, collapse = "\n\n") # 打印输出结果 cat(output_text)
运行上述代码得到的输出如下:
这是第一段的第一句话。
这是第二段的开头,也就是我们要提取的首句?
第三段的第一句在这里。
规则调整说明
- 如果你的文本段落用单个换行分隔,把拆分的
split参数改为\\n即可 - 如果需要避免英文缩写(比如
Mr.)的误判,可以调整正则匹配逻辑增加缩写场景过滤 - 处理大文本时可以用
purrr包的向量化操作替换loop,运行效率更高:
library(purrr) first_sentences <- map_chr(paragraphs, function(p) { end_pos <- regexpr("[。!?.!?]", p)[1] ifelse(end_pos == -1, p, substr(p, 1, end_pos)) })
内容的提问来源于stack exchange,提问作者Imran Luqman
相关产品推荐
相关产品推荐

