2014-11-14 4 views
7

Ich versuche, eine Wortwolke aus einer Liste von Phrasen, von denen viele wiederholt werden, statt aus einzelnen Wörtern. Meine Daten sehen ungefähr so ​​aus, wobei eine Spalte meines Datenrahmens eine Liste von Phrasen ist.Erstellen "Wort" Wolke von Phrasen, nicht einzelne Wörter in R

df$names <- c("John", "John", "Joseph A", "Mary A", "Mary A", "Paul H C", "Paul H C") 

Ich möchte eine Wortwolke machen, wo alle diese Namen als einzelne Formulierungen behandelt werden, deren Frequenz angezeigt wird, nicht die Worte, die sie bilden. Der Code Ich habe mit sieht aus wie:

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

Dies schafft eine Wortwolke, aber es ist jede Komponente Wort, nicht die Phrasen. Also, ich sehe die relative Häufigkeit von "A". "H", "John" usw. anstelle der relativen Häufigkeit von "Joseph A", "Mary A" usw., was ich will.

Ich bin sicher, das ist nicht so kompliziert zu beheben, aber ich kann es nicht herausfinden! Ich würde jede Hilfe schätzen.

Antwort

8

Ihre Schwierigkeit besteht darin, dass jedes Element von df$names als "Dokument" von den Funktionen tm behandelt wird. Zum Beispiel enthält das Dokument John A die Wörter John und A. Es hört sich so an, als ob Sie die Namen so behalten möchten, wie sie sind, und nur ihr Vorkommen hochzählen - Sie können dafür einfach table verwenden.

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

+0

Danke, das hat mein Problem total gelöst und war sehr klar! – verybadatthis

+1

gut - achten Sie auf das 'min.freq'-Argument von' wordcloud', was zu einer erwarteten Ausgabe führen könnte. – keegan

3

Installieren RWeka und ihre Abhängigkeiten, dann ist dies versuchen:

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 

Die tokenizer-line über Ihren Text in Phrasen der Länge zerhackt 2.
Genauer gesagt, schafft es Sätze von minlength 2 und maxlength 2.
Mit Wekas ​​allgemeinem NGramTokenizer-Algorithmus können Sie verschiedene Tokenizer erstellen (zB minlength 1, maxlength 2), und Sie werden wahrscheinlich mit verschiedenen Längen experimentieren wollen. Sie können sie auch tok1, tok2 anstelle des ausführlichen "BigramTokenizer" nennen, den ich oben verwendet habe.

+0

Sorry, könnten Sie erklären, wie der tokenizer funktioniert ein bisschen mehr sein? Ich verstehe nicht, was diese Parameter tun oder was sie tun, nachdem sie ausgeführt wurden. – verybadatthis

+1

Ich habe meine Antwort aktualisiert. – knb