文档项矩阵到矩阵列表R.

问题描述 投票:1回答:2

我有一个文档术语矩阵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。我担心这会非常低效。

r matrix tm topic-modeling
2个回答
1
投票

又是我!

我不会使用dtm作为stm包的输入,除非你的数据特别奇怪。使用函数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)

这将运行50个主题STM。

textProcessor将处理空文档及其相关元数据。

编辑:stm::textProcessor在技术上只是tm包的包装。但它旨在删除问题文档,同时处理相关的协变量。

如果您有多个协变量,元数据参数也可以采用数据帧。在这种情况下,您还需要修改第二个等式中的普遍性参数。


1
投票

如果你有这样棘手的东西,我会切换到quanteda包,因为它有很好的转换器到stm。如果你想坚持使用tm你尝试使用stm::convertCorpus将对象更改为stm需要的列表结构吗?

© www.soinside.com 2019 - 2024. All rights reserved.