web-dev-qa-db-fra.com

tm_map a une erreur parallel :: mclapply dans R 3.0.1 sur Mac

J'utilise R 3.0.1 sur la plate-forme: x86_64-Apple-darwin10.8.0 (64 bits)

J'essaie d'utiliser tm_map à partir de la bibliothèque tm. Mais quand j'exécute le code

library(tm)
data('crude')
tm_map(crude, stemDocument)

Je reçois cette erreur:

Warning message:
In parallel::mclapply(x, FUN, ...) :
  all scheduled cores encountered errors in user code

Est-ce que quelqu'un connaît une solution pour cela?

17
Dominik

Je suspecte que le paquet SnowballC ne soit pas installé, ce qui semble être nécessaire. tm_map est supposé exécuter stemDocument sur tous les documents en utilisant mclapply. Essayez simplement d’exécuter la fonction stemDocument sur un seul document afin d’extraire l’erreur suivante:

stemDocument(crude[[1]])

Pour moi, j'ai une erreur:

Error in loadNamespace(name) : there is no package called ‘SnowballC’

Je me suis donc contenté d'installer SnowballC et cela a fonctionné. Clairement, SnowballC devrait être une dépendance.

29
nograpes

Je viens de courir dans cela. Il m'a fallu un peu de fouille mais j'ai découvert ce qui se passait.

  1. J'avais une ligne de code 'rdevel <- tm_map (rdevel, asPlainTextDocument)'

  2. En cours d'exécution, l'erreur a été générée

 
 En parallèle :: mclapply (x, FUN, ...): 
 Tous les cœurs planifiés ont rencontré des erreurs dans le code utilisateur 
 
  1. Il s'avère que "tm_map" appelle du code en "parallèle" qui tente de déterminer le nombre de cœurs que vous avez. Pour voir ce qu'il pense, tapez
 
> getOption ("mc.cores", 2L) 
 [1] 2 
> 
 
  1. Aha moment! Dites à l'appel 'tm_map' de n'utiliser qu'un seul noyau!
 
> rdevel <- tm_map (rdevel, asPlainTextDocument, mc.cores = 1) 
 Erreur dans match.fun (FUN): objet 'asPlainTextDocument' introuvable 
> rdevel <-tm_map (rdevel, asPlainTextDocument, mc.cores = 4) 
 Message d'avertissement: 
 En parallèle :: mclapply (x, FUN, ...): 
 tous les cœurs planifiés ont rencontré des erreurs dans le code utilisateur 
> 
 

Donc ... avec plus d'un noyau, plutôt que de vous donner le message d'erreur, "parallèle" vous indique simplement qu'il y avait une erreur dans chaque noyau. Pas utile, parallèle! J'ai oublié le point - le nom de la fonction est supposé être 'as.PlainTextDocument'!

Donc, si vous obtenez cette erreur, ajoutez 'mc.cores = 1' à l'appel 'tm_map' et exécutez-le à nouveau.

17
znmeb

J'ai trouvé une réponse à cette question qui a été un succès pour moi dans cette question : Charles Copley, dans sa réponse , indique qu'il pense que le nouveau paquetage tm nécessite que lazy = TRUE soit explicitement défini.

Donc, votre code ressemblerait à ceci

library(tm)
data('crude')
tm_map(crude, stemDocument, lazy = TRUE)

J'ai aussi essayé sans SnowballC pour voir si c'était une combinaison de ces deux réponses. Cela ne semble pas affecter le résultat de toute façon.

11
magsgiust

J'ai rencontré le même problème dans tm avec un Intel Core I7 à processeur Intel Core fonctionnant sous Mac OS X 10.10.5 et j'ai reçu l'avertissement suivant:

Dans mclapply (contenu (x), FUN, ...) erreur rencontrée dans le code utilisateur du noyau 1 planifié, toutes les valeurs du travail seront affectées

Je créais un corpus après avoir téléchargé des données Twitter.

La solution de Charles Copley a également fonctionné pour moi. J'ai utilisé: tm_map(*filename*, stemDocument, lazy = TRUE) après la création de mon corpus puis tm a fonctionné correctement.

3
Carlos Davila

J'ai été confronté au même problème mais finalement résolu. Je suppose que si je nomme le corpus comme "longName" ou "companyNewsCorpus", je comprends le problème, mais si j'utilise la valeur de corpus comme "a", cela fonctionne bien. Vraiment bizarre.

Le code ci-dessous donne le même message d'erreur mentionné dans ce fil

companyNewsCorpus  <-Corpus(DirSource("SourceDirectory"),
                            readerControl = list(language="english"))
companyNewsCorpus <- tm_map(companyNewsCorpus, 
                            removeWords, stopwords("english")) 

Mais si je convertis cela ci-dessous, cela fonctionne sans problème.

a  <-Corpus(DirSource("SourceDirectory"), 
            readerControl = list(language="english"))
a <- tm_map(a, removeWords, stopwords("english")) 
3
Sudarshan

J'ai également rencontré le même problème lors de l'utilisation de la fonction removeWords de la bibliothèque tm. Certaines des autres réponses telles que la définition du nombre de cœurs sur 1 ont fonctionné pour supprimer l'ensemble de mots vides anglais, mais je souhaitais également supprimer une liste personnalisée de prénoms et de noms de famille de mon corpus; mots longs chacun.

Aucune des autres suggestions n’aiderait à résoudre ce problème et il s’avère que, par essais et erreurs, removeWords semblait avoir une limite de 1 000 mots dans un vecteur. Donc, j'ai écrit cette fonction qui a résolu le problème pour moi:

# Let x be a corpus
# Let y be a vector containing words to remove
removeManyWords <- function (x, y) {

      n <- ceiling(length(y)/1000)
      s <- 1
      e <- 1000

      for (i in 1:n) {

            x <- tm_map(x, content_transformer(removeWords), y[s:e])
            s <- s + 1000
            e <- e + 1000

      }

      x

 }

Cette fonction compte essentiellement le nombre de mots dans le vecteur de mots que je souhaite supprimer, puis le divise par 1000 et arrondit au nombre entier le plus proche, n. Nous parcourons ensuite le vecteur de mots pour supprimer n fois. Avec cette méthode, je n'ai pas besoin d'utiliser lazy = TRUE ni de changer le nombre de cœurs à utiliser, comme le montre l'appel réel removeWords dans la fonction. J'espère que cela t'aides!

1
mgiglia

Je travaillais sur des données Twitter et j'ai eu la même erreur dans la question initiale alors que j'essayais de convertir tout le texte en texte inférieur avec la fonction tm_map()

Warning message: In parallel::mclapply(x, FUN, ...) :   
all scheduled cores encountered errors in user code

L’installation et le chargement du package SnowballC ont complètement résolu le problème. J'espère que cela t'aides.

0
karunakarantk