Взятие объекта латентно-семантического анализа (lsa) и оценка новых данных в R

Я выполняю скрытый семантический анализ (LSA) с использованием textmineR в R. Я надеюсь получить матрицу документ по теме с оценками тем по документу, что я могу сделать, вызвав theta из моего объекта lsa (ниже). Однако я сталкиваюсь с проблемами, когда беру созданный мной объект lsa и использую его для оценки нового набора данных (например, матрицы терминов документа, dtm), чтобы я мог применить свои ранее существовавшие структуры тем к новым данным. В приведенном ниже примере я создаю две темы, а затем, когда я пытаюсь использовать тот же самый dtm (для этого примера представляя, что это новый файл), я получаю следующую ошибку:

"Error in predict.lsa_topic_model(model, dtm_m) : newdata must be a matrix of class dgCMatrix or a numeric vector"

Мне нужно использовать объект lsa для оценки нового текста. Есть ли какое-то простое решение, которое мне не хватает? Мне не повезло с приведением матрицы к "dgCMatrix". На самом деле я не знаю, как это сделать с другими пакетами, такими как lsa. Любая помощь в этом подходе будет принята с благодарностью.

file = as.data.frame(matrix( c('case1', 'this is some SAMPLE TEXT!',
'case2',  'and this is the 2nd version of that text...', 
'case3', 'more stuff to talk about'), 
        nrow=3,              
        ncol=2,              
        byrow = TRUE))
names(file) [1] <- 'doc_id'
names(file) [2] <- 'text'

library(tm)
wordCorpus <- Corpus(DataframeSource(file))

cleaner <- function (wordCorpus) {
  wordCorpus <- tm_map(wordCorpus, removeNumbers)
  wordCorpus <- tm_map(wordCorpus, content_transformer(tolower))
  wordCorpus <- tm_map(wordCorpus, removePunctuation)
  return (wordCorpus)
}
wordCorpus <- cleaner (wordCorpus)

tokenizer <- function(x) 
  NGramTokenizer(x, Weka_control(min = 1, max = 2))
dtm  <- DocumentTermMatrix (wordCorpus, control = list (tokenize=tokenizer, weighting = weightTfIdf))
dtm_m <- as.matrix(dtm)

library(textmineR)
model <- FitLsaModel(dtm = dtm_m,  k = 2)

#this is what I want to get, but ideally also 
#be able to save the "model" object and use to create this in a new sample`

values <- as.data.frame (model$theta)
values
#pretending my original dataset is a new sample and using predict
values_other <- predict (model, dtm_m)

person Drew    schedule 08.02.2019    source источник
comment
Вы можете создать dgCMatrix с помощью пакета Matrix. Либо с Matrix::sparseMatrix(), либо с Matrix::Matrix(x, sparse= TRUE). Первая функция - рекомендуемый способ.   -  person phiver    schedule 08.02.2019
comment
Отлично, вот и ответ. Почему из любопытства предпочтительнее использовать первую функцию? Я запустил второй вариант, но первый требует выделения различных входных данных из исходной матрицы.   -  person Drew    schedule 08.02.2019
comment
Первый вариант дает вам больше контроля, но также намного эффективнее потребляет память. Для небольших матриц это не имеет значения, но для матриц побольше могут возникнуть проблемы.   -  person phiver    schedule 09.02.2019


Ответы (1)


Для таких рабочих процессов вы можете совершенно спокойно отказаться от использования tm и просто использовать функцию textmineR CreateDtm напрямую.

См. Пример LSA как часть виньетки textmineR, которая показывает точный рабочий процесс. https://cran.r-project.org/web/packages/textmineR/vignettes/c_topic_modeling.html

person Tommy Jones    schedule 28.12.2019