r - 如何在R中提取杂乱PDF的特定部分?

标签 r pdf text nlp pdftools

我需要提取大量 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_whichgrep 非常相似。

关于r - 如何在R中提取杂乱PDF的特定部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63285596/

相关文章:

r - 在具有季节性周期的时间序列中插入缺失值

减少/删除包括 wordclouds 在内的 Shiny 应用程序中的图边距

Android PDF阅读器从头开始

algorithm - 比较两个英文字符串的相似性

r - 将 geom_text 与 geom_jitter 点对齐

R Shiny : UI Inputs format

java - 如何使用 PDFBox 从 PDF 中删除特定图像

javascript - 如何使用 cordova 和 angularjs 在混合移动应用程序中上传 pdf 文件?

python - 如何根据其中一个子字符串对字符串进行分组?

java - 始终列出一个 [JAVA]