Agrupación de documentos utilizando los temas derivados de la asignación de Dirichlet latente

9

Quiero usar la asignación de Dirichlet latente para un proyecto y estoy usando Python con la biblioteca gensim. Después de encontrar los temas, me gustaría agrupar los documentos usando un algoritmo como k-means (Idealmente, me gustaría usar uno bueno para la superposición de grupos, por lo que cualquier recomendación es bienvenida). Logré obtener los temas pero están en forma de:

0.041 * Ministro + 0.041 * Clave + 0.041 * momentos + 0.041 * controvertido + 0.041 * Prime

Para aplicar un algoritmo de agrupamiento y corregirme si me equivoco, creo que debería encontrar una manera de representar cada palabra como un número usando tfidf o word2vec.

¿Tiene alguna idea de cómo podría "quitar" la información textual de, por ejemplo, una lista, para hacerlo y luego volver a colocarla para hacer la multiplicación adecuada?

Por ejemplo, tal como lo veo si la palabra Ministro tiene un peso tfidf de 0.042 y así sucesivamente para cualquier otra palabra dentro del mismo tema, debería calcular algo como:

0.041 * 0.42 + ... + 0.041 * tfidf (Prime) y obtenga un resultado que luego se utilizará para agrupar los resultados.

Gracias por tu tiempo.

Cisne87
fuente
1
Como se explica en el tutorial , puede expresar documentos como vectores. Agrupe esos vectores.
Emre
Sé compañero pero tengo que agruparlos de acuerdo con los temas creados después de aplicar LDA en mi colección. Cada tema debe representarse como un vector para comparar cada documento con cada tema y encontrar el tema o temas correspondientes para cada documento.
Swan87
No tiene que representar cada palabra como un vector. Obtiene la nueva representación para todo el documento aplicando la transformación LDA que aprendió al corpus . Para ver un ejemplo con LSI, consulte este enlace: radimrehurek.com/gensim/tut2.html La parte clave es donde aplican la transformación LSI aprendida a todo el corpus con lsi [doc_bow]
Will Stanton

Respuestas:

4

Suponiendo que LDA produjo una lista de temas y puso una puntuación en cada tema para cada documento, podría representar el documento y sus puntuaciones como un vector:

Document | Prime | Minister | Controversial | TopicN | ...
   1       0.041    0.042      0.041          ...
   2       0.052    0.011      0.042          ...

Para obtener los puntajes de cada documento, puede ejecutar el documento. como una bolsa de palabras, a través de un modelo LDA entrenado. De la documentación de gensim:

>>> lda = LdaModel(corpus, num_topics=100)  # train model
>>> print(lda[doc_bow]) # get topic probability distribution for a document

Luego, podría ejecutar k-means en esta matriz y debería agrupar documentos que son similares. K-means por defecto es un algoritmo de agrupamiento duro que implica que clasifica cada documento en un clúster. Podría usar mecanismos de agrupación suaves que le darán una puntuación de probabilidad de que un documento se ajuste dentro de un grupo; esto se llama fuzzy k-means . https://gist.github.com/mblondel/1451300 es una esencia de Python que muestra cómo puedes hacerlo con scikit learn.

ps: no puedo publicar más de 2 enlaces

Ceniza
fuente
Traté de hacer eso para "n" ninguno de los documentos dice dónde están los temas t. Sin embargo, para decir x no de los documentos, todos los temas t prob no aparecen solo algunos (t- no) temas prob, donde 1 <= no <t. No sucede cuando ejecuto el experimento en tamaño de documento pequeño. ¿Es porque no se imprime si el problema es 0?
Manish Ranjan
0

Como complemento a la respuesta anterior, es mejor que no solo ejecute kmeans directamente en los datos de composición derivados de la distribución lda topic-doc, sino que utilice alguna transformación de datos de composición para proyectarlos en el espacio euclidiano como ilr o clr.

( Ejemplo )

Anestis Fachantidis
fuente