Функция преобразования Quanteda TF-IDF в R - PullRequest
0 голосов
/ 27 декабря 2018

Я использовал пакет 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", .)

Ответы [ 2 ]

0 голосов
/ 15 января 2019

В соответствии с Вопросом, Действительный и поезд dfm должны иметь общий язык, насколько я понял, поэтому можно попытаться объединить эти два набора документов или их соответствующиекорпус, а затем вычислить могущественную TF-IDF матрицу.

И так как и Valid, и train имеют общие столбцы, их будет легко объединить или добавить один к другому.

Позже, после вычисленияматрицу TF-IDF, вы можете разделить их обратно на train и Valid .

0 голосов
/ 27 декабря 2018

Я использую отладку и модифицированный dfm_tfidf, и получаю решение.параметр idf является выходом функции Idf, указанной выше.

##
##
##  Tfidf
Tfidf <- function(dfm, idf = NULL){
  require(quanteda)
  if(is.null(idf)){
    output <- dfm_tfidf(dfm)
    return(output)
  }else{
    output <- dfm
    j      <- as(dfm, "dgTMatrix")@j + 1
    output@x <- dfm@x * idf[j]
    return(output)
  }
}
...