2016-10-30 104 views
0

这是一个相当具体的问题,但希望它是有关给别人太...检查稀疏

有谁知道,如果有找到的文件数量的简单方法该术语是否出现在包含{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时间。有更好的想法吗? 在此先感谢, Seth

+0

使用'apply'应该比'for'循环快。也许可以尝试类似于'apply(idf,MARGIN = 1,FUN = function(x){sum(ifelse(x> 0,1,0))})'看看是否更快。 – Zach

+0

但是,如果您提供了样本语料库,它会更容易帮助。也许前10或20个文件使用'dput()'。 – Zach

回答

0

啊!我想到了! TDM被存储为一个稀疏矩阵,所以你可以为这些条件制作一个频率表。这至少可以让你对每个指数进行计数,那么你只需要将指数与条款进行匹配即可。

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

感谢大家看着这个。希望这对将来的人有所帮助。

0

您正在努力获取一个数量为文档频率:一个术语出现的文档数量。最简单的方法是获取术语文档矩阵中出现术语的维度中非零单元格的总和。 (我这样说,因为条件将列,如果你形成这样一个文档长期矩阵,这是更好的方法!)

你可以得到更快的结果比使用apply()as.data.frame()使用rowSums()

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示例。