1

这是对此问题的后续问题。在那里,我问是否有可能在文档特征矩阵(来自 quanteda-package 的 dfm-class)中拆分 ngram 特征,例如二元组会产生两个单独的一元组。

为了更好地理解:我从将特征从德语翻译成英语得到了 dfm 中的 ngram。复合词(“Emissionsminderung”)在德语中很常见,但在英语中并不常见(“emission reduction”)。

library(quanteda)

eg.txt <- c('increase in_the great plenary', 
            'great plenary emission_reduction', 
            'increase in_the emission_reduction emission_increase')
eg.corp <- corpus(eg.txt)
eg.dfm <- dfm(eg.corp)

这个例子有一个很好的答案,对于上面提到的相对较小的矩阵,它工作得非常好。但是,一旦矩阵变大,我就会不断遇到以下内存错误。

> #turn the dfm into a matrix
> DF <- as.data.frame(eg.dfm)
Error in asMethod(object) : 
  Cholmod-error 'problem too large' at file ../Core/cholmod_dense.c, line 105

因此,是否有一种内存效率更高的方法来解决这个 ngram 问题或处理大型(稀疏)矩阵/数据帧?先感谢您!

4

1 回答 1

2

这里的问题是,当您调用as.data.frame(). 由于典型的文档特征矩阵是 90% 稀疏的,这意味着您正在创建比您可以处理的更大的东西。解决方案:使用 dfm 处理函数来保持稀疏性。

请注意,这既是比链接问题中提出的更好的解决方案,也应该对更大的对象有效地工作。

这是一个执行此操作的函数。它允许您设置连接符,并适用于可变大小的 ngram。最重要的是,它使用 dfm 方法来确保 dfm 保持稀疏。

# function to split and duplicate counts in features containing 
# the concatenator character
dfm_splitgrams <- function(x, concatenator = "_") {
    # separate the unigrams
    x_unigrams <-  dfm_remove(x, concatenator, valuetype = "regex")

    # separate the ngrams
    x_ngrams <- dfm_select(x, concatenator, valuetype = "regex")
    # split into components
    split_ngrams <- stringi::stri_split_regex(featnames(x_ngrams), concatenator)
    # get a repeated index for the ngram feature names
    index_split_ngrams <- rep(featnames(x_ngrams), lengths(split_ngrams))
    # subset the ngram matrix using the (repeated) ngram feature names
    x_split_ngrams <- x_ngrams[, index_split_ngrams]
    # assign the ngram dfm the feature names of the split ngrams
    colnames(x_split_ngrams) <- unlist(split_ngrams, use.names = FALSE)

    # return the column concatenation of unigrams and split ngrams
    suppressWarnings(cbind(x_unigrams, x_split_ngrams))
}

所以:

dfm_splitgrams(eg.dfm)
## Document-feature matrix of: 3 documents, 9 features (40.7% sparse).
## 3 x 9 sparse Matrix of class "dfmSparse"
##        features
## docs    increase great plenary in the emission reduction emission increase
##   text1        1     1       1  1   1        0         0        0        0
##   text2        0     1       1  0   0        1         1        0        0
##   text3        1     0       0  1   1        1         1        1        1

在这里,拆分 ngram 会产生具有相同特征名称的新“unigram”。您可以(重新)将它们有效地与dfm_compress()

dfm_compress(dfm_splitgrams(eg.dfm))
## Document-feature matrix of: 3 documents, 7 features (33.3% sparse).
## 3 x 7 sparse Matrix of class "dfmSparse"
##        features
## docs    increase great plenary in the emission reduction
##   text1        1     1       1  1   1        0         0
##   text2        0     1       1  0   0        1         1
##   text3        2     0       0  1   1        2         1
于 2017-06-14T13:17:06.143 回答