Agrupamento de documentos usando os tópicos derivados da Alocação Latente de Dirichlet

9

Quero usar a Alocação de Dirichlet Latente para um projeto e estou usando o Python com a biblioteca gensim. Depois de encontrar os tópicos, gostaria de agrupar os documentos usando um algoritmo como o k-means (idealmente, gostaria de usar um bom para sobrepor clusters para que qualquer recomendação seja bem-vinda). Consegui obter os tópicos, mas eles estão na forma de:

0,041 * Ministro + 0,041 * Chave + 0,041 * momentos + 0,041 * controverso + 0,041 * Prime

Para aplicar um algoritmo de clustering e me corrigir se estiver errado, acredito que devo encontrar uma maneira de representar cada palavra como um número usando tfidf ou word2vec.

Você tem alguma idéia de como eu poderia "retirar" as informações textuais de, por exemplo, uma lista, para fazer isso e depois colocá-las de volta para fazer a multiplicação apropriada?

Por exemplo, da forma como vejo se a palavra Ministro tem um peso tfidf de 0,042 e assim por diante, para qualquer outra palavra dentro do mesmo tópico, devo calcular algo como:

0,041 * 0,42 + ... + 0,041 * tfidf (Prime) e obtenha um resultado que será usado mais tarde para agrupar os resultados.

Obrigado pelo seu tempo.

Swan87
fonte
11
Conforme explicado no tutorial , você pode expressar documentos como vetores. Agrupe esses vetores.
Emre
Conheço o companheiro, mas tenho que agrupá-los de acordo com os tópicos criados depois de aplicar o LDA na minha coleção. Cada tópico deve ser representado como um vetor para comparar cada documento com cada tópico e encontrar o tópico ou tópicos correspondentes para cada documento.
Swan87
Você não precisa representar cada palavra como um vetor. Você obtém a nova representação de todo o documento aplicando a transformação LDA que aprendeu ao corpus . Para um exemplo com LSI, veja este link: radimrehurek.com/gensim/tut2.html A parte fundamental é o lugar onde eles se aplicam a transformação LSI aprendeu a todo o corpus com lsi [doc_bow]
Will Stanton

Respostas:

4

Supondo que a LDA tenha produzido uma lista de tópicos e colocado uma pontuação em cada tópico de cada documento, você poderia representar o documento e suas pontuações como um vetor:

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

Para obter as pontuações para cada documento, você pode executá-lo. como um saco de palavras, através de um modelo LDA treinado. Na documentação do gensim:

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

Em seguida, você pode executar o k-means nessa matriz e deve agrupar documentos semelhantes. O K-means, por padrão, é um algoritmo de agrupamento rígido que implica que ele classifica cada documento em um cluster. Você pode usar mecanismos de cluster suave que fornecerão uma pontuação de probabilidade de que um documento se encaixe dentro de um cluster - isso é chamado de k-means difuso . https://gist.github.com/mblondel/1451300 é uma essência do Python mostrando como você pode fazer isso com o scikit learn.

ps: Eu não posso postar mais de 2 links

Cinza
fonte
Eu tentei fazer isso por "n" nenhum dos documentos dizer onde os tópicos estão. No entanto, para dizer x não de documentos, todos os problemas de t tópicos não aparecem apenas alguns problemas de t (não), onde 1 <= não <t. Isso não acontece quando eu executo o experimento em um tamanho pequeno de documento. É porque não imprime se o prob é 0?
Manish Ranjan
0

Complementando a resposta anterior, é melhor não apenas executar kmeans diretamente nos dados de composição derivados da distribuição lda topic-doc, em vez disso, use alguma transformação de dados de composição para projetá-los no espaço euclidiano como ilr ou clr.

( Exemplo )

Anestis Fachantidis
fonte