2016-11-25 58 views
2

我必須對包含800K文本的文本分類做一些工作。我一直在試圖運行我在下面的鏈接找到了一個實際的例子:R 800K文檔的文本分類

http://garonfolo.dk/herbert/2015/05/r-text-classification-using-a-k-nearest-neighbour-model/

所有一直順利,直到我有以下指令:

# Transform dtm to matrix to data frame - df is easier to work with 
mat.df <- as.data.frame(data.matrix(dtm), stringsAsfactors = FALSE) 

後運行幾個小時我得到了一個錯誤信息:

Error: cannot allocate vector of size 583.9 Gb 
In addition: Warning messages: 
1: In vector(typeof(x$v), prod(nr, nc)) : 
    Reached total allocation of 8076Mb: see help(memory.size) 
2: In vector(typeof(x$v), prod(nr, nc)) : 
    Reached total allocation of 8076Mb: see help(memory.size) 
3: In vector(typeof(x$v), prod(nr, nc)) : 
    Reached total allocation of 8076Mb: see help(memory.size) 
4: In vector(typeof(x$v), prod(nr, nc)) : 
    Reached total allocation of 8076Mb: see help(memory.size) 

有沒有辦法克服這個錯誤?

是否有可能例如分割data.matrix(dtm)以塊運行作業,然後以某種方式合併它們?或者更好地以另一種方式或Python進行處理?

感謝

+2

_「有沒有辦法來克服這個錯誤?」_ - 把它留在稀疏矩陣格式中,'dtm'可能在? – lukeA

+2

你可以購買584 Gb的RAM ......或者嘗試使用'removeSparseTerms()'來降低矩陣的大小 – scoa

+0

移動到Python會如何幫助?它不會奇蹟般地爲您的系統增加更多的內存。這是一種方法問題,而不是工具,聽起來您需要對流操作進行更多的研究。 Spark(與'sparklyr'有良好的接口)可以很容易地執行[streaming k-means](http://spark.apache.org/docs/latest/mllib-clustering.html)。 – hrbrmstr

回答

3

as.data.frame()呼叫之前,進入這行代碼:

dtm <- removeSparseTerms(dtm, sparse=0.9)

參數sparse=...是介於0和1之間的數字。它與要保留的文檔數成正比。以上,它是而不是 90%。通常,您可以通過反覆試驗找到正確/最佳值。在你的情況下,你可以結束一個奇怪的數字,如0.79333。取決於你想要做什麼。

removeSparseTerms()刪除條款,但保留較小的結果矩陣中的文檔數量不變。因此,您將從12165735 * 800000元素矩陣轉換爲476 * 800000矩陣。現在可以在您的計算機上處​​理此問題。

如果不是,請嘗試一個聰明的按列式拆分應用組合技巧與您的大矩陣。

+0

不錯。謝謝knb。這很有幫助 – Selrac