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.

8
demandé sur verybadatthis 2014-11-14 23:03:31

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"))

enter image description here

9
répondu keegan 2014-11-14 20:53:34

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.

4
répondu knb 2014-11-14 21:07:40