2017-05-07 82 views
0

我的任務是將一個語料庫中的文檔與餘弦相似度進行比較。我使用tm包並獲取TermDocumentMatrix(以td-idf形式)tdm。下面的任務應該是簡單的here計算T中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)))) 

陳述但是,在我的TDM項數是相當大的,超過12萬(有大約50,000文件)。 R超出了處理這種矩陣的能力。我的RStudio崩潰了幾次。

我的問題是1)我該如何處理這樣一個大矩陣並得到成對相加(120,000 * 120,000)餘弦相似度? 2)如果不可能,我怎麼能只得到只有兩個文件的餘弦相似度在同一時間?假設我想像

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

文件10和21,然後東西之間的相似性。如果TDM是一個簡單的矩陣,我可以做計算上TDM [,C(10,21)。然而,轉換TDM向矩陣正是我不能處理。我的問題最終歸結爲如何在tdm上進行矩陣式計算。

回答

0

120000 X 120000矩陣* 8個字節(DBL浮點)= 115.2千兆字節。這不一定超出R的能力,但不管你使用什麼語言,你都至少需要那麼多的內存。實際上,你可能會想寫入磁盤,或者使用一些數據庫,如SQL(如RSQLite包),或者如果您打算只使用的R你的分析,這可能是最好使用「FF」包用於存儲/訪問磁盤上的大型矩陣。

你可以反覆做和多線程它來提高計算速度。

找到兩個文檔之間的距離,你可以做這樣的事情:

dist(t(tdm[,1]), t(tdm[,2]), method='cosine') 
相關問題