удаление стоп-слов из большого фрейма данных в R с использованием циклов занимает слишком много времени - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь удалить стоп-слова из большого фрейма данных в R (12M строк). Я попытался выполнить его для фрейма данных 30k строк, и он отлично работает (это делается в течение 2 минут). Для фрейма данных 300k строк это занимает слишком много времени (около 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"

1 Ответ

0 голосов
/ 04 июня 2019

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

Код ниже:


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