2017-02-08 65 views
1

我在R中使用csv文件做了wordcloud。我在tm包中使用了TermDocumentMatrix方法。這裏是我的代碼:如何在r中讀寫TermDocumentMatrix?

csvData <- read.csv("word", encoding = "UTF-8", stringsAsFactors = FALSE) 

Encoding(csvData$content) <- "UTF-8" 
# useSejongDic() - KoNLP package 
nouns <- sapply(csvData$content, extractNoun, USE.NAMES = F) 
#create Corpus 
myCorpus <- Corpus(VectorSource(nouns)) 

myCorpus <- tm_map(myCorpus, removePunctuation) 
# remove numbers 
myCorpus <- tm_map(myCorpus, removeNumbers) 
#remove StopWord 
myCorpus <- tm_map(myCorpus, removeWords, myStopwords) 

#create Matrix 
TDM <- TermDocumentMatrix(myCorpus, control = list(wordLengths=c(2,5))) 

m <- as.matrix(TDM) 

這個過程似乎花費了太多時間。我認爲extractNoun是花費太多時間的原因。爲了使代碼更省時,我想將結果TDM保存爲文件。當我讀取這個保存的文件時,我可以完全使用m <- as.matrix(saved TDM file)嗎?或者,還有更好的選擇嗎?

回答

1

我不是專家,但我有時會使用NLP。

我確實使用parallel包裝中的parSapply。這裏的文檔http://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf

parallel帶有R基本,這是一個愚蠢的使用例子:

library(parallel) 
no_cores <- detectCores() - 1 
cl<-makeCluster(no_cores) 
clusterExport(cl, "base") 

base <- 2 
parSapply(cl, as.character(2:4), 
      function(exponent){ 
      x <- as.numeric(exponent) 
      c(base = base^x, self = x^x) 
      }) 

所以,並行nouns <- sapply(csvData$content, extractNoun, USE.NAMES = F),它會更快:)

+0

感謝您的回覆! 它的工作! 祝你有美好的一天〜 –

+0

你能回答多一個問題嗎?如果你不介意。 正如你所說,我使用'parallel'。但是這似乎會帶來巨大的內存泄漏。所以我使用'gc()'作爲臨時措施。你有過這樣的經歷嗎?如果是這樣,有沒有辦法? –

+0

我沒看到。這取決於系統。如果你使用windows也許'cl <-makeCluster(no_cores,type =「FORK」)',但我沒有使用Windows自XP – pachamaltese

0

我注意到,你有電話到幾個庫(tm)命令,它們也可以很容易地被並行化。對於庫tm此功能在您的問題後的一個月2017年3月更新。

新功能的發佈庫TM版本0.7(2017年3月2日)則表示指出:

tm_parLapply()現在用於內部的並行轉換,過濾器和術語 - 文檔矩陣構造。首選的並行化引擎可以通過tm_parLapply_engine()註冊。缺省情況是不使用並行(而不是先前版本中的mclapply(包並行))。

要設置並行的TM命令以下爲我工作:

library(parallel) 
cores <- detectCores() 
cl <- makeCluster(cores) # use cores-1 if you want to do anything else on the PC. 
tm_parLapply_engine(cl) 
## insert your commands for create corpus, 
## tm_map and TermDocumentMatrix commands here 
tm_parLapply_engine(NULL) 
stopCluster(cl) 

如果你有,你是通過tm_map內容變壓器應用功能,您將需要使用clusterExport傳遞該函數在tm_map(MyCorpus,content_transformer(clean))命令之前的並行環境中起作用。例如。將我的清潔功能傳遞給環境。

clusterExport(cl, "clean") 

最後一條評論,留意你的內存使用情況。如果您的計算機開始將內存分頁到磁盤,則CPU不再是關鍵路徑,並且所有並行化都不會產生影響。