如何将R中topicmodels包的AssociatedPress DocumentTermMatrix转为数据框?
解决DocumentTermMatrix转词频加权数据框的问题
问题背景
使用R语言topicmodels包的AssociatedPress数据集,其类型为DocumentTermMatrix:
> AssociatedPress <<DocumentTermMatrix (documents: 2246, terms: 10473)>> Non-/sparse entries: 302031/23220327 Sparsity : 99% Maximal term length: 18 Weighting : term frequency (tf)
尝试将其转换为词频加权的文档-词频矩阵时,遇到以下问题:
- 调用
tibble::as_data_frame时提示函数已废弃,且无法完成转换 - 使用base R的
as.data.frame直接转换报错
报错信息如下:
> tibble::as_data_frame(AssociatedPress) Error in as.data.frame.default(value, stringsAsFactors = FALSE) : cannot coerce class ‘c("DocumentTermMatrix", "simple_triplet_matrix")’ to a data.frame In addition: Warning message: `as_data_frame()` was deprecated in tibble 2.0.0. ℹ Please use `as_tibble()` (with slightly different semantics) to convert to a tibble, or `as.data.frame()` to convert to a data frame. > as.data.frame(AssociatedPress) Error in as.data.frame.default(AssociatedPress) : cannot coerce class ‘c("DocumentTermMatrix", "simple_triplet_matrix")’ to a data.frame
可行转换方法
方法1:通过tm包转矩阵再转数据框
DocumentTermMatrix属于稀疏矩阵,可先用tm包的as.matrix转为普通矩阵,再转换为数据框。注意:原矩阵维度为2246行×10473列,直接转换会占用大量内存,仅适合内存充足的场景。
library(tm) # 转换为普通矩阵 ap_matrix <- as.matrix(AssociatedPress) # 转换为数据框,可选添加文档ID列 ap_df <- as.data.frame(ap_matrix) ap_df <- cbind(document = rownames(ap_matrix), ap_df)
方法2:用tidytext转为tidy格式(推荐)
对于高稀疏度的文本矩阵,tidy长格式更节省内存,也便于后续分析。tidytext的tidy()函数可直接处理DocumentTermMatrix:
library(tidytext) # 转为tidy长格式,每行对应一个文档-词汇的词频记录 ap_tidy <- tidy(AssociatedPress) # 如需转换为宽格式的文档-词矩阵,可结合tidyr包的pivot_wider library(tidyr) ap_wide <- ap_tidy %>% pivot_wider(names_from = term, values_from = count, values_fill = 0)
方法3:利用slam包处理底层稀疏矩阵结构
DocumentTermMatrix继承自simple_triplet_matrix,可使用slam包的函数直接转换:
library(slam) # 转换为长格式数据框 ap_slam_df <- as.data.frame(as.simple_triplet_matrix(AssociatedPress)) # 如需转宽格式,结合reshape2包的dcast library(reshape2) ap_wide_slam <- dcast(ap_slam_df, i ~ j, value.var = "v", fill = 0) # 重命名列名为词汇,行名为文档ID colnames(ap_wide_slam)[-1] <- Terms(AssociatedPress) rownames(ap_wide_slam) <- rownames(AssociatedPress)
内容的提问来源于stack exchange,提问作者user3236841
相关产品推荐
相关产品推荐

