在(稀疏)文档特征矩阵中拆分 ngram
Split up ngrams in (sparse) document-feature matrix
这是 的后续问题。在那里,我询问是否有可能以例如双字母组合产生两个独立的单字母组合。
为了更好地理解:我通过将功能从德语翻译成英语而获得了 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 问题或处理大(稀疏)matrices/data 帧?提前致谢!
这里的问题是当您调用 as.data.frame()
时,您正在将稀疏 (dfm) 矩阵转换为密集对象。由于典型的文档特征矩阵是 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 会产生具有相同特征名称的新 "unigrams"。您可以使用 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
这是
为了更好地理解:我通过将功能从德语翻译成英语而获得了 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 问题或处理大(稀疏)matrices/data 帧?提前致谢!
这里的问题是当您调用 as.data.frame()
时,您正在将稀疏 (dfm) 矩阵转换为密集对象。由于典型的文档特征矩阵是 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 会产生具有相同特征名称的新 "unigrams"。您可以使用 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