2014-11-14 143 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