Autant que je sache, il vous suffit de fournir un certain nombre de sujets et le corpus. Il n'est pas nécessaire de spécifier un ensemble de sujets candidats, bien qu'il soit possible de l'utiliser, comme vous pouvez le voir dans l'exemple commençant au bas de la page 15 de Grun et Hornik (2011) .
Mis à jour le 28 janvier 14. Je fais maintenant les choses un peu différemment de la méthode ci-dessous. Voir ici pour mon approche actuelle: /programming//a/21394092/1036500
Un moyen relativement simple de trouver le nombre optimal de sujets sans données de formation consiste à parcourir les modèles avec différents nombres de sujets pour trouver le nombre de sujets avec la probabilité de journalisation maximale, compte tenu des données. Considérez cet exemple avecR
# 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")
Avant de passer directement à la génération du modèle de sujet et à l'analyse de la sortie, nous devons décider du nombre de sujets que le modèle doit utiliser. Voici une fonction pour parcourir différents numéros de sujet, obtenir la ressemblance de log du modèle pour chaque numéro de sujet et le tracer afin que nous puissions choisir le meilleur. Le meilleur nombre de sujets est celui avec la valeur de probabilité de journal la plus élevée pour obtenir les données d'exemple intégrées dans le package. Ici, j'ai choisi d'évaluer chaque modèle en commençant par 2 sujets mais jusqu'à 100 sujets (cela prendra un certain temps!).
best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})
Maintenant, nous pouvons extraire les valeurs de vraisemblance du log pour chaque modèle qui a été généré et nous préparer à le tracer:
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)))
Et maintenant, faites un graphique pour voir à quel nombre de sujets la probabilité de journal la plus élevée apparaît:
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))
On dirait que c'est entre 10 et 20 sujets. Nous pouvons inspecter les données pour trouver le nombre exact de sujets avec la probabilité de journalisation la plus élevée, comme ceci:
best.model.logLik.df[which.max(best.model.logLik.df$LL),]
# which returns
topics LL
12 13 -8525.234
Le résultat est donc que 13 sujets donnent le meilleur ajustement pour ces données. Maintenant, nous pouvons aller de l'avant avec la création du modèle LDA avec 13 sujets et étudier le modèle:
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
Et ainsi de suite pour déterminer les attributs du modèle.
Cette approche est basée sur:
Griffiths, TL et M. Steyvers 2004. Trouver des sujets scientifiques. Actes de l'Académie nationale des sciences des États-Unis d'Amérique 101 (Suppl 1): 5228 –5235.
devtools::source_url("https://gist.githubusercontent.com/trinker/9aba07ddb07ad5a0c411/raw/c44f31042fc0bae2551452ce1f191d70796a75f9/optimal_k")
+1 belle réponse.best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})
. Pourquoi ne sélectionnez-vous que les données brutes 21:30 des données?