Я работаю над некоторым анализом текста. Одна вещь, которую я сделал, - это вытащить верхние слова из документов, чтобы сравнить и узнать о разных показателях. Это было быстро и легко. Возникла проблема с определением того, какие разделители использовать, и вытягивая отдельные слова, а не фразы, удаляющие информацию из анализа. Например, .NET Developer становится net и разработчиком после преобразования. У меня уже был список заданных фраз/слов из старого проекта, который кто-то оставил. Следующим шагом было выведение определенных ключевых слов из нескольких строк для нескольких документов.R Оптимизация двойной петли, которая использует stri_extract
Я изучал несколько методов, включая векторизация, параллельную обработку, используя код C++ внутри R и другие. Двигаясь вперед, я буду экспериментировать со всеми этими методами и попытаться ускорить мой процесс, а также дать мне эти инструменты для будущих проектов. В то же время (без экспериментов) мне интересно, какие корректировки очевидны, что значительно уменьшит время, затраченное, например, движущиеся части кода за пределами цикла, используя лучшие пакеты и т. д. У меня также есть индикатор выполнения, но я могу удалить его, если он значительно замедлит мой цикл.
Вот мой код:
words <- read.csv("keyphrases.csv")
df <- data.frame(x=(list.files("sec/new/")))
total = length(df$x)
pb <- txtProgressBar(title = "Progress Bar", min = 0, max =total , width = 300, style=3)
for (i in df$x){
s <- read.csv(paste0("sec/new/",i))
u <- do.call(rbind, pblapply(words$words, function(x){
t <- data.frame(ref= s[,2], words = stri_extract(s[,3], coll=x))
t<-na.omit(t)
}))
write.csv(u,paste0("sec/new_results/new/",i), row.names = F)
setTxtProgressBar(pb, i, title=paste(round(which(df$x== i)/total*100, 2),"% done"))
}
Так words
имеет 60000 строк слов/коротких фраз - не более 30 символов каждая. Длина i составляет около 4000, где каждый я имеет от 100 до 5000 строк, причем каждая строка имеет от 1 до 5000 символов. Любые случайные символы/строки могут использоваться, если мой вопрос должен быть воспроизводимым.
Я использовал только lapply, потому что объединение его с rbind и do.call работало очень хорошо, наличие цикла внутри цикла также может замедлить процесс.
Так что с летучей мыши есть что-то, что я могу сделать правильно? Обмен данными data.frame с таблицей данных или использованием векторов. Делать чтение и запись вне цикла каким-то образом? Возможно, напишите так, чтобы одна из петель не была вложенной?
Заранее спасибо
EDIT
Ключевой элемент, который нуждается в ускорении является экстракт. использовать ли я lapply выше или сократить его до:
for(x in words$words){t<-data.table(words=stri_extract(s[,3], coll=x))}
Это все еще занимает большую часть времени в течение долгого пути. навыки и t - таблицы данных в этом случае.
EDIT2
Попытка создать воспроизводимые данные:
set.seed(42)
words <- data.frame(words=rnorm(1:60000))
words$wwords <- as.String(words$words)
set.seed(42)
file1 <- data.frame(x=rnorm(1:5000))
file1$x<-as.String(file1$x)
pblapply(words$words, function(x){
t <- data.frame(words = stri_extract(file1$x, coll=x))
})
Было бы полезно, если бы вы действительно предоставили некоторые данные о игрушке, чтобы иметь возможность выполнять свой код, см. Http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible- Пример – majom
Я не могу предоставить свои данные, я поставил размеры файлов в свой вопрос, кто-то, кто может ответить на этот вопрос, будет намного лучше создавать случайные строки/файлы, чем я. Возможно, это так же просто, как создание случайных векторов чисел, ive не пытались это сделать раньше. –
Я говорил о подготовке TOY DATA. Опыт показывает, что люди с большей вероятностью скачут на вопрос, могут ли они сначала запустить ваш код - без необходимости имитировать данные самостоятельно. – majom