2016-10-30 6 views
0

이 상당히 특정 질문입니다, 그러나 희망은 다른 너무 사람이 관련이체크 희소성은

문서의 수를 찾을 수있는 간단한 방법이 있다면

사람이 알고 있나요 {tm} 패키지가있는 코퍼스에 용어가 나타납니다.

기본적으로 필자가 작성한 용어 - 문서 행렬이있는 경우 특정 용어에 해당 행이 얼마나 희박한 지, 즉 해당 행에 대해 0이 아닌 값을 가진 행이 몇 개 있는지 확인하고자합니다 . 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 시간이 소요 : 지금은 사용하고 있습니다. 더 좋은 생각? 미리 감사드립니다. 세스

+0

'apply'는'for' 루프보다 빠릅니다. 어쩌면'apply (idf, MARGIN = 1, FUN = function (x) {sum (ifelse (x> 0, 1, 0)})'와 같은 것을 시도해보십시오. – Zach

+0

그러나 샘플 자료를 제공하면 도움이 될 수 있습니다. 아마도'dput()'을 사용하는 처음 10 개 또는 20 개의 문서 일 것이다. – Zach

답변

0

아! 나는 그것을 알아! TDM은 스파 스 매트릭스로 저장되므로 용어에 대한 열의 빈도 테이블을 만들 수 있습니다. 적어도 각 색인의 수를 제공합니다. 그러면 색인을 조건과 일치시켜야합니다.

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

감사합니다. 다행히 앞으로 누군가에게 도움이되기를 바랍니다.

0

문서 빈도이라는 수량을 얻으려고합니다. 용어가 나타나는 문서 수입니다. 이를 수행하는 가장 쉬운 방법은 용어 - 문서 행렬에서 용어가 발생하는 차원에서 0이 아닌 셀의 합을 구하는 것입니다. (난 당신이 더 나은 방법이다 문서 기간 행렬로이 형성 경우 용어가 열이되기 때문에이 방법을 넣어!)

당신은 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 위의 예에서는 적용하지 않았습니다.