2013-12-21 4 views
0

나는 R을 사용하여 pdf 파일을 txt 파일로 변환 할 수있는 프로그램이 있습니다.이 프로그램을 변환하려는 pdf 파일의 디렉토리에 어떻게 적용합니까? txt 파일로? 당신이하려는 파일을디렉토리에있는 파일 목록에서 스크립트를 실행하는 중 R

# download pdftotxt from 
# ftp://ftp.foolabs.com/pub/xpdf/xpdfbin-win-3.03.zip 
# and extract to your program files folder 

# here is a pdf for mining 
url <- "http://www.noisyroom.net/blog/RomneySpeech072912.pdf" 
dest <- tempfile(fileext = ".pdf") 
download.file(url, dest, mode = "wb") 

# set path to pdftotxt.exe and convert pdf to text 
exe <- "C:\\Program Files\\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); shell.exec(filetxt) # strangely the first try always throws an error.. 


# do something with it, i.e. a simple word cloud 
library(tm) 
library(wordcloud) 
library(Rstem) 

txt <- readLines(filetxt) # don't mind warning.. 

txt <- tolower(txt) 
txt <- removeWords(txt, c("\\f", stopwords())) 

corpus <- Corpus(VectorSource(txt)) 
corpus <- tm_map(corpus, removePunctuation) 
tdm <- TermDocumentMatrix(corpus) 
m <- as.matrix(tdm) 
d <- data.frame(freq = sort(rowSums(m), decreasing = TRUE)) 

# Stem words 
d$stem <- wordStem(row.names(d), language = "english") 

# and put words to column, otherwise they would be lost when aggregating 
d$word <- row.names(d) 

# remove web address (very long string): 
d <- d[nchar(row.names(d)) < 20, ] 

# aggregate freqeuncy by word stem and 
# keep first words.. 
agg_freq <- aggregate(freq ~ stem, data = d, sum) 
agg_word <- aggregate(word ~ stem, data = d, function(x) x[1]) 

d <- cbind(freq = agg_freq[, 2], agg_word) 

# sort by frequency 
d <- d[order(d$freq, decreasing = T), ] 

# print wordcloud: 
wordcloud(d$word, d$freq) 

# remove files 
file.remove(dir(tempdir(), full.name=T)) # remove files 
+1

lapply 및 list.files? – Thomas

+2

여기에 몇 가지 스레드가 있습니다. 이것은 당신이 겪고있는 일에 아주 가깝습니다. http://stackoverflow.com/questions/20083454/run-every-file-in-a-folder/20083517#20083517 스크립트를 함수로 변환하여 'sapply'에 전달해야합니다. –

+0

@ RomanLuštrik 팁 주셔서 감사! 이 방법을 URL 벡터 대신 파일 디렉토리에 어떻게 적용할까요? – stochastiq

답변

4

이있는 경우 목록 (실제로는 벡터)의 URL :

는 지금까지 만 PDF 문서에 연결된 단일 URL에서 작동 한 코드입니다 처리하려면 프로 시저를 함수로 변환하고 모든 URL에이 프로 시저를 적용하면됩니다. 의 라인을 따라 뭔가를보십시오 : 각 목록 요소는 하나 개의 문자, PDF에 대한 URL입니다

crawlPDFs <- function(x) { 
    # x is a character string to the url on the web 
    url <- x 
    dest <- tempfile(fileext = ".pdf") 
    download.file(url, dest, mode = "wb") 

    # set path to pdftotxt.exe and convert pdf to text 
    exe <- "C:\\Program Files\\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); shell.exec(filetxt) # strangely the first try always throws an error.. 


    # do something with it, i.e. a simple word cloud 
    library(tm) 
    library(wordcloud) 
    library(Rstem) 

    txt <- readLines(filetxt) # don't mind warning.. 

    txt <- tolower(txt) 
    txt <- removeWords(txt, c("\\f", stopwords())) 

    corpus <- Corpus(VectorSource(txt)) 
    corpus <- tm_map(corpus, removePunctuation) 
    tdm <- TermDocumentMatrix(corpus) 
    m <- as.matrix(tdm) 
    d <- data.frame(freq = sort(rowSums(m), decreasing = TRUE)) 

    # Stem words 
    d$stem <- wordStem(row.names(d), language = "english") 

    # and put words to column, otherwise they would be lost when aggregating 
    d$word <- row.names(d) 

    # remove web address (very long string): 
    d <- d[nchar(row.names(d)) < 20, ] 

    # aggregate freqeuncy by word stem and 
    # keep first words.. 
    agg_freq <- aggregate(freq ~ stem, data = d, sum) 
    agg_word <- aggregate(word ~ stem, data = d, function(x) x[1]) 

    d <- cbind(freq = agg_freq[, 2], agg_word) 

    # sort by frequency 
    d <- d[order(d$freq, decreasing = T), ] 

    # print wordcloud: 
    wordcloud(d$word, d$freq) 

    # remove files 
    file.remove(dir(tempdir(), full.name=T)) # remove files 
} 

sapply(list.of.urls, FUN = crawlPDFs) 

list.of.urls이 문자 벡터 또는 목록이 될 수 있습니다.