web-dev-qa-db-fra.com

Rtm package vcorpus: erreur lors de la conversion d'un corpus en trame de données

J'utilise le package tm pour nettoyer certaines données à l'aide du code suivant:

mycorpus <- Corpus(VectorSource(x))
mycorpus <- tm_map(mycorpus, removePunctuation)

Je souhaite ensuite reconvertir le corpus en un cadre de données afin d'exporter un fichier texte contenant les données au format d'origine d'un cadre de données. J'ai essayé ce qui suit:

dataframe <- as.data.frame(mycorpus)

Mais cela renvoie une erreur:

"Erreur dans as.data.frame.default. (Mycorpus): impossible de contraindre la classe" c (vcorpus,> corpus ")" à un nom data.frame

Comment convertir un corpus en trame de données? 

15
lmcshane

Votre corpus n'est en réalité qu'un vecteur de caractères doté d'attributs supplémentaires. Il est donc préférable de le convertir en caractère. Vous pouvez ensuite l'enregistrer dans un fichier data.frame de la manière suivante:

library(tm)
x <- c("Hello. Sir!","Tacos? On Tuesday?!?")
mycorpus <- Corpus(VectorSource(x))
mycorpus <- tm_map(mycorpus, removePunctuation)

dataframe <- data.frame(text=unlist(sapply(mycorpus, `[`, "content")), 
    stringsAsFactors=F)

qui retourne

              text
1        Hello Sir
2 Tacos On Tuesday

UPDATE: Avec la version plus récente de tm, ils semblent avoir mis à jour la méthode as.list.SimpleCorpus qui dérange vraiment avec l'utilisation de sapplyet lapply. Maintenant, je suppose que vous devriez utiliser

dataframe <- data.frame(text=sapply(mycorpus, identity), 
    stringsAsFactors=F)
22
MrFlick

Le corpus considéré comme objecté a un attribut content accessible via get:

library("tm")

x <- c("Hello. Sir!","Tacos? On Tuesday?!?")
mycorpus <- Corpus(VectorSource(x))
mycorpus <- tm_map(mycorpus, removePunctuation)

attributes(mycorpus)
# $names
# [1] "content" "meta"    "dmeta"  
# 
# $class
# [1] "SimpleCorpus" "Corpus"      
# 

df <- data.frame(text = get("content", mycorpus))

head(df)
#               text
# 1        Hello Sir
# 2 Tacos On Tuesday
4
mlegge

Vous pouvez convertir en data.frame, trier les mots les plus fréquents et tracer dans un nuage de mots!

library(tm)
library("wordcloud")
library("RColorBrewer")

x <- c("Hello. Sir!","Tacos? On Tuesday?!?", "Hello")
mycorpus <- Corpus(VectorSource(x))
mycorpus <- tm_map(mycorpus, removePunctuation)

dtm <- TermDocumentMatrix(mycorpus)
m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(Word = names(v),freq=v)
head(d, 10)

#           Word freq
#hello     hello    2
#sir         sir    1
#tacos     tacos    1
#tuesday tuesday    1

#plot in a wordcloud
set.seed(1234)
wordcloud(words = d$Word, freq = d$freq, min.freq = 1,
          max.words=200, random.order=FALSE, rot.per=0.35, 
          colors=brewer.pal(8, "Dark2"))

 enter image description here

3
Jalles10

L'ancienne réponse postée par MrFlick ne fonctionnant que dans la version précédente sur tm, j'ai pu résoudre ce problème en supprimant le contenu de la formule.

dataframe<-data.frame(text=unlist(sapply(mycorpus, `[`)), stringsAsFactors=F)
2
user4258767

C'est une approche alternative que j'ai utilisée dans mon propre travail avec l'analyse de texte. Vous faites essentiellement référence à votre matrice de termes de document sous forme de matrice lors de sa conversion en trame de données. Vous pouvez ensuite exécuter une ligne supplémentaire qui rend vos noms de variable conviviaux.

base de données <- as.data.frame (as.matrix (mycorpus))

colnames (base de données) <- make.names (colnames (base de données))

Je ne sais pas comment (ou si) cette approche diffère des autres réponses en termes de sortie mais je trouve cette syntaxe beaucoup plus simple et plus simple à mettre en œuvre. J'espère que cela t'aides!

0
Shawne