Какой самый быстрый способ подсчета слов в большом наборе данных с помощью R?

У меня есть база данных SQL с более чем 7 миллионами записей, каждая из которых содержит некоторый текст. В каждой записи я хочу выполнить анализ текста, например, подсчитать количество вхождений определенных слов. Я пробовал функцию R tokenize в пакете openNLP, которая отлично работает с небольшими файлами, но 7 миллионов записей * между 1-100 словами на запись слишком велики для R, чтобы хранить их в data.frame. Я думал об использовании пакетов R bigmemory или ff или даже пакета mapReduce. Ребята, у вас есть предпочтительный подход или пакет для этого типа анализа?


person ilanman    schedule 19.02.2013    source источник
comment
подсчитать количество пробелов + 1? Вероятно, вы могли бы использовать некоторые векторизованные операции, такие как gsub, чтобы заменить весь вектор символов, кроме пробелов, а затем подсчитать с помощью nchar? Конечно, это всего лишь метод. Интересно, ваша проблема связана с методом или загрузкой его в R...   -  person Arun    schedule 19.02.2013
comment
Вам нужно прочитать весь набор данных сразу? Почему бы не использовать strsplit(...," ") для каждой отдельной записи?   -  person Daniel Fischer    schedule 19.02.2013
comment
@Arun - я действительно хочу подсчитать появление определенных слов, а не просто подсчитать количество слов. Обновил мой вопрос.   -  person ilanman    schedule 19.02.2013
comment
Но если вы хотите подсчитать появление определенного слова, я думаю, вы могли бы сделать это на стороне SQL, все еще используя likeoperator, или это требует слишком большой мощности процессора? И как только у вас будет подмножество строк, вы можете отправить его в R (или завершить всю работу на стороне SQL).   -  person Daniel Fischer    schedule 19.02.2013
comment
Почему бы не сделать поиск в базе данных?   -  person    schedule 19.02.2013


Ответы (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
comment
Почему параллельно? Это очень быстро без параллелизма. system.time(o <- sapply(strsplit(wordcols, "[ ]+"), length)) занимает 0,45 секунды на моем ноутбуке. - person Arun; 19.02.2013
comment
Я действительно хочу подсчитать появление определенных слов (обновил мой вопрос). Итак, не нужно ли мне wordcols хранить весь мой набор данных перед применением вашего метода (который, кстати, очень интересен)? Я могу достаточно легко хранить данные в SQL, но чтение их в R через RODBC (что я сейчас делаю) не работает. - person ilanman; 19.02.2013

На стороне SQL вы также можете извлечь для каждой записи len, затем применить к ней replace(" yourWord ","") (с фланкирующими пробелами...), снова вычислить общую длину строки, а затем взять различия между этими двумя, что должно сделать трюк. Мои навыки SQL не настолько хороши, чтобы я мог легко представить здесь работающий пример, извините за это...

person Daniel Fischer    schedule 19.02.2013