2017-11-21 1 views
0

나는 160 메가 바이트의 텍스트 파일을 사용하고 데이터 마이닝을하고 있지만 일단 단어 빈도를 알기 위해 행렬로 변환하면 너무 많은 메모리가 필요하다. 누군가가 나를 도와 줄 수있다.R의 텍스트 마이닝 | 메모리 관리

> dtm <- DocumentTermMatrix(clean) 
> dtm 
<<DocumentTermMatrix (documents: 472029, terms: 171548)>> 
Non-/sparse entries: 3346670/80972284222 
Sparsity   : 100% 
Maximal term length: 126 
Weighting   : term frequency (tf) 
> as.matrix(dtm) 

Error: cannot allocate vector of size 603.3 Gb

+2

당신이 직접 원하는 주파수를 압축을 해제하는 방법 찾기 'dtm'? 그 물체는 기억 속에 존재하는 것 같습니다. 당신은 정말로 터무니없이 큰 매트릭스로 변환해야합니까? –

+0

dtm은 드문 드문 한 행렬이므로 zero 항목은 0으로 저장되지 않으며 메모리를 절약합니다. 'as.matrix()'로 변환하자마자 zero 엔트리는 true로 채워진다. 따라서이 변환을 피하고 희소 행렬을 조작하십시오. dtm으로 무엇을 할 계획입니까? –

+1

또 다른 것은 중요하지 않은 용어를 삭제하기 위해 조건에 ​​tf-idf 가중치 또는 다른 가중치 옵션을 사용할 수 있습니다. 이렇게하면 매트릭스의 크기가 상당히 줄어 듭니다. –

답변

1

@Vineet은 문서 용어 매트릭스를 비 스파 스 매트릭스로 변환하기 위해 R이 603Gb를 할당하려고했던 이유를 보여주는 수학입니다. R에있는 행렬의 각 숫자 셀은 8 바이트를 소비합니다. 문제의 문서 용어 행렬의 크기에 따라, 수학 보이는 같은 :

> # 
> # calculate memory consumed by matrix 
> # 
> 
> rows <- 472029 # 
> cols <- 171548 
> # memory in gigabytes 
> rows * cols * 8/(1024 * 1024 * 1024) 
[1] 603.3155 

라는 단어 주파수를 계산하려면, 당신은 1 그램을 생성 한 다음 주파수로 요약 더 낫다 분포.

quanteda 패키지의 코드는 다음과 같습니다.

words <- tokenize(...) 
ngram1 <- unlist(tokens_ngrams(words,n=1)) 
ngram1freq <- data.frame(table(ngram1)) 

안부

2017년 11월 24일 UPDATE : 여기서textstat_frequency() 함수를 사용하여 문서의 특성 행렬의 빈도 분포를 생성 quanteda 패키지의 전체 예제 상위 20 개 기능에 대해서는 barplot()입니다.

이 접근 방식에서는 n-gram을 빈도 분포로 집계하지 않아도됩니다. &

library(quanteda) 
myCorpus <- corpus(data_char_ukimmig2010) 
system.time(theDFM <- dfm(myCorpus,tolower=TRUE, 
         remove=c(stopwords(),",",".","-","\"","'","(",")",";",":"))) 
system.time(textFreq <- textstat_frequency(theDFM)) 

hist(textFreq$frequency, 
    main="Frequency Distribution of Words: UK 2010 Election Manifestos") 

top20 <- textFreq[1:20,] 
barplot(height=top20$frequency, 
     names.arg=top20$feature, 
     horiz=FALSE, 
     las=2, 
     main="Top 20 Words: UK 2010 Election Manifestos") 

... 그 결과 barplot :

enter image description here

+0

Len, 내 문제에 대해 다시 생각해 보겠습니다. – Vineet

+0

@Vineet - quanteda와 함께 제공되는 예제 코퍼스를 사용하여 코퍼스에서 상위 단어의 빈도 분포를 생성하는 방법을 설명하기 위해 quanteda를 사용하는 완전한 예제를 추가했습니다. –