На основе вопроса Более эффективные средства создания корпуса и DTM Я подготовил свой собственный метод построения матрицы документов терминов из большого корпуса, который (надеюсь) не требует памяти терминов x документов.
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 и content имеют 126522 элемента, Lev.terms имеет 155591 элемент, так что, похоже, я остановил обработку слишком рано. Поскольку в конечном итоге я буду работать с документами ~ 6M, мне нужно спросить... Есть ли способ ускорить этот фрагмент кода?
out
raw_tokens
.lev.terms
это набор слов.v1
является вектором слова.v2
кажется ненужным невекторизованным способом репликации идентификатора документа. - person smci   schedule 14.07.2016