Os parâmetros de entrada para usar a alocação latente de Dirichlet


17

Ao usar a modelagem de tópicos (Alocação de Dirichlet Latente), o número de tópicos é um parâmetro de entrada que o usuário precisa especificar.

Parece-me que também devemos fornecer uma coleção de tópicos de candidatos que o processo Dirichlet tem de provar? Meu entendimento está correto? Na prática, como configurar esse tipo de conjunto de tópicos candidatos?

Respostas:


21

Tanto quanto sei, você só precisa fornecer vários tópicos e o corpus. Não é necessário especificar um conjunto de tópicos candidatos, embora um possa ser usado, como você pode ver no exemplo, começando na parte inferior da página 15 de Grun e Hornik (2011) .

Atualizado em 28 de janeiro de 14. Agora, faço as coisas de maneira um pouco diferente do método abaixo. Veja aqui a minha abordagem atual: /programming//a/21394092/1036500

Uma maneira relativamente simples de encontrar o número ideal de tópicos sem dados de treinamento é percorrendo modelos com diferentes números de tópicos para encontrar o número de tópicos com a máxima probabilidade de log, considerando os dados. Considere este exemplo comR

# download and install one of the two R packages for LDA, see a discussion
# of them here: http://stats.stackexchange.com/questions/24441
#
install.packages("topicmodels")
library(topicmodels)
#
# get some of the example data that's bundled with the package
#
data("AssociatedPress", package = "topicmodels")

Antes de começar a gerar o modelo de tópico e analisar a saída, precisamos decidir sobre o número de tópicos que o modelo deve usar. A seguir, é apresentada uma função para repetir diferentes números de tópicos, obter a probabilidade de log do modelo para cada número de tópico e plotá-lo para que possamos escolher o melhor. O melhor número de tópicos é aquele com o maior valor de probabilidade de log para obter os dados de exemplo incorporados ao pacote. Aqui, escolhi avaliar todos os modelos, começando com 2 tópicos e 100 tópicos (isso levará algum tempo!).

best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})

Agora podemos extrair os valores de probabilidade de log para cada modelo que foi gerado e nos preparar para plotá-lo:

best.model.logLik <- as.data.frame(as.matrix(lapply(best.model, logLik)))

best.model.logLik.df <- data.frame(topics=c(2:100), LL=as.numeric(as.matrix(best.model.logLik)))

E agora faça um gráfico para ver em qual número de tópicos a maior probabilidade de log aparece:

library(ggplot2)
ggplot(best.model.logLik.df, aes(x=topics, y=LL)) + 
  xlab("Number of topics") + ylab("Log likelihood of the model") + 
  geom_line() + 
  theme_bw()  + 
  opts(axis.title.x = theme_text(vjust = -0.25, size = 14)) + 
  opts(axis.title.y = theme_text(size = 14, angle=90))

insira a descrição da imagem aqui

Parece que está entre 10 e 20 tópicos. Podemos inspecionar os dados para encontrar o número exato de tópicos com a maior probabilidade de log da seguinte forma:

best.model.logLik.df[which.max(best.model.logLik.df$LL),]
# which returns
       topics        LL
12     13           -8525.234

Portanto, o resultado é que 13 tópicos fornecem o melhor ajuste para esses dados. Agora podemos continuar criando o modelo LDA com 13 tópicos e investigando o modelo:

lda_AP <- LDA(AssociatedPress[21:30,], 13)   # generate the model with 13 topics 
get_terms(lda_AP, 5)                         # gets 5 keywords for each topic, just for a quick look
get_topics(lda_AP, 5)                        # gets 5 topic numbers per document

E assim por diante para determinar os atributos do modelo.

Essa abordagem é baseada em:

Griffiths, TL e M. Steyvers 2004. Encontrando tópicos científicos. Anais da Academia Nacional de Ciências dos Estados Unidos da América 101 (Suppl 1): 5228 –5235.


Atualizei o código para isso e salvei como uma essência. possui método de plotagem que imprime por padrão. devtools::source_url("https://gist.githubusercontent.com/trinker/9aba07ddb07ad5a0c411/raw/c44f31042fc0bae2551452ce1f191d70796a75f9/optimal_k") +1 boa resposta.
precisa

Ao aumentar k no LDA, você está expandindo o espaço de parâmetros e os modelos com k menor são essencialmente aninhados dentro dos modelos com k mais alto. Portanto, LL deve estar sempre aumentando com k. O que acontece com um pequeno aumento em torno de k = 13 é provavelmente devido ao algoritmo VEM não convergindo para o máximo global para modelos complexos. Você terá mais sorte com AIC ou BIC.
precisa saber é o seguinte

Oi @ Ben, resposta realmente útil. Eu tenho uma pergunta sobre isso, quando você está avaliando o modelo com 2-100 tópicos: best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)}). Por que você seleciona apenas 21:30 dos dados brutos?
Economist_Ayahuasca

Como foi há alguns anos que postei essa resposta, não me lembro exatamente. Mas provavelmente apenas para manter o tempo de computação curto!
Ben Ben

1
Agora há este agradável pkg para calcular o número ideal de tópicos: cran.r-project.org/web/packages/ldatuning
Ben
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.