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?
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 sapply
et lapply
. Maintenant, je suppose que vous devriez utiliser
dataframe <- data.frame(text=sapply(mycorpus, identity),
stringsAsFactors=F)
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
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"))
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)
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!