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

Это создает облако слов, но оно состоит из каждого составного слова, а не из фраз. Итак, я вижу относительную частоту «А». «H», «John» и т. д. вместо относительной частоты «Joseph A», «Mary A» и т. д., чего я и хочу.

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


person verybadatthis    schedule 14.11.2014    source источник


Ответы (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"))

введите здесь описание изображения

person keegan    schedule 14.11.2014
comment
Спасибо, это полностью решило мою проблему и было очень ясно! - person verybadatthis; 14.11.2014
comment
хорошо - следите за аргументом min.freq wordcloud, который может привести к ожидаемому результату. - person keegan; 14.11.2014

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

person knb    schedule 14.11.2014
comment
Извините, не могли бы вы немного подробнее объяснить, как работает токенизатор? Я не понимаю, что делают эти параметры или что они делают после запуска. - person verybadatthis; 14.11.2014