У меня есть база данных SQL с более чем 7 миллионами записей, каждая из которых содержит некоторый текст. В каждой записи я хочу выполнить анализ текста, например, подсчитать количество вхождений определенных слов. Я пробовал функцию R tokenize
в пакете openNLP
, которая отлично работает с небольшими файлами, но 7 миллионов записей * между 1-100 словами на запись слишком велики для R, чтобы хранить их в data.frame
. Я думал об использовании пакетов R bigmemory
или ff
или даже пакета mapReduce
. Ребята, у вас есть предпочтительный подход или пакет для этого типа анализа?
Какой самый быстрый способ подсчета слов в большом наборе данных с помощью R?
Ответы (2)
Может быть, подойти к этому параллельно. Я использовал parLapply
b/c. Думаю, он работает на всех трех ОС.
wc <- function(x) length(unlist(strsplit(x, "\\s+")))
wordcols <- rep("I like icecream alot.", 100000)
library(parallel)
cl <- makeCluster(mc <- getOption("cl.cores", detectCores()))
clusterExport(cl=cl, varlist=c("wc", "wordcols"), envir=environment())
output <- parLapply(cl, wordcols, function(x) {
wc(x)
}
)
stopCluster(cl)
sum(unlist(output))
person
Tyler Rinker
schedule
19.02.2013
Почему параллельно? Это очень быстро без параллелизма.
system.time(o <- sapply(strsplit(wordcols, "[ ]+"), length))
занимает 0,45 секунды на моем ноутбуке.
- person Arun; 19.02.2013
Я действительно хочу подсчитать появление определенных слов (обновил мой вопрос). Итак, не нужно ли мне
wordcols
хранить весь мой набор данных перед применением вашего метода (который, кстати, очень интересен)? Я могу достаточно легко хранить данные в SQL, но чтение их в R через RODBC (что я сейчас делаю) не работает.
- person ilanman; 19.02.2013
На стороне SQL вы также можете извлечь для каждой записи len
, затем применить к ней replace(" yourWord ","")
(с фланкирующими пробелами...), снова вычислить общую длину строки, а затем взять различия между этими двумя, что должно сделать трюк. Мои навыки SQL не настолько хороши, чтобы я мог легко представить здесь работающий пример, извините за это...
person
Daniel Fischer
schedule
19.02.2013
gsub
, чтобы заменить весь вектор символов, кроме пробелов, а затем подсчитать с помощьюnchar
? Конечно, это всего лишь метод. Интересно, ваша проблема связана с методом или загрузкой его в R... - person Arun   schedule 19.02.2013strsplit(...," ")
для каждой отдельной записи? - person Daniel Fischer   schedule 19.02.2013like
operator, или это требует слишком большой мощности процессора? И как только у вас будет подмножество строк, вы можете отправить его в R (или завершить всю работу на стороне SQL). - person Daniel Fischer   schedule 19.02.2013