根据More efficient means of creating a corpus and DTM这个问题,我已经准备好了自己的方法,用于从大型语料库构建术语文档矩阵(我希望)不需要术语x文档内存。R - 根据订购因子排序缓慢工作
sparseTDM <- function(vc){
id = unlist(lapply(vc, function(x){x$meta$id}))
content = unlist(lapply(vc, function(x){x$content}))
out = strsplit(content, "\\s", perl = T)
names(out) = id
lev.terms = sort(unique(unlist(out)))
lev.docs = id
v1 = lapply(
out,
function(x, lev) {
sort(as.integer(factor(x, levels = lev, ordered = TRUE)))
},
lev = lev.terms
)
v2 = lapply(
seq_along(v1),
function(i, x, n){
rep(i,length(x[[i]]))
},
x = v1,
n = names(v1)
)
stm = data.frame(i = unlist(v1), j = unlist(v2)) %>%
group_by(i, j) %>%
tally() %>%
ungroup()
tmp = simple_triplet_matrix(
i = stm$i,
j = stm$j,
v = stm$n,
nrow = length(lev.terms),
ncol = length(lev.docs),
dimnames = list(Terms = lev.terms, Docs = lev.docs)
)
as.TermDocumentMatrix(tmp, weighting = weightTf)
}
它在计算v1
时变慢。它运行了30分钟,我停下了。
我已经准备了一个小例子:
b = paste0("string", 1:200000)
a = sample(b,80)
microbenchmark(
lapply(
list(a=a),
function(x, lev) {
sort(as.integer(factor(x, levels = lev, ordered = TRUE)))
},
lev = b
)
)
结果是:
Unit: milliseconds
expr min lq mean median uq max neval
... 25.80961 28.79981 31.59974 30.79836 33.02461 98.02512 100
Id和内容有126522元,Lev.terms有155591元,所以看起来我已经停止处理过早。因为最终我会处理约6M的文件,我需要问...有什么办法可以加速这段代码?
你应该把库(dplyr);库(whatever_else)在顶部,所以你的代码是可重复的。我也将dplyr作为标签,而不是语料库。 – Frank 2016-07-14 17:44:22
帮助我们理解代码的作用,这是非常不透明的,一些评论会有所帮助;也是变量名称。我会叫'out'' raw_tokens'。 'lev.terms'是一个袋装词。 'v1'是一个单词向量。 'v2'似乎是复制doc-id的不必要的非矢量化方式。 – smci 2016-07-14 17:49:11
所以......我在开始使用R时编写了这段代码,所以可能会有很多非最优代码。但它的工作... – 2016-07-22 15:18:51