Я использовал пакет quanteda и получил два огромных дфм поезд и Действительный .
поезд и действительный столбцы одинаковы.
Я знаю, что использование dfm_tfidf
может очень быстро набрать tfidf вес на tain , но моя проблема в том, как получить valid tfidf на базе tain idf .
Я пытаюсь использовать pblapply
и цикл, но время выполнения очень медленное.
Вот мой код, какпреобразовать базу tfidf в другой idf в quanteda или любым другим способом ускорить.
##
##
## Idf
Idf <- function(x){
n <- nrow(x)
check <- colSums(dfm_weight(x, "boolean"))
sure <- ifelse(check==0, n, check)
idf <- log10(n/sure)
return(idf)
}
##
##
## train document term matrix
## Document-feature matrix of: 1,715,438 documents, 184,554 features (100% sparse).
TrainWcm
> head(TrainWcm[,1:4])
Document-feature matrix of: 6 documents, 4 features (70.8% sparse).
6 x 4 sparse Matrix of class "dfm"
features
docs what changes will you
text1 1 1 1 2
text2 0 0 0 0
text3 1 0 0 0
text4 1 0 0 0
text5 0 0 0 0
text6 1 0 0 0
##
##
## valid document term matrix
## Document-feature matrix of: 391,836 documents, 184,554 features (100% sparse).
ValidWcm
> head(ValidWcm[,1:4])
Document-feature matrix of: 6 documents, 4 features (87.5% sparse).
6 x 4 sparse Matrix of class "dfm"
features
docs what changes will you
text1 1 0 0 0
text2 0 0 0 0
text3 1 0 0 1
text4 0 0 0 0
text5 0 0 0 0
text6 0 0 0 0
##
##
## Idf from train
WcmIdf <- Idf(TrainWcm)
##
##
## First method
TrainTfdf <- TrainWcm
ValidTfdf <- ValidWcm
n <- seq(length(WcmIdf))
for( i in n ){
TrainTfdf[,i] <- TrainWcm[,i]*WcmIdf[i]
ValidTfdf[,i] <- ValidWcm[,i]*WcmIdf[i]
cat("\r",i)
}
##
##
## Second method
n <- seq(length(WcmIdf))
TrainTfidf <- pblapply(n, function(i) TrainWcm[,i] * WcmIdf[i]) %>% do.call("cbind", .)
ValidTfidf <- pblapply(n, function(i) ValidWcm[,i] * WcmIdf[i]) %>% do.call("cbind", .)