为什么从DTM创建ngram会占用大量内存

时间:2017-05-23 22:02:49

标签: r memory-management n-gram

我正在研究使用Ngrams的文本预测模型。我有一个文本文件(推文),我转换成DTM。 DTM是7.3Mb。我希望使用以下代码将其转换为Ngram;

createNgramTable <- function(x)
{
  m <- matrix(nrow = x$ncol, ncol = 2)
  m[,1] <- x$dimnames$Terms
  m[,2] <- colSums(as.matrix(x))
  colnames(m) <- c("ngram", "freq")
  m <- m[order(m[,2], decreasing=TRUE),]
  return(m)
}

此代码创建一个矩阵,其中术语为第1列,出现次数为第2列。然后对其进行排序以获得良好的度量。它适用于小型数据集,但是,当我在上面提到的DTM上运行它时,它会失败。 R尝试分配超过我必须执行此功能的8Gb RAM。我在做什么就是这样的记忆力,我怎么能避免这样做呢?

以下是DTM的str()

List of 6
 $ i       : int [1:226963] 1 1 1 2 2 2 2 2 2 2 ...
 $ j       : int [1:226963] 9142 22286 25985 5235 6822 8736 10336 15883 
20888 22652 ...
 $ v       : num [1:226963] 1 1 1 1 1 1 2 1 1 1 ...
 $ nrow    : int 23601
 $ ncol    : int 44619
 $ dimnames:List of 2
  ..$ Docs : chr [1:23601] "1" "2" "3" "4" ...
  ..$ Terms: chr [1:44619] "''iran" "''true" "''when" "'-)" ...
 - attr(*, "class")= chr [1:2] "DocumentTermMatrix" "simple_triplet_matrix"
 - attr(*, "weighting")= chr [1:2] "term frequency" "tf"

1 个答案:

答案 0 :(得分:0)

如果没有更多信息,我不能说太多,但我的猜测是这些陈述中的任何一个:m[,2] <- colSums(as.matrix(x))m[order(m[,2], decreasing=TRUE),]

您可能需要考虑的一些问题是:您是否必须将其转换为矩阵?你必须通过一个清单吗?为什么不使用更精简的方法或像data.table这样的引用类型来节省内存?

希望这有帮助!