web-dev-qa-db-fra.com

Utilisez R pour convertir les fichiers PDF en fichiers texte pour l'exploration de texte

J'ai près d'un millier d'articles de revues pdf dans un dossier. J'ai besoin de texto le mien sur tous les résumés d'articles du dossier entier. Maintenant, je fais ce qui suit:

dest <- "~/A1.pdf"

# set path to pdftotxt.exe and convert pdf to text
exe <- "C:/Program Files (x86)/xpdfbin-win-3.03/bin32/pdftotext.exe"
system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = F)

# get txt-file name and open it
filetxt <- sub(".pdf", ".txt", dest)
Shell.exec(filetxt)

Par cela, je convertis un fichier pdf en un fichier .txt, puis je copie le résumé dans un autre fichier .txt et le compile manuellement. Ce travail est gênant.

Comment puis-je lire tous les articles individuels du dossier et les convertir en fichier .txt qui ne contient que le résumé de chaque article. Cela peut être fait en limitant le contenu entre ABSTRACT et INTRODUCTION dans chaque article; mais je ne suis pas en mesure de le faire. Toute aide est appréciée.

17
S Das

Oui, pas vraiment une question R comme le note IShouldBuyABoat, mais quelque chose que R ne peut faire qu'avec des contorsions mineures ...

Utilisez R pour convertir PDF fichiers en fichiers txt ...

# folder with 1000s of PDFs
dest <- "C:\\Users\\Desktop"

# make a vector of PDF file names
myfiles <- list.files(path = dest, pattern = "pdf",  full.names = TRUE)

# convert each PDF file that is named in the vector into a text file 
# text file is created in the same directory as the PDFs
# note that my pdftotext.exe is in a different location to yours
lapply(myfiles, function(i) system(paste('"C:/Program Files/xpdf/bin64/pdftotext.exe"', 
             paste0('"', i, '"')), wait = FALSE) )

Extraire uniquement les résumés des fichiers txt ...

# if you just want the abstracts, we can use regex to extract that part of
# each txt file, Assumes that the abstract is always between the words 'Abstract'
# and 'Introduction'
mytxtfiles <- list.files(path = dest, pattern = "txt",  full.names = TRUE)
abstracts <- lapply(mytxtfiles, function(i) {
  j <- paste0(scan(i, what = character()), collapse = " ")
  regmatches(j, gregexpr("(?<=Abstract).*?(?=Introduction)", j, Perl=TRUE))
})

Écrire des résumés dans des fichiers txt séparés ...

# write abstracts as txt files 
# (or use them in the list for whatever you want to do next)
lapply(1:length(abstracts),  function(i) write.table(abstracts[i], file=paste(mytxtfiles[i], "abstract", "txt", sep="."), quote = FALSE, row.names = FALSE, col.names = FALSE, eol = " " ))

Et maintenant, vous êtes prêt à fouiller du texte sur les résumés.

21
Ben

Nous pouvons utiliser la bibliothèque pdftools

library(pdftools)
# you can use an url or a path
pdf_url <- "https://cran.r-project.org/web/packages/pdftools/pdftools.pdf"

# `pdf_text` converts it to a list
list_output <- pdftools::pdf_text('https://cran.r-project.org/web/packages/pdftools/pdftools.pdf')

# you get an element by page
length(list_output) # 5 elements for a 5 page pdf

# let's print the 5th
cat(list_output[[5]])
# Index
# pdf_attachments (pdf_info), 2
# pdf_convert (pdf_render_page), 3
# pdf_fonts (pdf_info), 2
# pdf_info, 2, 3
# pdf_render_page, 2, 3
# pdf_text, 2
# pdf_text (pdf_info), 2
# pdf_toc (pdf_info), 2
# pdftools (pdf_info), 2
# poppler_config (pdf_render_page), 3
# render (pdf_render_page), 3
# suppressMessages, 2
# 5

Pour extraire les résumés des articles, OP choisit d'extraire le contenu entre Abstract et Introduction.

Nous allons prendre une liste de CRAN pdfs et extraire le (s) auteur (s) comme texte entre Author et Maintainer (j'en ai sélectionné quelques-uns qui avaient un format compatible).

Pour cela, nous bouclons sur notre liste d'URL puis extrayons le contenu, réduisons tous les textes en un pour chaque pdf, puis extrayons les informations pertinentes avec regex.

urls <- c(pdftools = "https://cran.r-project.org/web/packages/pdftools/pdftools.pdf",
          Rcpp     = "https://cran.r-project.org/web/packages/Rcpp/Rcpp.pdf",
          jpeg     = "https://cran.r-project.org/web/packages/jpeg/jpeg.pdf")

lapply(urls,function(url){
  list_output <- pdftools::pdf_text(url)
  text_output <- gsub('(\\s|\r|\n)+',' ',paste(unlist(list_output),collapse=" "))
  trimws(regmatches(text_output, gregexpr("(?<=Author).*?(?=Maintainer)", text_output, Perl=TRUE))[[1]][1])
})

# $pdftools
# [1] "Jeroen Ooms"
# 
# $Rcpp
# [1] "Dirk Eddelbuettel, Romain Francois, JJ Allaire, Kevin Ushey, Qiang Kou, Nathan Russell, Douglas Bates and John Chambers"
# 
# $jpeg
# [1] "Simon Urbanek <[email protected]>"
6
Moody_Mudskipper