Используйте функцию корпуса tm с большими данными в R

Я пытаюсь выполнять анализ больших данных в R с помощью tm.

Я часто сталкиваюсь с проблемами памяти (например, can not allocation vector of size.... ) и использую установленные методы устранения этих проблем, такие как

  • используя 64-битный R
  • пробовать разные ОС (Windows, Linux, Solaris и т.д.)
  • установка memory.limit() на максимум
  • убедиться, что на сервере доступно достаточно оперативной памяти и вычислений (которые есть)
  • свободно использовать gc()
  • профилирование кода на наличие узких мест
  • разбиение больших операций на несколько более мелких операций

Однако при попытке запустить Corpus для вектора из миллиона или около того текстовых полей я сталкиваюсь с несколько иной ошибкой памяти, чем обычно, и я не знаю, как обойти эту проблему. Ошибка:

> ds <- Corpus(DataframeSource(dfs))
Error: memory exhausted (limit reached?)

Могу ли я (и должен) запускать Corpus постепенно на блоках строк из этого исходного фрейма данных, а затем объединять результаты? Есть ли более эффективный способ запустить это?

Размер данных, которые вызовут эту ошибку, зависит от компьютера, на котором она запущена, но если вы возьмете встроенный набор данных crude и реплицируете документы до тех пор, пока он не станет достаточно большим, вы сможете реплицировать ошибку.

ОБНОВЛЕНИЕ

Я экспериментировал с попыткой объединить меньшие корпуса, т.е.

test1 <- dfs[1:10000,]
test2 <- dfs[10001:20000,]

ds.1 <- Corpus(DataframeSource(test1))
ds.2 <- Corpus(DataframeSource(test2))

и хотя я не добился успеха, я обнаружил tm_combine, который должен решать именно эту проблему. проблема. Единственная загвоздка в том, что по какой-то причине моя 64-битная сборка R 3.1.1 с новейшей версией tm не может найти функцию tm_combine. Может быть, он был удален из пакета по какой-то причине? Я расследую...

> require(tm)
> ds.12 <- tm_combine(ds.1,ds.2)
Error: could not find function "tm_combine"

person Hack-R    schedule 27.08.2014    source источник
comment
Весь ваш код находится в одной функции? Или сценарий?   -  person Rich Scriven    schedule 27.08.2014
comment
это сценарий на данный момент   -  person Hack-R    schedule 27.08.2014
comment
Я предполагаю, что ваш код может создавать слишком много копий... но я подожду экспертов.   -  person Rich Scriven    schedule 27.08.2014
comment
Справедливо. Сейчас это просто исходный фрейм данных и неработающая команда Corpus в среде.   -  person Hack-R    schedule 27.08.2014
comment
Вы можете привести воспроизводимый пример?   -  person James Tobin    schedule 27.08.2014
comment
@JamesTobin обычно я бы так и сделал, но размер данных, вызывающих эту ошибку, полностью зависит от компьютера, на котором она запущена, поэтому нет ни одного примера, который воспроизвел бы ошибку для всех остальных. Это просто кадр данных с немногим более 1 миллиона строк произвольных текстовых данных. У меня на этой машине 16 ядер ЦП и 40 ГБ ОЗУ. Но это то же самое, как если бы вы использовали встроенный сырой набор данных и удлинили его в 50 000 раз.   -  person Hack-R    schedule 27.08.2014


Ответы (1)


Я не знаю, стал ли tm_combine устаревшим или почему он не найден в пространстве имен tm, но я нашел решение, используя Corpus на меньших фрагментах фрейма данных, а затем объединив их.

Это В сообщении StackOverflow был простой способ сделать это без tm_combine:

test1 <- dfs[1:100000,]
test2 <- dfs[100001:200000,]

ds.1 <- Corpus(DataframeSource(test1))
ds.2 <- Corpus(DataframeSource(test2))

#ds.12 <- tm_combine(ds.1,ds.2) ##Error: could not find function "tm_combine"
ds.12 <- c(ds.1,ds.2)

что дает вам:

ds.12

<<VCorpus (documents: 200000, metadata (corpus/indexed): 0/0)>>

Извините, что не понял этого сам, прежде чем спросить. Я пытался и потерпел неудачу с другими способами объединения объектов.

person Hack-R    schedule 27.08.2014