Création de" mots " nuage de phrases, Pas de mots individuels dans R
j'essaie de faire un nuage de mots à partir d'une liste de phrases, dont beaucoup sont répétées, au lieu de mots individuels. Mes données ressemblent à ça, avec une colonne de ma base de données qui est une liste de phrases.
df$names <- c("John", "John", "Joseph A", "Mary A", "Mary A", "Paul H C", "Paul H C")
je voudrais faire un nuage de mots où tous ces noms sont traités comme des phrases individuelles dont la fréquence est affichée, pas les mots qui les composent. Le code que j'ai utilisé ressemble à:
df.corpus <- Corpus(DataframeSource(data.frame(df$names)))
df.corpus <- tm_map(client.corpus, function(x) removeWords(x, stopwords("english")))
#turning that corpus into a tDM
tdm <- TermDocumentMatrix(df.corpus)
m <- as.matrix(tdm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
pal <- brewer.pal(9, "BuGn")
pal <- pal[-(1:2)]
#making a worcloud
png("wordcloud.png", width=1280,height=800)
wordcloud(d$word,d$freq, scale=c(8,.3),min.freq=2,max.words=100, random.order=T, rot.per=.15, colors="black", vfont=c("sans serif","plain"))
dev.off()
Cela crée un nuage de mots, mais il est de chaque mot Composant, pas des phrases. Donc, je vois la fréquence relative de"A". "H", "Jean", etc au lieu de la fréquence relative de "Joseph", "Marie", etc, qui est ce que je veux.
je suis sûr que ce n'est pas si compliqué à réparer, mais je ne peux pas le comprendre! Je vous serais reconnaissant de toute aide.
2 réponses
la difficulté est que chaque élément de df$names
est traité comme "document" par les fonctions de tm
. Par exemple, le document John A
contient les mots John
et A
. Il semble que vous voulez garder les noms tels quels, et simplement compter leur occurrence - vous pouvez simplement utiliser table
pour que.
library(wordcloud)
df<-data.frame(theNames=c("John", "John", "Joseph A", "Mary A", "Mary A", "Paul H C", "Paul H C"))
tb<-table(df$theNames)
wordcloud(names(tb),as.numeric(tb), scale=c(8,.3),min.freq=1,max.words=100, random.order=T, rot.per=.15, colors="black", vfont=c("sans serif","plain"))
installez RWeka et ses dépendances, puis essayez ceci:
library(RWeka)
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))
# ... other tokenizers
tok <- BigramTokenizer
tdmgram <- TermDocumentMatrix(df.corpus, control = list(tokenize = tok))
#... create wordcloud
la ligne tokenizer au-dessus découpe votre texte en phrases de longueur 2.
Plus spécifiquement, il crée des phrases de minlength 2 et maxlength 2.
En utilisant L'algorithme général Ngramtokenizer de Weka, vous pouvez créer différents tokenizers(E. g minlength 1, maxlength 2), et vous voudrez probablement expérimenter avec différentes longueurs. Vous pouvez aussi les appeler tok1, tok2 au lieu du verbose "BigramTokenizer" j'ai utilisé ci-dessus.