繁体   English   中英

文档项矩阵到矩阵列表R

[英]Document-term matrix to a list of matrices R

我有一个文档项矩阵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更改为矩阵,则不会出现此错误。 但是,我实际上有大约2500万行的dtm。 我担心这会非常低效。

又是我!

除非您的数据特别奇怪,否则我不会将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包的包装。 但这是为了在处理有问题的协变量的同时删除有问题的文档。

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

如果您有类似这样的棘手问题,我将切换到quanteda软件包,因为它具有可转换为stm不错的转换器。 如果您想坚持使用tm ,是否尝试过使用stm::convertCorpus将对象更改为stm需要的列表结构?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM