Удалите короткие документы из DTM плюс фильтр tfidf в R Предварительная обработка Тематических моделей
Я пытаюсь предварительно обработать корпус для моделирования тем в R. На первом этапе я хочу удалить короткие документы, т.е. документы, содержащие менее 50 слов (после удаления стоп-слова). После этого я хочу оставить только те термины со значениями tf-idf выше медианы. Мне удается выполнять оба шага по одному, но я не могу заставить их работать одновременно, получая ошибку:
Ошибка: dims [продукт 1317] не соответствуют длине объекта [2903] Кроме того: Предупреждение: In tapply(dtm$v/row_sums(dtm)[dtm$i], dtm$j, среднее) * log2(nDocs(dtm)/col_sums(dtm >: длинная длина объекта не кратна короткой длине объекта).
Кажется, это проблема размеров, но я понятия не имею, как это исправить. Одно решение, которое я нашел, работает только без учета имен файлов, но я должен сохранить и их...
filenames <- list.files(getwd(),pattern="*.txt")
#read files into a character vector
files <- lapply(filenames,readLines)
#create corpus from vector
docs <- Corpus(VectorSource(files))
#start preprocessing
#Transform to lower case
docs <-tm_map(docs,content_transformer(tolower))
docs <- tm_map(docs, removePunctuation, preserve_intra_word_dashes=TRUE)
docs <- tm_map(docs, removeNumbers)
docs <- tm_map(docs, removeWords, stopwords("german"))
#create DTM
dtm <- DocumentTermMatrix(docs, control=list(wordLengths=c(4, Inf)))
#convert rownames to filenames
rownames(dtm) <- filenames
#remove short docs
dtm <- dtm[row_sums(dtm) > 50,]
#calculate tfidf
term_tfidf <-
tapply(dtm$v/row_sums(dtm)[dtm$i], dtm$j, mean)*log2(nDocs(dtm)/col_sums(dtm >0))
summary(term_tfidf)
#remove words with low tfidf
dtm <- dtm[, term_tfidf >= 0.005]
dtm <- dtm[row_sums(dtm) > 0,]
`