【问题标题】:Writing a Simple Triplet Matrix to a File?将简单的三元组矩阵写入文件?
【发布时间】:2016-02-25 05:13:15
【问题描述】:

我正在使用tm 包来计算数据集的术语文档矩阵,我现在必须将术语文档矩阵写入文件,但是当我在 R 中使用写入函数时出现错误。

这是我正在使用的代码和我得到的错误:

data("crude")
tdm <- TermDocumentMatrix(crude, control = list(weighting = weightTfIdf, stopwords = TRUE))
dtm <- DocumentTermMatrix(crude, control = list(weighting = weightTfIdf, stopwords = TRUE))

这是我在此数据上使用 write.table 命令时出现的错误:

Error in cat(list(...), file, sep, fill, labels, append) : argument 1 (type 'list') cannot be handled by 'cat'

我知道 tbm 是 Simple Triplet Matrix 类型的对象,但我怎样才能将它写入一个简单的文本文件。

【问题讨论】:

    标签: r


    【解决方案1】:

    我想我可能误解了这个问题,但是如果您只想将术语文档矩阵导出到文件中,那么如何:

    m <- inspect(tdm)
    DF <- as.data.frame(m, stringsAsFactors = FALSE)
    write.table(DF)
    

    这就是你追求的伴侣吗?

    希望能有所帮助,

    托尼·布雷亚尔

    【讨论】:

    • 谢谢托尼和谢恩!该解决方案帮了我大忙!
    • 我认为这不再有效了,'不能强制类 ... 到 data.frame'
    • @wordsforthewise 在 Windows 7、R 版本 3.4.3 和 tm_0.7-3 下为我工作
    • 除 Ubuntu 16 之外的版本相同。我想您可能在 as.data.frame 之前忘记了 as.matrix()?
    • @wordsforthewise 我只是按照答案运行代码,根本没有使用 as.matrix() ,这很好。我原以为 Ubuntu 会返回相同的答案?
    【解决方案2】:

    文件应该是“人类可读的”吗?如果没有,请使用dumpdputsave。如果是这样,请将您的列表转换为 data.frame。

    编辑:如果每个列表元素的长度相等,您可以通过执行matrix(unlist(list.name), nrow=length(list.name[[1]])) 或类似的操作(或使用plyr)将列表转换为矩阵。

    您为什么不在 R 中进行 SVM 分析(例如使用 kernlab)?

    编辑2:好的,我看了你的数据,转换成矩阵并不容易,因为列表元素的长度不相等:

    > is.list(tdm)
    [1] TRUE
    > str(tdm)
    List of 7
     $ i        : int [1:1475] 15 29 151 152 173 205 215 216 227 228 ...
     $ j        : int [1:1475] 1 1 1 1 1 1 1 1 1 1 ...
     $ v        : Named num [1:1475] 3.32 4.32 2.32 2 2.32 ...
      ..- attr(*, "names")= chr [1:1475] "1.50" "16.00" "barrel," "barrel." ...
     $ nrow     : int 985
     $ ncol     : int 20
     $ dimnames :List of 2
      ..$ Terms: chr [1:985] "(bpd)" "(bpd)." "(gcc)" "(it) appears to be nearing a crossroads with regard to\nderegulation, both as it pertains to investments and imports," ...
      ..$ Docs : chr [1:20] "127" "144" "191" "194" ...
     $ Weighting: chr [1:2] "term frequency - inverse document frequency" "tf-idf"
     - attr(*, "class")= chr [1:2] "TermDocumentMatrix" "simple_triplet_matrix"
    

    为了将其转换为矩阵,您需要获取此列表中的元素(例如 i、j)或进行其他操作。

    编辑 3: 在这里结束我的评论:这些对象旨在与inspect 函数一起使用(请参阅the package vignette)。

    如前所述,为了使用像write.table 这样的函数,您需要将列表转换为矩阵,这需要对该列表进行一些操作,以便您拥有多个等长的向量。查看这些tm 对象的结构:这将很难做到,我建议您使用该包中包含的辅助函数。

    【讨论】:

    • 嗨,Shane 实际上我想在没有字符串内核的情况下将这个术语文档矩阵用于 SVM,所以我更喜欢它是一个矩阵。
    • Kernlab 有基于字符串内核的 SVM 方法,我使用了它们,没有得到一个好的和健壮的分类模型,所以想尝试使用常用术语矩阵。
    【解决方案3】:
    dtmMatrix <- as.matrix(dtm)
    write.csv(dtmMatrix, 'mydata.csv')
    

    这确实有效。但是,当我在一个非常大的 DTM(25000 x 35000)上尝试它时,它给出了与内存空间不足有关的错误。

    我使用了以下方法:

    dtm <- DocumentTermMatrix(corpus)
    dtm1 <- removeSparseTerms(dtm,0.998)   ##max allowed sparsity 0.998
    
    m <- inspect(dtm1)
    DF <- as.data.frame(m, stringsAsFactors = FALSE)
    write.csv(DF,"mydata0.998sparse.csv")
    

    这在很大程度上减少了文档术语矩阵的大小! 在这里,您可以增加最大允许稀疏度(接近 1)以在 DF 中包含更多术语。

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2012-04-04
      • 2015-06-01
      • 2015-02-16
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多