2014-11-14 89 views
7

創建單詞雲我試圖從短語列表中創建一個單詞雲,其中許多單詞都是重複的,而不是單個單詞。我的數據看起來像這樣,我的數據框的一列是短語列表。創建短語詞組的單詞雲,而不是R中的單個單詞

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

我想製作一個詞雲,其中所有這些名稱都被視爲顯示頻率的單個短語,而不是構成它們的單詞。我一直在使用的代碼如下所示:

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

這將創建一個詞雲,但它是每個組成詞,而不是短語。所以,我看到了「A」的相對頻率。 「H」,「約翰」等,而不是「約瑟夫A」,「瑪麗A」等的相對頻率,這正是我想要的。

我相信這不是很複雜的解決,但我不明白!我將不勝感激任何幫助。

回答

8

您的困難在於df$names的每個元素都被tm的功能視爲「文檔」。例如,文檔John A包含文字JohnA。這聽起來像你想保留名稱,並只是計算它們的發生 - 你可以使用table

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

謝謝,這完全解決了我的問題,非常清楚! – verybadatthis 2014-11-14 20:50:10

+1

好 - 請注意'wordcloud'的'min.freq'參數可能會導致預期的輸出。 – keegan 2014-11-14 20:54:22

3

安裝RWeka和它的依賴,那麼試試這個:

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 

上面的標記生成器行扒你的文本長度爲2
的短語更具體地說,它創建2 MINLENGTH和最大長度2的詞組。
使用Weka的通用NGramTokenizer算法,您可以創建不同的標記器(例如minlength 1,maxlength 2),並且您可能需要嘗試不同的長度。您也可以將它們稱爲tok1,tok2而不是上面使用的詳細「BigramTokenizer」。

+0

對不起,你能解釋標記生成器是如何工作的一點點?我不明白這些參數在運行後會做什麼,或者它做了什麼。 – verybadatthis 2014-11-14 20:58:34

+1

我已經更新了我的答案。 – knb 2014-11-14 21:08:45