R中的文本挖掘|内存管理

Posted

技术标签:

【中文标题】R中的文本挖掘|内存管理【英文标题】:Text Mining in R | memory management 【发布时间】:2018-05-04 23:50:53 【问题描述】:

我正在使用一个 160 MB 的文本文件并进行数据挖掘,但似乎一旦我将其转换为矩阵以了解词频,那么它需要太多的内存,有人可以帮助我吗

> dtm <- DocumentTermMatrix(clean)
> dtm
<<DocumentTermMatrix (documents: 472029, terms: 171548)>>
Non-/sparse entries: 3346670/80972284222
Sparsity           : 100%
Maximal term length: 126
Weighting          : term frequency (tf)
> as.matrix(dtm)

错误:无法分配大小为 603.3 Gb 的向量

【问题讨论】:

找到如何直接从dtm中提取你想要的频率?该对象似乎存在于内存中。你真的需要把它转换成一个大得离谱的矩阵吗? 如您所见,dtm 是一个稀疏矩阵,零条目不存储为零,这样可以节省内存。只要您使用as.matrix() 进行转换,零条目就会用真零填充。因此,尽量避免这种转换并在稀疏矩阵上进行操作。你打算用 dtm 做什么? 另一件事,您可能会使用 tf-idf 加权或其他加权选项来丢弃不重要的条款。这会显着减小矩阵的大小。 感谢您的反馈。我想找到最常用的单词并绘制直方图。让我试试建议的方式 如果你只寻找最常用的,你可以丢弃很多术语。例如,您可以计算 colSums 或 rowSums(取决于整体频率或文档频率是否更重要)并丢弃所有不满足阈值的术语。使用 Matrix 包,这些函数应该可用于稀疏矩阵。 【参考方案1】:

@Vineet 这里的数学说明了为什么 R 尝试分配 603Gb 来将文档术语矩阵转换为非稀疏矩阵。 R 中矩阵中的每个数字单元占用 8 个字节。根据问题中文档术语矩阵的大小,数学公式如下:

> # 
> # calculate memory consumed by matrix
> #
> 
> rows <- 472029 # 
> cols <- 171548
> # memory in gigabytes
> rows * cols * 8 / (1024 * 1024 * 1024)
[1] 603.3155

如果您想计算词频,最好生成 1-gram,然后将它们汇总为频率分布。

使用quanteda 包,代码将如下所示。

words <- tokenize(...) 
ngram1 <- unlist(tokens_ngrams(words,n=1))
ngram1freq <- data.frame(table(ngram1))

问候,

镜头

2017-11-24 更新: 这是 quanteda 包中的完整示例,它使用 textstat_frequency() 函数和 barplot() 从文档特征矩阵生成频率分布前 20 个功能。

这种方法不需要将 n-gram 生成和聚合成频率分布。

library(quanteda)
myCorpus <- corpus(data_char_ukimmig2010)
system.time(theDFM <- dfm(myCorpus,tolower=TRUE,
                      remove=c(stopwords(),",",".","-","\"","'","(",")",";",":")))
system.time(textFreq <- textstat_frequency(theDFM))

hist(textFreq$frequency,
     main="Frequency Distribution of Words: UK 2010 Election Manifestos")

top20 <- textFreq[1:20,]
barplot(height=top20$frequency,
        names.arg=top20$feature,
        horiz=FALSE,
        las=2,
        main="Top 20 Words: UK 2010 Election Manifestos")

...以及生成的条形图:

【讨论】:

@Vineet - 我添加了一个使用 quanteda 的完整示例,以说明如何使用 quanteda 提供的示例语料库生成语料库中热门单词的频率分布。

以上是关于R中的文本挖掘|内存管理的主要内容,如果未能解决你的问题,请参考以下文章

R tm 文本挖掘中的自冲突停用词

R语言 | 手把手教你做文本挖掘!

R语言文本挖掘

r 使用包“tm”(文本挖掘)在R中的tfidf

R语言 数据挖掘-文本分析(1)

用R进行网站评论文本挖掘聚类