我有一個6GB的數據集,我想處理600萬條消息 - 我的目標是爲我的數據集創建一個文檔術語矩陣,但我需要做一些預處理(去除HTML標籤,詞幹,停止詞的刪除等)。在R中處理大文本文件
這裏是我當前如何試圖做到這一切:
library(data.table)
library(tm)
wordStem2 <- function(strings){
sapply(lapply(strsplit(stripWhitespace(strings), " "), wordStem), function(x) paste(x, collapse=" "))
}
load("data/train.RData")
sampletrainDT <- as.data.table(train)
rm(train)
setkey(sampletrainDT, Id)
object.size(sampletrainDT) # 5,632,195,744 bytes
gc()
sampletrainDT[, Body := tolower(Body)]
object.size(sampletrainDT) # 5,631,997,712 bytes, but rsession usage is at 12 GB. gc doesn't help.
gc()
sampletrainDT[, Body := gsub("<(.|\n)*?>", " ", Body)] # remove HTML tags
sampletrainDT[, Body := gsub("\n", " ", Body)] # remove \n
sampletrainDT[, Body := removePunctuation(Body)]
sampletrainDT[, Body := removeNumbers(Body)]
sampletrainDT[, Body := removeWords(Body, stopwords("english"))]
sampletrainDT[, Body := stripWhitespace(Body)]
sampletrainDT[, Body := wordStem2(Body)]
LS在每行:
ls()
[1] "sampletrainDT" "wordStem2"
的sampletrainDT
每一行是一個消息,主柱是Body
。其他包含像docid等元數據等
當我只與數據的一個子集(10%),但它甚至不完成,如果我使用完整的數據集,這運行相當快(10分鐘)因爲我在這行sampletrainDT[, Body := gsub("<(.|\n)*?>", " ", Body)] # remove HTML tags
用完了RAM。在行之間運行gc()似乎並沒有改善這種情況。
我已經花了幾天的時間搜索解決方案,但是我還沒有找到一個好的解決方案,所以我很想聽到其他人有很多的經驗。下面是我正在考慮一些選擇:
- FF或bigmemory - 很難使用,並在同一時間,流程以塊的形式不適合文本
- 數據庫
- 讀取和附加到文件(更適合的Python ?)從TM庫
- PCorpus
- 地圖 - 減少 - 本地,但希望在記憶友好的方式完成
- 爲R只是沒有這個工具?
我想在一臺機器(16 GB筆記本電腦)上運行它,而不是在EC2上使用大型機器。如果正確完成,6GB的數據似乎並不是不可逾越的!
我覺得很奇怪,你需要所有RAM ......我每天處理5個10萬行的16G筆記本電腦文件。你能發送你的文件嗎? – statquant
@statquant我的數據框的前100行。 https://dl.dropboxusercontent.com/u/25747565/temp.RData – mchangun
或者您可以使用其他語言/腳本來清理數據,然後使用R進行分析。 – Fernando