python - modelling - Documento de distribución tópica en Gensim LDA.
lda topic modelling (2)
He derivado un modelo de tema LDA utilizando un corpus de juguete de la siguiente manera:
documents = [''Human machine interface for lab abc computer applications'',
''A survey of user opinion of computer system response time'',
''The EPS user interface management system'',
''System and human system engineering testing of EPS'',
''Relation of user perceived response time to error measurement'',
''The generation of random binary unordered trees'',
''The intersection graph of paths in trees'',
''Graph minors IV Widths of trees and well quasi ordering'',
''Graph minors A survey'']
texts = [[word for word in document.lower().split()] for document in documents]
dictionary = corpora.Dictionary(texts)
id2word = {}
for word in dictionary.token2id:
id2word[dictionary.token2id[word]] = word
Descubrí que cuando utilizo una pequeña cantidad de temas para derivar el modelo, Gensim entrega un informe completo de la distribución por temas sobre todos los temas potenciales para un documento de prueba. P.ej:
test_lda = LdaModel(corpus,num_topics=5, id2word=id2word)
test_lda[dictionary.doc2bow(''human system'')]
Out[314]: [(0, 0.59751626959781134),
(1, 0.10001902477790173),
(2, 0.10001375856907335),
(3, 0.10005453508763221),
(4, 0.10239641196758137)]
Sin embargo, cuando uso una gran cantidad de temas, el informe ya no está completo:
test_lda = LdaModel(corpus,num_topics=100, id2word=id2word)
test_lda[dictionary.doc2bow(''human system'')]
Out[315]: [(73, 0.50499999999997613)]
Me parece que los temas con una probabilidad menor que algún umbral (observé que 0.01 es más específico) se omiten de la salida.
Me pregunto si este comportamiento se debe a algunas consideraciones estéticas? ¿Y cómo puedo obtener la distribución de la probabilidad de masa residual sobre todos los demás temas?
¡Gracias por su amable respuesta!
Lea la source y resulta que los temas con probabilidades más pequeñas que un umbral se ignoran. Este umbral es con un valor predeterminado de 0.01.
Me doy cuenta de que esta es una pregunta antigua, pero en caso de que alguien se la encuentre, aquí hay una solución (el problema se resolvió en la rama de desarrollo actual con un parámetro LdaModel
para LdaModel
pero quizás esté ejecutando una versión anterior de gensim).
Definir una nueva función (esto solo se copia de la fuente)
def get_doc_topics(lda, bow):
gamma, _ = lda.inference([bow])
topic_dist = gamma[0] / sum(gamma[0]) # normalize distribution
return [(topicid, topicvalue) for topicid, topicvalue in enumerate(topic_dist)]
La función anterior no filtra los temas de salida en función de la probabilidad, sino que los emitirá todos. Si no necesita las (topic_id, value)
sino solo valores, simplemente devuelva topic_dist
lugar de la lista de comprensión (también será mucho más rápido).