удаление стоп-слов из большого фрейма данных в R с использованием циклов занимает слишком много времени

Я пытаюсь удалить стоп-слова из большого фрейма данных в R (12 миллионов строк). Я попытался выполнить его для фрейма данных с 30 тыс. строк, и он отлично работает (это делается в течение 2 минут). Для фрейма данных с 300 тыс. строк требуется слишком много времени (около 4 часов), но мне нужно выполнить его для 12-метровый кадр данных, я просто хочу знать, есть ли другой способ сделать это (возможно, цикл вызывает замедление)

Функция trait_text определена в области кода, а removeWords — это предопределенная функция R, которая удаляет стоп-слова из varchar.

Другой вопрос в том же контексте: нужно ли мне переходить на 64-разрядную версию RStudio? потому что 32-битная версия не использует всю оперативную память, доступную на машине.

#define stopwords
stop<-c("MONSIEUR","MADAME","MR","MME","M","SARL","SA","EARL","EURL","SCI","SAS","ETS","STE","SARLU",     "SASU","CFA","ATS","GAEC","COMMUNE","SOCIETE",toupper(stopwords::stopwords("fr", source = "snowball")))


##trait text :

#Remove Multiple spaces
del_multispace = function(text) {
  return(text <- gsub("\\s+", " ", text))
}

#Remove Ponctuation
del_punctuation = function(text) {
  text <- gsub("[[:punct:]]", "", text)
}

#Remove accents 
del_accent = function(text) {
  text <- gsub("['`^~\"]", " ", text)
  text <- iconv(text, from = "UTF-8", to = "ASCII//TRANSLIT//IGNORE")
  text <- gsub("['`^~\"]", "", text)
  return(text)
}


trait_text=function(text) {

  text = del_multispace(text)
  text = del_punctuation(text)
  text = del_accent(text)

}

#remove stopwords for data :
system.time(for (i in 1:nrow(test_data)) {

  print(paste("client n: ",i))
  x<-removeWords(trait_text(test_data$ref[i]),stop)


  #output
  test_data$ref[i]<-gdata::trim(paste(x, collapse = ' '))

})

Sample test_data with desired output :


      ref        ouptut 
1 |"LE LA ONE" | "ONE"
2 |"SAS TWO"   | "TWO"
3 |"MR THREE"  | "THREE"

person Amine96    schedule 03.06.2019    source источник
comment
Сделайте вопрос воспроизводимым: stackoverflow.com/questions/5963269/ . Также: из каких пакетов находятся функции trait_text и removeWords?   -  person machine    schedule 03.06.2019
comment
Кроме того, 32-разрядная версия RStudio может запускать 64-разрядную сессию R. RStudio — это только интерфейс. Это не делает тяжелую работу. Когда вы запускаете RStudio, он сообщит вам, используете ли вы 32- или 64-битную версию R, в тексте в верхней части консоли.   -  person Andrew    schedule 03.06.2019
comment
@schwantke я обновил сообщение для trait_text и removeWords   -  person Amine96    schedule 03.06.2019
comment
Вам не нужно ничего зацикливать с gsub. Просто запустите его для всего столбца фрейма данных. Помогло бы увидеть removeWords(), так как его тоже можно векторизовать.   -  person Parfait    schedule 03.06.2019
comment
@ Amine96: Вы не предоставили образец test_data   -  person machine    schedule 03.06.2019
comment
@schwantke вы можете найти его в разделе кода   -  person Amine96    schedule 03.06.2019
comment
@Parfait Я не могу использовать gsub с вектором стоп-слова   -  person Amine96    schedule 03.06.2019
comment
@ Amine96: запуск кода дает мне объект 'test_data' не найден   -  person machine    schedule 03.06.2019


Ответы (1)


Я нашел решение своего вопроса, которое отлично работает, избегая циклов.

Код ниже:


library(tm)
library(gdata)


#stopwords
stop<-c("MONSIEUR","MADAME","MR","MME","M","SARL","SA","EARL","EURL","SCI","SAS","ETS","STE","SARLU","SASU","CFA","ATS","GAEC","COMMUNE","SOCIETE",toupper(stopwords::stopwords("fr", source = "snowball")))


#Remove multiple spaces
del_multispace = function(text) {
  return(text <- gsub("\\s+", " ", text))
}

#Remove punctuation 
del_punctuation = function(text) {
  return(text <- gsub("[[:punct:]]", "", text))
}

#Remove accents
del_accent = function(text) {
  text <- gsub("['`^~\"]", " ", text)
  text <- iconv(text, from = "UTF-8", to = "ASCII//TRANSLIT//IGNORE")
  text <- gsub("['`^~\"]", "", text)
  return(text)
}

#remove stopwords from text
del_stopwords=function(text) {

  text<-removeWords(text,stop)
  return(text)
}


#Cleaning function :
trait_text=function(text) {

  text = del_multispace(text)
  text = del_punctuation(text)
  text = del_accent(text)
  text = del_stopwords(text)
}


#remove stopwords from test_data:

system.time(test_data$x<-trim(trait_text(test_data$ref)))
person Amine96    schedule 04.06.2019