Преобразование матрицы условий документа в матрицу с большим количеством данных вызывает переполнение - PullRequest
14 голосов
/ 28 июля 2011

Давайте сделаем немного Text Mining

Здесь я стою с матрицей терминов документа (из пакета tm)

dtm <- TermDocumentMatrix(
     myCorpus,
     control = list(
         weight = weightTfIdf,
         tolower=TRUE,
         removeNumbers = TRUE,
         minWordLength = 2,
         removePunctuation = TRUE,
         stopwords=stopwords("german")
      ))

Когда я делаю

typeof(dtm)

Я вижу, что это «список», и структура выглядит как

Docs
Terms        1 2 ...
  lorem      0 0 ...
  ipsum      0 0 ...
  ...        .......

Так что я пытаюсь

wordMatrix = as.data.frame( t(as.matrix(  dtm )) ) 

, который работает для 1000 документов.

Но когда я пытаюсь использовать 40000, это уже не так.

Я получаю эту ошибку:

Fehler in vector(typeof(x$v), nr * nc) : Vektorgröße kann nicht NA sein
Zusätzlich: Warnmeldung:
In nr * nc : NAs durch Ganzzahlüberlauf erzeugt

Ошибка в векторе ...: Вектор не может быть NA Дополнительно: В nr * nc NA, созданные целочисленным переполнением

Итак, я посмотрел на as.matrix, и оказалось, что каким-то образом функция преобразует его в вектор с as.vector, а затем в матрицу.Преобразование в вектор работает, но не из вектора в матрицу.

У вас есть предложения, в чем может быть проблема?

Спасибо, капитан

Ответы [ 3 ]

17 голосов
/ 28 июля 2011

Целочисленное переполнение говорит вам точно, в чем проблема: с 40000 документов у вас слишком много данных. Между прочим, проблема в преобразовании в матрицу начинается, что можно увидеть, если взглянуть на код базовой функции:

class(dtm)
[1] "TermDocumentMatrix"    "simple_triplet_matrix"

getAnywhere(as.matrix.simple_triplet_matrix)

A single object matching ‘as.matrix.simple_triplet_matrix’ was found
...
function (x, ...) 
{
    nr <- x$nrow
    nc <- x$ncol
    y <- matrix(vector(typeof(x$v), nr * nc), nr, nc)
   ...
}

Это строка, на которую ссылается сообщение об ошибке. То, что происходит, может быть легко смоделировано с помощью:

as.integer(40000 * 60000) # 40000 documents is 40000 rows in the resulting frame
[1] NA
Warning message:
NAs introduced by coercion 

Функция vector() принимает аргумент с длиной, в данном случае nr*nc Если это больше, чем appx. 2e9 (.Machine$integer.max), он будет заменен на NA. Этот NA недопустим в качестве аргумента для vector().

Итог: вы выходите за пределы R. На данный момент работа в 64-битной системе вам не поможет. Вам придется прибегнуть к другим методам. Одной из возможностей может быть продолжение работы со списком, который у вас есть (dtm - список), выбор нужных данных с помощью манипуляции со списком и переход оттуда.

PS: я сделал объект dtm

require(tm)
data("crude")
dtm <- TermDocumentMatrix(crude,
                          control = list(weighting = weightTfIdf,
                                         stopwords = TRUE))
3 голосов
/ 08 октября 2015

Вот очень очень простое решение, которое я обнаружил недавно

DTM=t(TDM)#taking the transpose of Term-Document Matrix though not necessary but I prefer DTM over TDM
M=as.big.matrix(x=as.matrix(DTM))#convert the DTM into a bigmemory object using the bigmemory package 
M=as.matrix(M)#convert the bigmemory object again to a regular matrix
M=t(M)#take the transpose again to get TDM

Обратите внимание, что использование транспонирования TDM для получения DTM является абсолютно необязательным, я лично предпочитаю играть с матрицами таким образом

PSC Не могу ответить на вопрос 4 года назад, так как я только что поступил в колледж

0 голосов
/ 19 августа 2016

Основываясь на ответе Joris Meys, я нашел решение. Документация "vector ()" относительно аргумента "length"

... Для длинного вектора, то есть length> .Machine $ integer.max, он должен иметь тип "double" ...

Таким образом, мы можем сделать небольшое исправление as.matrix ():

as.big.matrix <- function(x) {
  nr <- x$nrow
  nc <- x$ncol
  # nr and nc are integers. 1 is double. Double * integer -> double
  y <- matrix(vector(typeof(x$v), 1 * nr * nc), nr, nc)
  y[cbind(x$i, x$j)] <- x$v
  dimnames(y) <- x$dimnames
  y
}
...