2017-05-07 90 views
0

패키지 내 작업은 코사인 문서를 코사인 유사성과 비교하는 것입니다. 나는 tm 패키지를 사용하여 TermDocumentMatrix (td-idf 형식) tdm을 얻습니다. 다음 작업을하지만, 내 TDM에서 용어의 수는 120,000 명 이상의 (약 50,000 문서), 매우 큰 heretm의 TermDocumentMatrix에있는 두 문서 간의 코사인 유사도 계산 R

d <- dist(tdm, method="cosine") 

또는

cosine_dist_mat <- 1 - crossprod_simple_triplet_matrix(tdm)/(sqrt(col_sums(tdm^2) %*% t(col_sums(tdm^2)))) 

에서 간단하게 언급해야한다. 그러한 매트릭스를 다루는 것은 R의 능력을 넘어선 다. 내 RStudio가 여러 번 충돌되었습니다.

제 질문은 1) 어떻게 큰 매트릭스를 처리하고 페어 와이즈 (120,000 * 120,000) 코사인 유사성을 얻을 수 있습니까? 2) 불가능할 경우 어떻게하면 한 번에 두 개의 문서 만 코사인 유사성을 얻을 수 있습니까? TDM은 단순 매트릭스 인 경우는 I

sim10_21<-cosine_similarity(tdm, d1=10,d2=21) 

같은 문헌 10, 21, 무언가 사이의 유사도를한다고 가정, I는 TDM의 계산을 할 수있다 [C (10,21)]. 그러나 tdm을 매트릭스로 변환하는 것은 정확히 내가 처리 할 수없는 것입니다. 내 질문은 궁극적으로 tdm에서 행렬과 같은 계산을 수행하는 방법에 달려있다.

답변

0

120,000 x 120,000 행렬 * 8 바이트 (dbl float) = 115.2 기가 바이트. 이것은 반드시 R의 기능을 넘어서는 것은 아니지만, 사용하는 언어에 상관없이 최소한 많은 메모리가 필요합니다. 실제로는 Sql과 같은 데이터베이스 (예 : RSQLite 패키지)를 사용하거나 분석에서 R 만 사용하려는 경우 디스크에 쓰기를 원할 것입니다. 저장을 위해 "ff"패키지를 사용하는 것이 좋습니다/디스크의 큰 매트릭스에 액세스.

반복적으로 수행하고 계산 속도를 향상 시키려면 멀티 스레드 할 수 있습니다.

dist(t(tdm[,1]), t(tdm[,2]), method='cosine') 
:

당신은 이런 식으로 뭔가를 할 수, 두 문서 사이의 거리를 찾으려면