我需要提取大量 PDF 文档的特定部分。 PDF 是大而杂乱的报告,包含各种数字、字母和其他信息。这些文件的长度不同,但具有统一的内容和部分。这些文档有一个目录,其中包含章节名称。例如
Table of Content:
Item 1. Business 1
Item 1A. Risk Factors 2
Item 1B. Unresolved Staff Comments 5
Item 2. Properties 10
Item N........
..........text I do not care about...........
Item 1A. Risk Factors
.....text I am interested in getting.......
(section ends)
Item 1B. Unresolved Staff Comments
..........text I do not care about...........
我可以毫无问题地阅读它们并将其作为一个整体进行分析,但我只需要取出“第 1A 项。风险因素” 和 “第 1B 项。 Unresolved 人员”之间的文本评论”。 我使用了 pdftools、tm、quanteda 和 readtext 包 这是我用来读入文档的代码部分。我创建了一个目录,在其中放置 PDF,并将其命名为“PDF”,在另一个目录中,R 将转换为“.txt”文件。
pdf_directory <- paste0(getwd(), "/PDF")
txt_directory <- paste0(getwd(), "/Texts")
然后我使用“list.files”函数创建文件列表。
files <- list.files(pdf_directory, pattern = ".pdf", recursive = FALSE,
full.names = TRUE)
files
之后,我继续创建一个提取文件名的函数。
extract <- function(filename) {
print(filename)
try({
text <- pdf_text(filename)
})
f <- gsub("(.*)/([^/]*).pdf", "\\2", filename)
write(text, file.path(txt_directory, paste0(f, ".txt")))
}
for (file in files) {
extract(file)
}
完成这一步后,我陷入困境,不知道如何继续。我不确定在读取数据时是否应该尝试提取感兴趣的部分,因此,我想,我将不得不与创建函数的 block 进行斗争 - f <- gsub("(.*)/([^/]*).pdf", "\\2", filename)
?我对这些问题表示歉意,但我正在自学。
我还尝试仅在一个文件而不是语料库上使用以下代码:
start <- grep("^\\*\\*\\* ITEM 1A. RISK FACTORS", text_df$text) + 1
stop <- grep("^ITEM 1B. UNRESOLVED STAFF COMMENTS", text_df$text) - 1
lines <- raw[start:stop]
scd <- paste0(".*",start,"(.*)","\n",stop,".*")
gsub(scd,"\\1", name_of_file)
但这对我没有任何帮助。
最佳答案
我真的不明白为什么你要先将文件写入txt,所以我一次性完成了这一切。
让我有点失望的是你的图案有很多额外的空间。您可以使用正则表达式 \\s+
library(stringr)
files <- c("https://corporate.exxonmobil.com/-/media/Global/Files/investor-relations/investor-relations-publications-archive/ExxonMobil-2016-Form-10-K.pdf",
"https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf")
relevant_l <- lapply(files, function(file) {
# print status message
message("processing: ", basename(file))
lines <- unlist(stringr::str_split(pdftools::pdf_text(file), "\n"))
start <- stringr::str_which(lines, "ITEM 1A.\\s+RISK FACTORS")
end <- stringr::str_which(lines, "ITEM 1B.\\s+UNRESOLVED STAFF COMMENTS")
# cover a few different outcomes depending on what was found
if (length(start) == 1 & length(end) == 1) {
relevant <- lines[start:end]
} else if (length(start) == 0 | length(end) == 0) {
relevant <- "Pattern not found"
} else {
relevant <- "Problems found"
}
return(relevant)
})
#> processing: ExxonMobil-2016-Form-10-K.pdf
#> processing: dummy.pdf
names(relevant_l) <- basename(files)
sapply(relevant_l, head)
#> $`ExxonMobil-2016-Form-10-K.pdf`
#> [1] "ITEM 1A. RISK FACTORS\r"
#> [2] "ExxonMobil’s financial and operating results are subject to a variety of risks inherent in the global oil, gas, and petrochemical\r"
#> [3] "businesses. Many of these risk factors are not within the Company’s control and could adversely affect our business, our financial\r"
#> [4] "and operating results, or our financial condition. These risk factors include:\r"
#> [5] "Supply and Demand\r"
#> [6] "The oil, gas, and petrochemical businesses are fundamentally commodity businesses. This means ExxonMobil’s operations and\r"
#>
#> $dummy.pdf
#> [1] "Pattern not found"
我将以列表形式返回结果,然后使用原始文件名来命名列表元素。如果您有疑问,请告诉我。我使用 stringr
包,因为它在处理字符串时快速且一致。但命令 str_which
和 grep
非常相似。
关于r - 如何在R中提取杂乱PDF的特定部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63285596/