2016-07-14 15 views
1

У меня есть корпус примерно с данными 75 МБ. Я пытаюсь использовать следующую команду:Снять стоп-слова и медленную функцию на корпусе в R

tm_map(doc.corpus, removeWords, stopwords("english")) 
tm_map(doc.corpus, tolower) 

Эти две функции выполняют не менее 40 минут для запуска. Я ищу ускорение процесса, поскольку я использую матрицу tdm для своей модели.

Я очень часто пробовал команды, такие как gc() и memory.limit(10000000), но я не могу ускорить скорость своего процесса.

У меня есть система с 4GB ОЗУ и работаю с локальной базой данных для чтения входных данных.

Надеясь, что предложения ускорятся!

+0

распараллеливания вычислений? Разделите свой текст на куски, скажем, на 20 Мбайт и запустите на разных ядрах. Я считаю, что все будет хорошо, потому что удаление стоп-слов - это просто задача словаря и контекстно-зависимая. Кроме того, R очень медленно для этих вещей, поэтому, если скорость имеет решающее значение для вас, подумайте о том, чтобы переписать его быстрее, например C. – FisherDisinformation

+0

@ArtificialBreeze Можно ли распараллелить его в R? Мне комфортно работать с R, глядя на сокращение временной задержки! –

+0

Итак, я обычно либо 1) использую пакет 'parallel', который довольно хорош и имеет свои собственные аналоги« apply »и т. Д., Либо 2) перекодирует некоторые части кода в inline C или C++ с помощью' compiler' и 'inline'. Я думаю, вам стоит взглянуть на пакет 'parallel', чтобы начать. – FisherDisinformation

ответ

2

Может быть, вы можете дать quanteda попробовать

library(stringi) 
library(tm) 
library(quanteda) 

txt <- stri_rand_lipsum(100000L) 
print(object.size(txt), units = "Mb") 
# 63.4 Mb 

system.time(
    dfm <- dfm(txt, toLower = TRUE, ignoredFeatures = stopwords("en")) 
) 
# Elapsed time: 12.3 seconds. 
#  User  System verstrichen 
#  11.61  0.36  12.30 

system.time(
    dtm <- DocumentTermMatrix(
    Corpus(VectorSource(txt)), 
    control = list(tolower = TRUE, stopwords = stopwords("en")) 
) 
) 
# User  System verstrichen 
# 157.16  0.38  158.69 
+0

согласован. Я использовал «кванда», кажется, быстрее. Я не уверен, что оба 'tdm' одинаковы! 'quanteda' дает« разреженную матрицу », это то же самое, что и в' tm'? –

+1

Класс dfmSparse - это разрешенная матричная версия класса dfm, наследующая класс dgCMatrix из пакета Matrix. Это тип объекта по умолчанию, созданный, когда объектные объекты являются объектом интереса, так как типичные текстовые функции имеют тенденцию содержать много нулей. До тех пор, пока последующие преобразования dfm сохраняют ячейки с нулевым числом отсчетов, dfm должен оставаться разреженным. tm дает вам объект класса TermDocumentMatrix или класс DocumentTermMatrix (оба наследуются от простой триплетной матрицы в пакете slam), содержащий разреженную матрицу терминальных документов или матрицу документов. – lukeA

0

Во-первых, я хотел бы попробовать

tm_map(doc.corpus, content_transformer(tolower)) 

Поскольку tolower() не в списке getTransformations()

+0

тоже попробовал синтаксис!но никакое улучшение производительности –

+0

могло бы показать, как вы создаете корпус, потому что я не сталкивался с такой проблемой, имея корпус более 100 Мб и время обработки <2min, и yep, моя оперативная память в 4 раза больше, но я уверен это не должно быть случай –

+0

'corpus <- Corpus (VectorSource (vector_list)) skipWords <- function (x) removeWords (x, стоп-слова (« английский »)) funcs <- list (tolower, removePunctuation, removeNumbers , stripWhitespace, skipWords) a <- tm_map (corpus, FUN = tm_reduce, tmFuns = funcs) a <- tm_map (a, PlainTextDocument) ' –

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

  • Нет связанных вопросов^_^