#r #word-cloud
#r #word-облако
Вопрос:
Я использую пакет comparison.cloud () для динамически обслуживаемых данных, который работает нормально. Затем часто случается, что какой-либо элемент корпуса (документ) пуст. Это приводит к тому, что comparison.cloud возвращает ошибку.
До сих пор я создавал цикл, который не включает пустые подмножества:
quests <- c("Q1","Q2","Q3")
wordslist <- list()
rmlist <- numeric()
count <- 1
for (quest in quests) {
wordslist[[quest]] <- subset(df$element, df$question == quest)
if (length(wordslist[[quest]]) == 0) {
rmlist <- c(rmlist, count)
wordslist[quest] <- NULL
}
count <- 1 count
}
Затем позже, после создания корпуса, я использую счетчик для удаления имен столбцов :
tra$question <- tra$question[c(1,2,3)]
if (length(rmlist) != 0) {tra$question <- tra$question[-rmlist]}
Итак, это работает, но я хотел спросить, можно ли это как-то улучшить, особенно если есть какой-либо параметр, который я могу передать в облако сравнения, чтобы помочь с этой целью. Кроме того, является ли такое поведение ошибкой в облаке сравнения?
Результаты в моем скрипте таковы, что если на вопрос нет ответов, этот вопрос не будет показан в wordcloud. Было бы гораздо предпочтительнее иметь пустой вопрос (заголовок вопроса с его пустой частью wordcloud), чем удалять его. Кстати, я последовательно пытался добавить :
"empty_Qn"
Символ, результат: он находится в центре, уродливый, большой, привлекает все внимание- Повторение
"empty_Qn"
, но повторение очищается с помощью tm(), и мы снова получаем уродливый вывод сверху - Пустая строка
""
или" "
, но здесь она снова была удалена, и у меня снова возникла эта ошибка в облаке сравнения из-за пустой части корпуса.
РЕДАКТИРОВАТЬ: весь скрипт
## Elements per question wordcloud
library(wordcloud)
library(tm)
load(file="mygroupAnswers.Rda")
df <- df[df$group == groupname,]
df <- droplevels(df)
# Stop if no data
if(length(df$elements)==0) q(save="no")
quests <- c("Q1","Q2","Q3")
wordslist <- list()
rmlist <- numeric()
count <- 1
for (quest in quests) {
wordslist[[quest]] <- subset(df$element, df$question == quest)
if (length(wordslist[[quest]]) == 0) {
rmlist <- c(rmlist, count)
wordslist[quest] <- NULL
}
count <- 1 count
}
corpus <- Corpus(VectorSource(wordslist), readerControl = list(language = lang)) # Live Web version
#corpus <- Corpus(VectorSource(wordALL), readerControl = list(language = "fr")) # RStudio version
corpus <- tm_map(corpus, content_transformer(tolower))
spStopWords <- c(stopwords(tra2), "l'", "j'", "d'", "c'", "qu'", "quand", "avoir", "être", "etre", "quelqu'un", "plus", "tant", "bien", "mal") # Live Web version
spStopWords <- c(stopwords("french"), "l'", "j'", "d'", "c'", "qu'", "quand", "avoir", "être", "etre", "quelqu'un", "plus", "tant", "bien", "mal") # RStudio version
corpus <- tm_map(corpus, removeWords, spStopWords)
corpus <- tm_map(corpus, removePunctuation)
tdm <- TermDocumentMatrix(corpus)
tdm <- as.matrix(tdm)
tra$question <- tra$question[c(1,2,3)]
if (length(rmlist) != 0) {tra$question <- tra$question[-rmlist]}
colnames(tdm) <- tra$question
comparison.cloud(tdm, max.words=800, scale=c(6,1), title.size=1.2)
Комментарии:
1. Я не вижу никакого вызова
comparison.cloud
, который работает или не работает здесь (?).2. Вы правы. Я поместил весь скрипт, чтобы вы могли видеть глобальную логику и вызов comparison.cloud. И изменил его на более простую версию, сохранив ту же логику.