2016-02-14 40 views
-1

我是文本挖掘數以千計的文檔(基本上是做頻率計數),並想知道是否有其他方法來加速以下過程?目前運行整個分析需要超過10個小時。謝謝(來自R初學者)。加快R中的文本挖掘(和循環)

sessionInfo() 
#R version 3.2.3 (2015-12-10) 

library(bitops) 
library(RCurl) 
library(XML) 
library(stringr) 
library(tm) 

setwd("F:/testing_folder") 
path = "F:/testing_folder" 

file.names <- dir(path, pattern =".txt") 
filename <- vector() 
totalword <- vector() 

system.time(
    for(i in 1:length(file.names)){ 
    text.v <- scan(file.names[i], what="character", sep="\n",encoding = "UTF-8") 
    report.v <- paste(text.v, collapse=" ") 

    #Count total number of words 
    words.l <- strsplit(report.v, "\\W") 
    word.v <- unlist(words.l) 
    not.blanks.v <- which(word.v!="") 
    word.v <- word.v[not.blanks.v] 
    totalword <- append(totalword,length(word.v)) 

    filename <- append(filename,print(file.names[i])) 
    x <- data.frame(filename,totalword) 
    write.csv(x, file= "results.csv") #export results 
    } 
) 
+1

而不是'filename < - vector(); totalword < - vector()'你應該預先分配它們到正確的大小。這會給你一個明顯的加速。另外,不要在循環的每次迭代中運行'write.csv' - 它會簡化覆蓋每次運行的結果,這需要時間並且沒有多大意義 –

+0

謝謝,但我不確定我完全理解你的意思是。比如說,如果我總共有10,300份文件,你能說得更具體嗎?我應該怎麼做? – kxiang

+0

你的問題不可重現,所以很難確切知道你在做什麼。我所說的是一般性的評論,你不應該在一個循環中增長一個對象(相反,你應該預先分配它,查看'vector'),並且你只是在每個循環操作中覆蓋了csv文件的結果,因此你應該簡單地將它從循環中移除並寫入之後 –

回答

0

你從下面得到什麼?

Rprof("profile1.out", line.profiling=TRUE) 
source("http://pastebin.com/raw/kFGCse5s") 
Rprof(NULL) 
proftable("profile1.out", lines=10) 
+0

我使用隨機的500個文件測試了我的代碼(原始樣本太大,需要太多時間才能運行),這裏是'summaryRprof(「profile1.out」)的輸出'http://pastebin.com/WnsTUYgr – kxiang

+0

只需運行它1 .. – geotheory

+0

你是什麼意思「在1上運行」? – kxiang