Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的Quanteda-tf-idf变换函数_R_Tf Idf_Quanteda - Fatal编程技术网

R中的Quanteda-tf-idf变换函数

R中的Quanteda-tf-idf变换函数,r,tf-idf,quanteda,R,Tf Idf,Quanteda,我使用了quanteda软件包,得到了两个巨大的dfm序列和有效 列和有效列相同 我知道使用dfm\u tfidf可以在tain上快速获得tfidf重量, 但是我的问题是如何在tain-idf的基础上获得有效的tfidf 我尝试使用pblappy和for循环,但运行时间非常慢 这是我的代码,如何在quanteda中基于其他idf转换tfidf,或者 任何其他加速的方法 ## ## ## Idf Idf <- function(x){ n <- nrow(x) che

我使用了quanteda软件包,得到了两个巨大的dfm序列有效

有效列相同

我知道使用
dfm\u tfidf
可以在tain上快速获得tfidf重量, 但是我的问题是如何在tain-idf的基础上获得有效的tfidf

我尝试使用
pblappy
和for循环,但运行时间非常慢

这是我的代码,如何在quanteda中基于其他idf转换tfidf,或者 任何其他加速的方法

##
##
##  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", .)
##
##
##以色列国防军

Idf我使用调试和修改的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)
  }
}
##
##
##Tfidf

Tfidf根据问题,有效的序列dfm需要有共同点,据我所知,因此可以尝试将这两个文档集或其各自的语料库组合起来,然后计算强大的
TF-IDF
矩阵

由于Valid和train都有公共列,所以很容易将它们合并或将一个附加到另一个


稍后,在计算
TF-IDF
矩阵后,您可以将它们重新划分为trainValid

你能发布一些样本数据供我们使用吗?只需粘贴
head(df)
的输出,格式为codeYes,我在注释中打印dfm的head。获取文档频率的最快方法是
docfreq()
。提供一个例子,并清楚地解释您想要的输出,我们可以进一步完善这一点。