2017-05-23 6 views
0

Ngrams를 사용하는 텍스트 예측 모델을 만들고 있습니다. DTM으로 변환하는 텍스트 문서 (트윗)가 있습니다. DTM은 7.3Mb입니다. 다음 코드를 사용하여 Ngram으로 변환하고 싶습니다.DTM에서 ngram을 생성하는 것이 왜 많은 메모리를 사용합니까?

createNgramTable <- function(x) 
{ 
    m <- matrix(nrow = x$ncol, ncol = 2) 
    m[,1] <- x$dimnames$Terms 
    m[,2] <- colSums(as.matrix(x)) 
    colnames(m) <- c("ngram", "freq") 
    m <- m[order(m[,2], decreasing=TRUE),] 
    return(m) 
} 

이 코드는 1 열의 된 용어 및 I는 다음 좋은 측정을 위해 정렬 컬럼 2로 발생 횟수와 행렬을 생성한다. 작은 데이터 세트에서 작동하지만 위에 언급 한 DTM에서 실행하면 실패합니다. R은이 기능을 실행해야하는 8Gb 이상의 RAM을 할당하려고합니다. 내가 뭘하고있는 건 그런 추억의 돼지 며 어떻게 그 일을 피할 수 있니? 여기

는 DTM에 대한 str()입니다 :

List of 6 
$ i  : int [1:226963] 1 1 1 2 2 2 2 2 2 2 ... 
$ j  : int [1:226963] 9142 22286 25985 5235 6822 8736 10336 15883 
20888 22652 ... 
$ v  : num [1:226963] 1 1 1 1 1 1 2 1 1 1 ... 
$ nrow : int 23601 
$ ncol : int 44619 
$ dimnames:List of 2 
    ..$ Docs : chr [1:23601] "1" "2" "3" "4" ... 
    ..$ Terms: chr [1:44619] "''iran" "''true" "''when" "'-)" ... 
- attr(*, "class")= chr [1:2] "DocumentTermMatrix" "simple_triplet_matrix" 
- attr(*, "weighting")= chr [1:2] "term frequency" "tf" 
+1

DTM에서 colSums를 수행하는 대신 모든 Docs에서 발생 횟수의 합계를 원할 경우 모든 Docs로 구성된 코퍼스에서 DTM을 만들 수 있습니까? – Lamia

+0

'as.matrix (x)'는 최소 4GB 인 23601x44619의 행렬을 만듭니다. – HubertL

답변

0

더 많은 정보가 없으면, 나는 많은 것을 말할 수 있지만 내 생각은 하나 이러한 진술 중 하나입니다 : m[,2] <- colSums(as.matrix(x)) 또는 m[order(m[,2], decreasing=TRUE),].

고려해야 할 질문은 다음과 같습니다. 행렬로 변환해야합니까? 목록을 통과해야합니까? 왜 메모리를 절약하기 위해 leaner 접근 방식이나 data.table과 같은 참조 유형을 사용하지 않습니까?

희망이 도움이됩니다.