gpt4 book ai didi

R优化使用stri_extract的双循环

转载 作者:行者123 更新时间:2023-12-03 17:21:56 24 4
gpt4 key购买 nike

我一直在做一些文本抓取/分析。我做的一件事是从文档中提取 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 个字符。如果我的问题需要可重现,可以使用任何随机字符/字符串。

我只使用 lapply 是因为将它与 rbind 和 do.call 结合使用效果非常好,在循环中使用循环也可能会显着减慢进程。

所以马上有一些我可以做的事情吗?将 data.frame 交换为 data.table 或使用向量。以某种方式在循环外进行读写?也许写成这样一个循环不是嵌套的?

提前致谢

编辑

需要加速的关键要素是提取物。无论我在上面使用 lapply 还是将其缩减为:
for(x in words$words){t<-data.table(words=stri_extract(s[,3], coll=x))}

这仍然需要很长时间。在这种情况下,技能和 t 是数据表。

编辑2

尝试创建可重现的数据:
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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com