Попытка извлечь подмножество страниц из каждого PDF-файла в каталоге с 70 PDF-файлами. - PullRequest
1 голос
/ 18 октября 2019

Я использую tidyverse, tidytext и pdftools. Я хочу разобрать слова в каталоге из 70 файлов PDF. Я использую эти инструменты, чтобы сделать это успешно, но код ниже захватывает все страницы вместо подмножества, которое я хочу. Мне нужно пропустить первые две страницы и выбрать страницу 3 до конца файла для каждого файла PDF.

directory <- "Student_Artifacts/"
pdfs <- paste(directory, "/", list.files(directory, pattern = "*.pdf"), sep = "")
pdf_names <- list.files(directory, pattern = "*.pdf")
pdfs_text <- map(pdfs, (pdf_text))
my_data <- data_frame(document = pdf_names, text = pdfs_text)

Я понял, что, поместив [3:12] в такие скобки, я могу взять документы с 3 по 12:

pdfs_text <- map(pdfs, (pdf_text))[3:12]

Это не то, что я хочу. Как использовать спецификацию [3:12] для извлечения нужных мне страниц из каждого файла PDF?

1 Ответ

2 голосов
/ 20 октября 2019

Во-первых, вы можете индексировать с 3-й по 12-ю страницу из каждого PDF в пределах отображения pdf_text с небольшими изменениями:

pdfs_text <- map(pdfs, ~ pdf_text(.x)[3:12])

Но это предполагает, что все 70из ваших PDF-файлов 13 страниц. Это также может быть медленным, особенно если некоторые из них очень большие. Попробуйте что-то вроде этого (я использовал демонстрационную документацию R в PDF):

library(furrr)
#> Loading required package: future
library(pdftools)
library(tidyverse)
library(magrittr)
#> 
#> Attaching package: 'magrittr'
#> The following object is masked from 'package:purrr':
#> 
#>     set_names
#> The following object is masked from 'package:tidyr':
#> 
#>     extract

plan(multiprocess)

directory <- file.path(R.home("doc"), "manual")
pdf_names <- list.files(directory, pattern = "\\.pdf$", full.names = TRUE)
# Drop the full reference manual since it's so big
pdf_names %<>% str_subset("fullrefman.pdf", negate = TRUE)
pdfs_text <- future_map(pdf_names, pdf_text, .progress = TRUE)
#> Progress: ----------------------------------------------------------------------------------- 100%

my_data   <- tibble(
  document = basename(pdf_names), 
  text     = map_chr(pdfs_text, ~ {
    str_c("Page ", seq_along(.x), ": ", str_squish(.x)) %>% 
      tail(-2) %>% 
      str_c(collapse = "; ")
  })
)

my_data
#> # A tibble: 6 x 2
#>   document    text                                                         
#>   <chr>       <chr>                                                        
#> 1 R-admin.pdf "Page 3: i Table of Contents 1 Obtaining R . . . . . . . . .~
#> 2 R-data.pdf  "Page 3: i Table of Contents Acknowledgements . . . . . . . ~
#> 3 R-exts.pdf  "Page 3: i Table of Contents Acknowledgements . . . . . . . ~
#> 4 R-intro.pdf "Page 3: i Table of Contents Preface . . . . . . . . . . . .~
#> 5 R-ints.pdf  "Page 3: i Table of Contents 1 R Internal Structures . . . .~
#> 6 R-lang.pdf  "Page 3: i Table of Contents 1 Introduction . . . . . . . . ~

Создано в 2019-10-19 с помощью пакета Представление (v0.3.0)

Основные положения:

  1. tail(-2) выполняет работу, которая вас больше всего интересует: опуская первые две страницы. Обычно вы используете tail() для захвата последних n страниц, но это также идеально подходит для захвата всех страниц, кроме первых n - просто используйте отрицательные.
  2. plan() и future_map()распараллеливание чтения PDF, когда каждое из ваших виртуальных ядер читает по одному PDF за раз. Кроме того, индикатор выполнения!
  3. Я делаю некоторую причудливую конкатенацию строк в конструкции text здесь, так как кажется, что вы в конечном итоге хотите получить полный текст страниц каждого документа в одной ячейке вашей финальной таблицы. Я вставляю «; Page [n]:» между текстом каждой страницы, чтобы данные не терялись, и я также удаляю лишние пробелы по всему тексту, поскольку обычно есть тонны.
...