/ / big document term matrix - erreur lors du comptage du nombre de caractères des documents - r, matrice, extraction de texte, tm

gros document terme matrice - erreur lors du comptage du nombre de caractères des documents - r, matrice, extraction de texte, tm

J'ai construit une grande matrice de termes de document avec le package RTextTools.

J'essaie maintenant de compter le nombre de caractères dans les lignes de la matrice afin de pouvoir supprimer les documents vides avant de modéliser des sujets.

Mon code ne donne pas d'erreur lorsque je l'applique à unéchantillon de mon corpus, obtenant une matrice plus petite, mais lorsque j'essaie de compter la longueur des lignes des documents de la matrice produite à partir de l'ensemble de mon corpus (environ 75 000 tweets), le message d'erreur suivant s'affiche:

Error in vector(typeof(x$v), nr * nc) :
the dimension of the vector no cannot be NA
And: Warning message:
In nr * nc : NA produced by integer overflow

Ceci est mon code:

matrix <- create_matrix(data$clean_text, language="french", stemWords=TRUE, removeStopwords=TRUE, removeNumbers=TRUE, stripWhitespace=TRUE, toLower=TRUE, removePunctuation=TRUE, minWordLength=3)

rowTotals <- apply(matrix, 1, sum)

Si j'essaie avec une matrice de 25 000 documents, l'erreur suivante apparaît:

message: rowTotals <- apply(matrix, 1, sum)
Errore: cannot allocate vector of size 7.1 Gb

Réponses:

1 pour la réponse № 1

Vous pourrez peut-être contourner ce problème si vous conservez vos données dans un fichier dtm, qui utilise une représentation matricielle éparse qui utilise beaucoup plus efficacement la mémoire qu'une matrice normale.

La raison pour laquelle le apply La fonction donne une erreur parce qu’elle convertit la matrice creuse en une matrice régulière (la matrix objet dans votre Q - en fait c'est un style médiocre à donnernoms d'objets de données qui sont aussi des noms de fonctions, en particulier des fonctions de base). Cela signifie que R doit allouer de la mémoire pour tous les zéros du dtm (généralement des zéros, ce qui signifie qu'il y a beaucoup de mémoire contenant des zéros). Avec une matrice creuse, R n’a pas besoin de stocker de zéros. .

Voici les premières lignes de la source pour apply, voir la dernière ligne ici pour la conversion en matrice régulière:

apply
function (X, MARGIN, FUN, ...)
{
FUN <- match.fun(FUN)
dl <- length(dim(X))
if (!dl)
stop("dim(X) must have a positive length")
if (is.object(X))
X <- if (dl == 2L)
as.matrix(X) # this is where your memory gets filled with zeros

Alors, comment éviter cette conversion? Voici un moyen de parcourir les lignes pour obtenir leurs sommes tout en conservant le format matriciel épars:

sapply(seq(nrow(matrix)), function(i) sum(matrix[i,]))
[1] 2 1 2 2 1

La sous-définition de cette manière préserve le format fragmenté et ne convertit pas l'objet en une représentation matricielle commune, plus onéreuse en mémoire. Nous pouvons vérifier la représentation:

str(matrix[1,])
List of 6
$ i       : int [1:2] 1 1
$ j       : int [1:2] 1 3
$ v       : num [1:2] 1 1
$ nrow    : int 1
$ ncol    : int 6
$ dimnames:List of 2
..$ Docs : chr "1"
..$ Terms: chr [1:6] "document" "file" "first" "second" ...
- attr(*, "class")= chr [1:2] "DocumentTermMatrix" "simple_triplet_matrix"
- attr(*, "weighting")= chr [1:2] "term frequency" "tf"

Donc dans le sapply fonction nous travaillons toujours sur une matrice clairsemée. Et même si sum (ou quelle que soit la fonction que vous utilisez là-bas) effectue une sorte de conversion, elle ne convertira qu'une ligne du fichier dtm, et non la totalité.

Le principe général lorsque vous travaillez avec des données de texte assez longues dans R est de conserver votre fichier dtm sous forme de matrice fragmentée afin de pouvoir rester dans les limites de la mémoire.