R сравнение. ошибка облачного облака слов при пустом корпусе

#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. И изменил его на более простую версию, сохранив ту же логику.