2013-02-19 3 views
0

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

+0

подсчитайте количество пробелов + 1? Вероятно, вы могли бы использовать некоторые векторизованные операции, такие как 'gsub', чтобы заменить весь вектор символов на« ", кроме пробелов, а затем подсчитывать с помощью' nchar'? Конечно, это всего лишь метод. Интересно, ваша проблема - это метод или загрузка его в R ... – Arun

+0

Вам нужно просто прочитать весь комплект данных? Почему бы не использовать 'strsplit (...," ")' для каждой отдельной записи? –

+0

@Arun - На самом деле я хочу посчитать наличие определенных слов, а не просто подсчитать количество слов. Обновлен мой вопрос. – ilanman

ответ

1

Возможно, подойдите к нему параллельно. Я использовал 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)) 
+0

Почему параллель? Это очень быстро, без параллелизма. 'system.time (o <- sapply (strsplit (wordcols," [] + "), length))' занимает 0,45 секунды на моем ноутбуке. – Arun

+0

На самом деле я хочу рассказать о наличии конкретных слов (обновил мой вопрос). Так что, не нужно ли «wordcols» хранить весь набор данных перед тем, как применить свой метод (что очень интересно, кстати)? Я могу хранить данные в SQL достаточно легко, но чтение его в R через RODBC (что я сейчас делаю) ломается. – ilanman

0

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

Смежные вопросы