2016-03-29 64 views
0

我正在嘗試使用Great Quanted包從大型語料庫(R中大小約1Gb的對象大小)構建n-gram。 我沒有可用的雲資源,因此我使用自己的筆記本電腦(Windows和/或Mac,12Gb RAM)進行計算。使用R和Quanteda計算大型語料庫上的n-gram

如果我將數據分解成小塊,代碼就可以工作,並且我得到了不同大小n-gram的(部分)dfm,但是當我嘗試在整個語料庫上運行代碼時,不幸的是,該文集的大小,並得到以下錯誤(unigram進行示例代碼,單個詞):

> dfm(corpus, verbose = TRUE, stem = TRUE, 
     ignoredFeatures = stopwords("english"), 
     removePunct = TRUE, removeNumbers = TRUE) 
Creating a dfm from a corpus ... 
... lowercasing 
... tokenizing 
... indexing documents: 4,269,678 documents 
... indexing features: 
Error: cannot allocate vector of size 1024.0 Mb 

In addition: Warning messages: 
1: In unique.default(allFeatures) : 
    Reached total allocation of 11984Mb: see help(memory.size) 

即使我嘗試建立的n-gram,其中n> 1更糟:

> dfm(corpus, ngrams = 2, concatenator=" ", verbose = TRUE, 
    ignoredFeatures = stopwords("english"), 
    removePunct = TRUE, removeNumbers = TRUE) 

Creating a dfm from a corpus ... 
... lowercasing 
... tokenizing 
Error: C stack usage 19925140 is too close to the limit 

我發現this related post,但它看起來是一個密集矩陣強制的問題,後來解決d,這對我的情況沒有幫助。

有沒有更好的方法來處理這與有限的內存量,而不必將語料庫數據分解成片斷?

[編輯]按照要求,sessionInfo()數據:

> sessionInfo() 
R version 3.2.3 (2015-12-10) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] data.table_1.9.6 dplyr_0.4.3  quanteda_0.9.4 

loaded via a namespace (and not attached): 
[1] magrittr_1.5 R6_2.1.2  assertthat_0.1 Matrix_1.2-3 rsconnect_0.4.2 DBI_0.3.1  
[7] parallel_3.2.3 tools_3.2.3  Rcpp_0.12.3  stringi_1.0-1 grid_3.2.3  chron_2.3-47 
[13] lattice_0.20-33 ca_0.64 
+0

您使用的是什麼版本的量子?你可以發送你的sessionInfo()輸出嗎? –

+0

@KenBenoit我試着用Mac和Windows機器。 – Federico

+0

@KenBenoit評論是不可讀的,所以我編輯並添加到上面的帖子。謝謝! – Federico

回答

3

是有,可完全按它摔成了碎片,但聽我把話說完。不是導入整個語料庫,而是導入一個文件(它是在文件中:然後按文件導入文件;它是在一個巨大的txt文件中 - 很好,使用readLines)。計算n-gram,將它們存儲在另一個文件中,讀取下一個文件/行,再次存儲n-gram。這更靈活,不會遇到內存問題(當然,這需要比原始語料庫多得多的空間,取決於n的值)。稍後,您可以按照慣例從文件中訪問ngrams。

根據評論更新。對於加載,稀疏矩陣/數組聽起來像是一個好主意,想一想,它可能也是一個很好的主意(尤其是如果你碰巧只處理bigrams)。如果你的數據很大,你可能不得不考慮索引(這應該有助於存儲:而不是在bigrams中存儲單詞,索引所有單詞並存儲索引元組)。但這也取決於你的「完整n-gram模型」應該是什麼。如果要在文本中查找(相對少量的)單詞的條件概率,則可以對存儲的ngram文件執行搜索(grep)。我不確定在這麼簡單的任務中索引開銷是否合理。如果你真的需要模型中所有12GB的ngram,並且模型必須計算一些無法逐件完成的事情,那麼你仍然需要一個集羣/雲。

但還有一個一般的建議,我經常給學生的建議:從小開始。訓練和測試數據的小部分,而不是12BG。當你找出確切的實施方案並解決錯誤時 - 尤其是如果你碰巧不確定這些工作是如何工作的時候,可以節省大量時間。

+0

謝謝你的建議! 一旦我將n-gram存儲在不同的.Rdata文件中,您如何建議我加載並加入以創建總n-gram模型?只需將它們加載到內存中,並將具有相同* n *值的稀疏矩陣加起來,還是有更智能的方法? – Federico

+0

@Federico更新A – user3554004

+0

抽樣是很好的,特別是在開發時,但現在我想提高模型的準確性;如果我對數據集的5%以上進行採樣,R會崩潰,這對我來說聽起來很低,所以我正在研究一個更好的解決方案,通過克服內存限制來構建完整模型。 再次感謝您的輸入! – Federico

1

現在可能已經太晚了,但最近我有一個非常類似的問題(n-grams,R,Quanteda和大型文本源)。我搜索了兩天,並不能 找到一個滿意的解決方案,張貼在這個論壇和其他人並沒有得到答案。我知道我不得不將數據分塊並結合最後的結果,但無法解決如何進行分塊。最後,我發現,工作並回答了我自己的問題在下面的帖子here

我切片,用「以舊換新」包VCorpus再喂大塊使用語料庫quanteda胼有點未優雅的解決方案()功能。

我以爲我會發布它,因爲我提供的代碼解決方案。希望它會阻止他人花兩天時間搜索。