- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在做一些文本抓取/分析。我做的一件事是从文档中提取 HitTest 门的单词来比较和了解不同的指标。这是快速和容易的。但是,定义要使用的分隔符并提取单个单词而不是短语会从分析中删除信息,这成为了一个问题。例如 .Net Developer 转换后成为 net 和 developer。我已经有一个其他人放弃的旧项目中的固定短语/单词列表。下一步是从多个文档的多行中提取特定关键字。
我一直在研究几种技术,包括矢量化、并行处理、在 R 中使用 C++ 代码等。展望 future ,我将尝试所有这些技术,并尝试加快我的流程,并为我 future 的项目提供这些工具。同时(没有实验)我想知道哪些调整是显而易见的,这将显着减少所花费的时间,例如将部分代码移到循环外,使用更好的包等
我也有一个进度条,但如果它显着减慢了我的循环,我可以将其删除。
这是我的代码:
words <- read.csv("keyphrases.csv")
df <- data.frame(x=(list.files("sec/new/")))
total = length(df$x)
pb <- txtProgressBar(title = "Progress Bar", min = 0, max =total , width = 300, style=3)
for (i in df$x){
s <- read.csv(paste0("sec/new/",i))
u <- do.call(rbind, pblapply(words$words, function(x){
t <- data.frame(ref= s[,2], words = stri_extract(s[,3], coll=x))
t<-na.omit(t)
}))
write.csv(u,paste0("sec/new_results/new/",i), row.names = F)
setTxtProgressBar(pb, i, title=paste( round(which(df$x== i)/total*100, 2),"% done"))
}
words
有 60,000 行单词/短语 - 每行不超过 30 个字符。长度 i 约为 4000,其中每个 i 有 100 到 5000 行,每行有 1 到 5000 个字符。如果我的问题需要可重现,可以使用任何随机字符/字符串。
for(x in words$words){t<-data.table(words=stri_extract(s[,3], coll=x))}
set.seed(42)
words <- data.frame(words=rnorm(1:60000))
words$wwords <- as.String(words$words)
set.seed(42)
file1 <- data.frame(x=rnorm(1:5000))
file1$x<-as.String(file1$x)
pblapply(words$words, function(x){
t <- data.frame(words = stri_extract(file1$x, coll=x))
})
最佳答案
第一件事。是的,我肯定会从 data.frame 切换到 data.table。它不仅更快更容易使用,当你开始合并数据集时,data.table 会做一些合理的事情,而 data.frame 会给你带来意想不到的结果。
其次,使用 R 来处理分隔符是否有优势?您提到了许多您正在考虑使用的不同技术。如果分隔符只是为了分析目的而产生的噪音,为什么不将工作分成两个工具并使用一个在处理分隔符和延续线等方面做得更好的工具呢?对我来说,Python 是执行诸如将一堆文本解析为关键字之类的自然选择——包括剥离分隔符和其他您在分析中不关心的“噪音”词。将 Python 解析的结果输入 R,并使用 R 来发挥其优势。
有几种不同的方法可以将 Python 的输出导入 R。我建议从简单的东西开始:CSV 文件。它们是你开始使用的东西,它们在 Python 中易于读写,在 R 中也易于阅读。稍后你可以处理 Python 和 R 之间的直接管道,但在你有一个工作之前它不会给你带来太多优势原型(prototype),一开始还有很多工作要做。让 Python 读取您的原始数据并生成一个 CSV 文件,R 可以直接将其放入 data.table 中而无需进一步处理。
至于stri_extract,真的不是你这次需要的工具。你当然可以匹配一堆不同的词,但这并不是它真正优化的目标。我同意@Chris 的观点,即在 data.tables 上使用 merge() 是一种更有效且更快的搜索多个关键词的方法。
关于R优化使用stri_extract的双循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38739505/
我是一名优秀的程序员,十分优秀!