如何在R中提取PDF正文并移除额外栏位信息以构建语料库
提取带侧边栏PDF正文的R解决方案
针对你需要从带额外信息栏的PDF中提取正文用于文本分析的需求,以下是几种实用的解决方法:
1. 基于固定列宽截取(快速简单)
PDF的侧边栏通常占据固定宽度的页面区域,你可以通过截取每行中正文起始位置后的内容来过滤侧边栏:
library(stringr) library(purrr) # 先查看前20行文本,确定正文起始的字符位置(比如第40位) head(tannhauser, 20) # 截取每行从指定位置开始的内容,清理空格并过滤空行 cleaned_text <- str_sub(tannhauser, start = 40) |> str_squish() |> keep(~ .x != "")
注:start参数的数值需要根据你的PDF实际布局调整,通过查看原始文本行的字符分布确定。
2. 正则匹配移除侧边栏(精准匹配特征)
先分析侧边栏的文本特征(比如位于行首/行尾、包含固定关键词、以大量空格与正文分隔),再编写针对性正则表达式移除:
# 示例:移除行首以非空格字符开头、后跟至少5个连续空格的侧边栏内容 cleaned_text <- str_remove_all(tannhauser, "^\\S.*?\\s{5,}") |> str_squish() |> keep(~ .x != "") # 如果侧边栏在每行结尾,用以下正则 # cleaned_text <- str_remove_all(tannhauser, "\\s{5,}\\S.*$") |> str_squish() |> keep(~ .x != "")
原理:^\\S.*?\\s{5,}匹配行首的非空格内容,直到出现至少5个连续空格(正文与侧边栏的分隔标志),将这部分侧边栏内容移除。
3. 基于PDF布局分析(最精准)
使用pdftools::pdf_data()获取每个文本块的坐标信息,通过筛选正文区域的x坐标来提取内容:
library(pdftools) library(dplyr) library(stringr) # 获取PDF所有页面的文本布局数据(包含x/y坐标、文本内容) pdf_layout <- pdf_data("sample.pdf") |> bind_rows(.id = "page") |> mutate(page = as.integer(page)) # 查看x坐标的分布,确定正文的x起始阈值(比如x>100) summary(pdf_layout$x) # 筛选正文区域的文本,按行合并内容 cleaned_text <- pdf_layout |> filter(x > 100) |> # 调整x值匹配你的正文起始位置 group_by(page, y) |> # 按页面和y坐标(同一行)分组 summarise(text = str_c(text, collapse = " "), .groups = "drop") |> arrange(page, y) |> pull(text) |> str_squish()
这种方法适合复杂布局的PDF,能精准区分侧边栏与正文的位置边界。
额外提示
- 先通过
head(tannhauser, 30)打印部分原始文本,观察侧边栏的位置、内容特征,再选择合适的方法; - 如果PDF是扫描件,需要先使用
tesseract包进行OCR识别,再进行正文提取; - 提取完成后,可以用
tidytext包将文本转换为语料库,开展搭配、关键词显著性分析。
内容的提问来源于stack exchange,提问作者Ashley Wu
相关产品推荐
相关产品推荐

