Преобразование DocumentTermMatrix в dgTMatrix

Я пытаюсь запустить набор данных AssociatedPress из пакета tm через реализацию LDA text2vec.

Проблема, с которой я столкнулся, заключается в несовместимости типов данных: AssociatedPress — это tm::DocumentTermMatrix, который, в свою очередь, является подклассом slam::simple_triplet_matrix. text2vec однако ожидает, что ввод от x до text2vec::lda$fit_transform(x = ...) будет Matrix::dgTMatrix.

Таким образом, мой вопрос таков: есть ли способ принудить DocumentTermMatrix к чему-то, принятому text2vec?

Минимальный (неудачный) пример:

library('tm')
library('text2vec')

data("AssociatedPress", package="topicmodels")

dtm <- AssociatedPress[1:10, ]

lda_model = LDA$new(
  n_topics = 10,
  doc_topic_prior = 0.1,
  topic_word_prior = 0.01
)

doc_topic_distr =
  lda_model$fit_transform(
    x = dtm,
    n_iter = 1000,
    convergence_tol = 0.001,
    n_check_convergence = 25,
    progressbar = FALSE
  )

...который дает:

base::rowSums(x, na.rm = na.rm, dims = dims, ...) : 'x' должен быть массивом не менее двух измерений


person Oliver Baumann    schedule 14.04.2018    source источник
comment
дублировать stackoverflow.com/questions/20004493/   -  person Dmitriy Selivanov    schedule 15.04.2018
comment
Действительно дубликат, который я нашел, но не смог определить как полезный для моего случая. Спасибо, что указали на это!   -  person Oliver Baumann    schedule 15.04.2018


Ответы (1)


Ответ находится в дубликате, предоставленном @Dmitriy Селиванов. Но не упоминается, что он исходит из базового пакета Matrix.

Поскольку у меня не установлен topicmodels, я буду использовать набор данных crude, который включен в пакет tm. Принцип тот же.

library(tm)
data("crude")

dtm <- DocumentTermMatrix(crude,
                          control = list(weighting =
                                           function(x)
                                             weightTfIdf(x, normalize =
                                                           FALSE),
                                         stopwords = TRUE))

# transform into a sparseMatrix dgcMatrix
m <-  Matrix::sparseMatrix(i=dtm$i, 
                           j=dtm$j, 
                           x=dtm$v, 
                           dims=c(dtm$nrow, dtm$ncol),
                           dimnames = dtm$dimnames)
str(m)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:1890] 6 1 18 6 6 5 9 12 9 5 ...
  ..@ p       : int [1:1201] 0 1 2 3 4 5 6 8 9 11 ...
  ..@ Dim     : int [1:2] 20 1200
  ..@ Dimnames:List of 2
  .. ..$ Docs : chr [1:20] "127" "144" "191" "194" ...
  .. ..$ Terms: chr [1:1200] "\"(it)" "\"demand" "\"expansion" "\"for" ...
  ..@ x       : num [1:1890] 4.32 4.32 4.32 4.32 4.32 ...
  ..@ factors : list()

остальная часть вашего кода:

library(text2vec)

lda_model <- LDA$new(
  n_topics = 10,
  doc_topic_prior = 0.1,
  topic_word_prior = 0.01
)

doc_topic_distr <-
  lda_model$fit_transform(
    x = m,
    n_iter = 1000,
    convergence_tol = 0.001,
    n_check_convergence = 25,
    progressbar = FALSE
  )

INFO [2018-04-15 10:40:00] iter 25 loglikelihood = -32949.882
INFO [2018-04-15 10:40:00] iter 50 loglikelihood = -32901.801
INFO [2018-04-15 10:40:00] iter 75 loglikelihood = -32922.208
INFO [2018-04-15 10:40:00] early stopping at 75 iteration
person phiver    schedule 15.04.2018
comment
Спасибо за Ваш ответ! Моя проблема, похоже, заключалась в том, что я не использовал имена параметров: Matrix::sparseMatrix(dtm$i, dtm$j, dtm$v, ...), который выдает ошибку, поскольку предполагает, что p является третьим параметром. Использование именованных параметров исправило это! Ура снова - person Oliver Baumann; 15.04.2018