Создание" словесного " облака фраз, а не отдельных слов в 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()

это создает слово облако, но оно состоит из каждого составного слова, а не из фраз. Итак, я вижу относительную частоту "а". "Н", "Иоанн" и т. д. Вместо относительной частоты "Иосиф а", "Мария А" и т. д., Чего я и хочу.

Я уверен, что это не так сложно исправить, но я не могу понять это! Я был бы признателен за любую помощь.

2 ответов


ваша трудность в том, что каждый элемент df$names рассматривается как "документ", функции tm. Например, документ John A содержит слова John и A. Похоже, вы хотите сохранить имена как есть и просто подсчитать их появление - вы можете просто использовать 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


установите 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.
Более конкретно, он создает фразы minlength 2 и maxlength 2.
Используя общий алгоритм NGramTokenizer Weka, вы можете создавать различные токенизаторы (e.G minlength 1, maxlength 2), и вы, вероятно, захотите поэкспериментировать с разной длиной. Вы также можете назвать их tok1, tok2 вместо подробного " BigramTokenizer" Я использовал выше.