【问题标题】:Speed up text mining (and for loop) in R加速 R 中的文本挖掘(和 for 循环)
【发布时间】: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 &lt;- vector(); totalword &lt;- vector(),您应该预先将它们分配到正确的大小。这会给你一个明显的加速。另外,不要在循环的每次迭代中运行 write.csv - 它会简化在每次运行中覆盖结果,这需要时间并且没有多大意义
  • 谢谢,但我不确定我是否完全理解您的意思。能不能具体点,比如说我一共有10300个文档,我该怎么办?
  • 你的问题是不可重现的,所以很难确切地知道你在做什么。我所说的是一般 cmets,您不应该在循环中增长对象(相反,您应该预先分配它,查看 ?vector)并且您只是在每个循环操作中覆盖 csv 文件的结果,因此您应该只需将其从循环中删除,然后再写入
  • 我明白了,谢谢,你能给我一些关于如何修改代码的提示吗,特别是我应该把这个write.csv(x, file= "results.csv")放在哪里?

标签: r for-loop text frequency text-mining


【解决方案1】:

你从以下得到什么?

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

【讨论】:

  • 我使用随机的 500 个文件测试了我的代码(原始样本太大,运行时间太长)这是来自summaryRprof("profile1.out")pastebin.com/WnsTUYgr的输出
  • “在 1 上运行”是什么意思?
  • 分析您的代码会向您显示哪些行花费的时间最多,这可以帮助您加快速度。您应该只需要运行一次循环(即在单个文件上)来分析它..
猜你喜欢
  • 2017-04-10
  • 2015-07-17
  • 2011-12-17
  • 2023-03-31
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多