【发布时间】:2016-02-14 18:50:32
【问题描述】:
我正在对数千个文档进行文本挖掘(基本上是进行频率计数),并且想知道是否有其他方法可以加快以下过程?目前,运行整个分析需要 10 多个小时。谢谢(来自 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
}
)
【问题讨论】:
-
而不是
filename <- vector(); totalword <- vector(),您应该预先将它们分配到正确的大小。这会给你一个明显的加速。另外,不要在循环的每次迭代中运行write.csv- 它会简化在每次运行中覆盖结果,这需要时间并且没有多大意义 -
谢谢,但我不确定我是否完全理解您的意思。能不能具体点,比如说我一共有10300个文档,我该怎么办?
-
你的问题是不可重现的,所以很难确切地知道你在做什么。我所说的是一般 cmets,您不应该在循环中增长对象(相反,您应该预先分配它,查看
?vector)并且您只是在每个循环操作中覆盖 csv 文件的结果,因此您应该只需将其从循环中删除,然后再写入 -
我明白了,谢谢,你能给我一些关于如何修改代码的提示吗,特别是我应该把这个
write.csv(x, file= "results.csv")放在哪里?
标签: r for-loop text frequency text-mining