我有一个文档术语矩阵dtm,例如:
dtm
<<DocumentTermMatrix (documents: 50, terms: 50)>>
Non-/sparse entries: 220/2497
Sparsity : 100%
Maximal term length: 7
Weighting : term frequency (tf)
现在我想把它转移到一个矩阵列表中,每个矩阵代表一个文档。这是为了满足STM包的正式要求:
[[1]]
[,1] [,2] [,3] [,4]
[1,] 23 33 42 117
[2,] 2 1 3 1
[[2]]
[,1] [,2] [,3] [,4]
[1,] 2 19 93 168
[2,] 2 2 1 1
我正在考虑从dtm中找到所有非零条目并将它们一次生成矩阵,每行一次,所以:
mat = matrix()
dtm.to.mat = function(x){
mat[1,] = x[x != 0]
mat[2,] = colnames(x[x != 0])
return(mat)
}
matrix = list(apply(dtm, 1, dtm.to.mat))
然而,
x[x != 0]
刚赢了工作。错误说:
$ operator is invalid for atomic vectors
我想知道为什么会这样。如果我事先将x更改为矩阵,它就不会给我这个错误。但是,我实际上有大约2,500,000行的dtm。我担心这会非常低效。
答案 0 :(得分:1)
我了!
我不会使用dtm作为stm::textProcessor
包的输入,除非您的数据特别奇怪。使用函数df
。您可以将文档指定为任意长度的字符向量中的原始(未处理)文本。您还可以根据需要指定元数据:
假设您的数据框df$documents
有一个名为df$meta
的列,它是您的原始文本,processed <- textProcessor(df$documents, metadata = df$meta, lowercase = TRUE,
removestopwords = TRUE, removenumbers = TRUE, removepunctuation = TRUE,
stem = TRUE, wordLengths = c(3, Inf))
stm_50 <- stm(documents = processed$documents, vocab = processed$vocab,
K = 50, prevalence = ~ meta, init.type = "Spectral", seed = 57468)
是您的协变量:
textProcessor
这将运行50个主题STM。
stm::textProcessor
将处理空文档及其相关元数据。
编辑: tm
在技术上只是random.choices
包的包装。但它旨在删除问题文档,同时处理相关的协变量。
如果您有多个协变量,元数据参数也可以采用数据帧。在这种情况下,您还需要修改第二个等式中的普遍性参数。
答案 1 :(得分:1)
如果你有这样棘手的事情,我会切换到quanteda
套餐,因为它有很好的转换器stm
。如果您想坚持使用tm
,您是否尝试使用stm::convertCorpus
将对象更改为列表结构stm
需要?