整洁文本从文件夹中读取文件

4
我正在尝试将一个pdf文件夹读入到R中的数据框中。我可以使用pdftools库和pdf_text(filepath)函数读取单个PDF文件。理想情况下,我希望能够获取一系列pdf文件的作者和标题,并将它们推入具有这些列的数据框中,以便我可以在文本上使用基本的tidytext函数。目前,对于单个文件,我只需使用:
library(pdftools)
library(tidytext)
library(dplyr)
txt <- pdf_text("filpath")
txt <- data_frame(txt)
txt %>%
     unnest_tokens(word, txt)

我这里有一个只包含单词的数据框(dataframe),现在我想要将文章展开,生成标题和作者两列,并构建成一个新的数据框。


你可以使用 files <- list.files(".pdf") 获取文件列表,然后使用 txtList <- sapply(files,pdf_text) 将它们读入到一个列表中。希望你也能从其中一个文件中提取出标题/作者 - 不过如果你不分享数据示例的话,这是不可能的。 - Andrew Gustar
Andrew,非常感谢。我实际上能够按照您的建议将文本作为列表输入,但是在将其转换为数据框以便整理文本方面遇到了困难。 - jfkoehler
2个回答

7

要在工作目录中查找所有PDF文件,您可以使用list.files命令并带上参数:

all_pdfs <- list.files(pattern = ".pdf$")
all_pdfs对象将成为一个字符向量,其中包含所有的文件名。
然后,您可以设置一个管道来读取所有的PDF,并使用purrr中的map函数和tidytext对它们进行展开。如果需要,您可以在map()内使用mutate()为每一行添加文件名注释。
library(pdftools)
library(tidyverse)
library(tidytext)

map_df(all_pdfs, ~ data_frame(txt = pdf_text(.x)) %>%
    mutate(filename = .x) %>%
    unnest_tokens(word, txt))

要获取标题和作者列,您需要进行一些更高级的操作,具体取决于您在哪里获得这些信息。也许可以在展开之前对txtfilename使用正则表达式?


非常好,能够很好地读取所有文本。我该如何将文件名包含在列中? - jfkoehler
太好了!我在这个回答中详细阐述了摘要功能和停用词:https://dev59.com/42sz5IYBdhLWcg3wZm3Q#60321956 - Stan

0
可以建议添加:basename(.x)。如果您使用list.files()中的full_names = TRUE选项(如我所做),则这将删除完整路径信息。
df <- map_df(all_pdfs[3:5], ~ data_frame(txt = pdf_text(.x)) %>%
    mutate(filename = basename(.x)) %>%
    unnest_tokens(word, txt))

如果您遇到任何PDF解析错误..."Error in poppler_pdf_text(loadfile(pdf), opw, upw) : PDF parsing failure."...,您可以尝试使用safe_pdf_text <- purrr::safely(pdf_text)创建pdf_text()函数的safe版本。有关使用{purrr}包的更多信息,请参见Bruno Rodrigues的博客http://www.brodrigues.co/blog/2017-03-24-lesser_known_purrr/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接