Попытка извлечь подмножество страниц из каждого PDF-файла в каталог с 70 PDF-файлами
Я использую 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 ответ
Во-первых, вы можете проиндексировать с 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 . . . . . . . . ~
Создано 19.10.2019 пакетом REPEX (v0.3.0)
Основные моменты:
- В
tail(-2)
выполняет работу, которая вас больше всего волнует: отбрасывает первые две страницы. Обычно вы используетеtail()
схватить последнийn
страниц, но он также идеально подходит для захвата всех, кроме первыхn
страницы - просто используйте негатив. - В
plan()
а такжеfuture_map()
распараллеливают чтение PDF-файлов, при этом каждое из ваших виртуальных ядер читает по одному PDF-файлу за раз. Также индикатор выполнения! - Я делаю причудливую конкатенацию строк при построении
text
здесь, поскольку кажется, что в конечном итоге вам нужен полный текст каждой страницы документа в одной ячейке в вашей итоговой таблице. Я вставляю "; Page [n]: " между текстом каждой страницы, чтобы данные не терялись, и я также удаляю лишние пробелы по всему тексту, поскольку обычно их много.