2017-02-08 2 views
1

Я сделал wordcloud, используя файл csv в R. Я использовал метод TermDocumentMatrix в пакете tm. Вот мой код:как читать и писать TermDocumentMatrix в r?

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

Я не эксперт, но иногда я использовал НЛП.

я использую parSapply из parallel упаковка. Вот документация 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

Я этого не видел. Это зависит от системы. Если вы используете окна, возможно, 'cl <-makeCluster (no_cores, type =" FORK ")', но я не использовал Windows с XP – pachamaltese

0

Я заметил, что у вас есть вызов к нескольким командам (tm), которые также могут быть легко распараллелены. Для библиотеки tm эта функция была обновлена ​​в марте 2017 года, через месяц после вашего вопроса.

В новые функции раздел о выпуске библиотеки тм версии 0.7 (2017-03-02) он обозначен:

tm_parLapply() теперь используется внутренне для распараллеливания трансформаций, фильтров и конструкции матриц терминов и документов. Предпочтительный механизм распараллеливания можно зарегистрировать через tm_parLapply_engine(). По умолчанию используется отсутствие распараллеливания (вместо mclapply (пакет параллельно) в предыдущих версиях).

Чтобы настроить распараллеливание для тм следующие команды работал для меня:

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") 

Последний комментарий, следите за использованием вашей памяти. Если ваш компьютер запускает пейджинговую память на диск, процессор больше не является критическим путем, и все распараллеливание не будет иметь никакого значения.

Смежные вопросы