【问题标题】:check sparsity of a term in {tm} R package检查 {tm} R 包中术语的稀疏性
【发布时间】:2017-03-12 13:18:33
【问题描述】:

这是一个相当具体的问题,但希望它也与其他人相关......

有谁知道是否有一种简单的方法可以通过 {tm} 包找到一个术语出现在语料库中的文档数量?

基本上,如果我有一个已构建的术语文档矩阵,我想查看特定术语的行有多稀疏,即矩阵中有多少列具有该行的非零值。 for 循环显然可以工作,但我正在处理一个非常大的矩阵,因此在循环中重复对它进行子集化会让 CPU 感到厌烦。

实际上...(对上述问题的回答会很好,但是)我真正想做的是为矩阵中的 每个 项获取该数字。现在我正在使用:

TDM <- TermDocumentMatrix(somecorpus)

terms <- TDM$dimnames$Terms

idf <- data.frame(term = terms, freq = numeric(length(terms)), stringsAsFactors = F)

for (i in 1:nrow(idf)) {
  aa <- as.matrix(TDM[,idf$term[i]])
  idf$freq[i] <- length(aa[aa[,1]>0, ])
}

这行得通,但需要 looong 时间。有更好的想法吗? 提前致谢, 赛斯

【问题讨论】:

  • 使用apply 应该比for 循环更快。不妨试试apply(idf, MARGIN = 1, FUN = function(x) {sum(ifelse(x &gt; 0, 1, 0))}) 之类的方法,看看是否更快。
  • 但是如果你提供一个样本语料库会更容易提供帮助。也许前 10 或 20 个文档使用 dput()

标签: r tm


【解决方案1】:

啊!我想到了! TDM 存储为稀疏矩阵,因此您只需为术语制作列的频率表。这至少可以为您提供每个索引的计数,然后您只需将索引与术语匹配即可。

tc <- as.data.frame(table(TDM$i)) 

感谢所有查看此内容的人。希望将来对某人有所帮助。

【讨论】:

    【解决方案2】:

    您正在尝试获取一个称为文档频率的数量:一个术语出现在其中的文档数量。最简单的方法是在定义了术语文档矩阵中出现的术语的维度上获取非零单元格的总和。 (我这样说是因为如果您将其形成为文档术语矩阵,术语将是列,这是更好的方法!)

    使用rowSums(),您可以获得比使用apply()as.data.frame() 更快的结果:

    require(tm)
    data(crude)
    TDM <- TermDocumentMatrix(crude)
    dfreq1 <- rowSums(as.matrix(TDM > 0))
    head(dfreq1, 10)
    ##   ...      "(it)    "demand "expansion       "for    "growth        "if 
    ##     2          1          1          1          1          1          1 
    ##   "is       "may      "none 
    ##     2          1          2 
    

    quanteda 文本分析包有一个内置函数,称为docfreq(),它更加简单快捷:

    require(quanteda)
    DFM <- dfm(corpus(crude), verbose = FALSE)
    head(docfreq(DFM), 10)           
    ## diamond  shamrock      corp      said      that effective     today        it 
    ##       1         1         2        20        11         4         7        13 
    ##     had       cut 
    ##       4         3 
    

    请注意,dfm() 应用了标点符号和数字删除,并将文本小写,为简单起见,我没有在上面的 tm 示例中应用。

    【讨论】:

      猜你喜欢
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      相关资源
      最近更新 更多