Анализ текста с использованием LDA и tm в R

Привет, ребята, у меня небольшие проблемы с проведением LDA, потому что по какой-то причине, когда я готов провести анализ, я получаю ошибки. Я сделаю все возможное, чтобы выполнить то, что я делаю, к сожалению, я не смогу предоставить данные, потому что данные, которые я использую, являются конфиденциальными данными.

dataset <- read.csv("proprietarydata.csv")

Сначала я делаю небольшую очистку data$text и post — это классовый символ.

dataset$text <- as.character(dataset$text) 
post <- gsub("[^[:print:]]"," ",data$Post.Content)
post <- gsub("[^[:alnum:]]", " ",post)

сообщение в итоге выглядит так: `

`[1] "here is a string"
 [2] "here is another string"
 etc....`

затем я создал следующую функцию, которая делает больше очистки:

createdtm <- function(x){
myCorpus <- Corpus(VectorSource(x))
myCorpus <- tm_map(myCorpus,PlainTextDocument)
docs <- tm_map(myCorpus,tolower)
docs <- tm_map(docs, removeWords, stopwords(kind="SMART"))
docs <- tm_map(docs, removeWords, c("the"," the","will","can","regards","need","thanks","please","http"))
docs <- tm_map(docs, stripWhitespace)
docs <- tm_map(docs, PlainTextDocument)
return(docs)}

predtm <- createdtm(post)

Это в конечном итоге возвращает корпус, который дает мне что-то вроде этого для каждого документа:

[[1]]
<<PlainTextDocument (metadata: 7)>>
Here text string


[[2]]
<<PlainTextDocument (metadata: 7)>>
Here another string

Затем я подготовился к LDA, создав DocumentTermMatrix.

dtm <- DocumentTermMatrix(predtm)
inspect(dtm)


<<DocumentTermMatrix (documents: 14640, terms: 39972)>>
Non-/sparse entries: 381476/584808604
Sparsity           : 100%
Maximal term length: 86
Weighting          : term frequency (tf)

Docs           truclientrre truddy trudi trudy true truebegin truecontrol
              Terms
Docs           truecrypt truecryptas trueimage truely truethis trulibraryref
              Terms
Docs           trumored truncate truncated truncatememory truncates
              Terms
Docs           truncatetableinautonomoustrx truncating trunk trunkhyper
              Terms
Docs           trunking trunkread trunks trunkswitch truss trust trustashtml
              Terms
Docs           trusted trustedbat trustedclient trustedclients
              Terms
Docs           trustedclientsjks trustedclientspwd trustedpublisher
              Terms
Docs           trustedreviews trustedsignon trusting trustiv trustlearn
              Terms
Docs           trustmanager trustpoint trusts truststorefile truststorepass
              Terms
Docs           trusty truth truthfully truths tryd tryed tryig tryin tryng

Мне это кажется очень странным, но я всегда так делал. Итак, я в конечном итоге продвигаюсь вперед и делаю следующее

run.lda <- LDA(dtm,4)

Это возвращает мою первую ошибку

  Error in LDA(dtm, 4) : 
  Each row of the input matrix needs to contain at least one non-zero entry

После исследования этой ошибки я просматриваю этот пост Удалить пустые документы из DocumentTermMatrix в R тематические модели? Я предполагаю, что у меня все под контролем, и я взволнован, поэтому я следую шагам по ссылке, но затем

Это работает

rowTotals <- apply(dtm , 1, sum)

Это не

dtm.new   <- dtm[rowTotals> 0]

он возвращает:

  Error in `[.simple_triplet_matrix`(dtm, rowTotals > 0) : 
  Logical vector subscripting disabled for this object.

Я знаю, что могу получить жар, потому что некоторые из вас могут сказать, что это невоспроизводимый пример. Пожалуйста, не стесняйтесь спрашивать что-либо об этой проблеме. Это лучшее, что я могу сделать.


r lda tm
person theamateurdataanalyst    schedule 27.06.2014    source источник
comment
возможный дубликат Удалить пустые документы из DocumentTermMatrix в тематических моделях R?   -  person MrFlick    schedule 28.06.2014


Ответы (1)


На самом деле не должно быть так сложно создать минимальный воспроизводимый пример. Например

library(tm)
library(topicmodels)
raw <- c("hello","","goodbye")
tm <- Corpus(VectorSource(raw))

dtm <- DocumentTermMatrix(tm)

LDA(dtm,4)

# Error in LDA(dtm, 4) : 
#   Each row of the input matrix needs to contain at least one non-zero entry

Также не должно быть сложно запомнить, как правильно подмножить матрицу (указав [row,col], а не только [index].

rowTotals <- apply(dtm , 1, sum)
dtm <- dtm[rowTotals>0,]
LDA(dtm, 4)

#A LDA_VEM topic model with 4 topics.

Пожалуйста, найдите время, чтобы создать воспроизводимые примеры. Часто при этом вы обнаруживаете собственную ошибку и можете легко ее исправить. По крайней мере, это поможет другим яснее увидеть проблему и избавиться от ненужной информации.

person MrFlick    schedule 27.06.2014
comment
Все знают, что я фанат @MrFlick, и я поставлю +1 этому ответу, но я должен немного защитить OP, сказав, что иногда трудно сделать воспроизводимую ошибку только потому, что вы не уверены, что вызывает ошибку . У меня есть последнее сообщение об ошибке, которое показал OP, и я не знаю, как его воспроизвести. Для меня это исходит от другой команды, а именно от summary (tdm). Но в любом случае да, воспроизводимые примеры жизненно важны для нас, чтобы иметь возможность находить решения, поэтому я не согласен с мистером Фликом. - person Hack-R; 18.08.2014