Grupowanie dokumentów przy użyciu tematów pochodzących z Latent Dirichlet Allocation

9

Chcę użyć Latent Dirichlet Allocation dla projektu i używam Pythona z biblioteką gensim. Po znalezieniu tematów chciałbym klastrować dokumenty za pomocą algorytmu takiego jak k-średnich (idealnie chciałbym użyć dobrego do nakładania się klastrów, więc wszelkie zalecenia są mile widziane). Udało mi się uzyskać tematy, ale mają one postać:

0,041 * Minister + 0,041 * Klucz + 0,041 * chwile + 0,041 * kontrowersyjny + 0,041 * Prime

Aby zastosować algorytm grupowania i poprawić mnie, jeśli się mylę, uważam, że powinienem znaleźć sposób na reprezentowanie każdego słowa jako liczby za pomocą tfidf lub word2vec.

Czy masz jakieś pomysły na to, jak mogę „usunąć” informacje tekstowe np. Z listy, aby to zrobić, a następnie umieścić je z powrotem w celu odpowiedniego pomnożenia?

Na przykład z tego, co widzę, jeśli słowo Minister ma wagę tfidf 0,042 i tak dalej dla każdego innego słowa w tym samym temacie, powinienem obliczyć coś takiego:

0,041 * 0,42 + ... + 0,041 * tfidf (Prime) i uzyskaj wynik, który zostanie później użyty w celu zgrupowania wyników.

Dziękuję za Twój czas.

Swan87
źródło
1
Jak wyjaśniono w samouczku , możesz wyrażać dokumenty jako wektory. Klaster tych wektorów.
Emre
Znam partnera, ale muszę je zgrupować zgodnie z tematami stworzonymi po zastosowaniu LDA w mojej kolekcji. Każdy temat powinien być reprezentowany jako wektor, aby porównać każdy dokument z każdym tematem i znaleźć odpowiedni temat lub tematy dla każdego dokumentu.
Swan87
Nie musisz reprezentować każdego słowa jako wektora. Otrzymasz nową reprezentację dla całego dokumentu , stosując transformację LDA, której nauczyłeś się do korpusu . Przykład z LSI znajduje się pod tym linkiem: radimrehurek.com/gensim/tut2.html Kluczową częścią jest zastosowanie wyuczonej transformacji LSI do całego korpusu za pomocą lsi [doc_bow]
Will Stanton

Odpowiedzi:

4

Zakładając, że LDA stworzyło listę tematów i oceniło każdy temat dla każdego dokumentu, można przedstawić dokument i jego wyniki jako wektor:

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

Aby uzyskać wyniki dla każdego dokumentu, możesz uruchomić dokument. jako worek słów, przez wyszkolony model LDA. Z dokumentacji gensim:

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

Następnie możesz uruchomić k-średnich na tej macierzy i powinien on grupować podobne dokumenty razem. Domyślnie K-oznacza to twardy algorytm klastrowania sugerujący, że klasyfikuje on każdy dokument w jednym klastrze. Możesz użyć mechanizmów klastrowania miękkiego, które dadzą ci wynik prawdopodobieństwa, że ​​dokument pasuje do klastra - nazywa się to rozmytym k-średnią . https://gist.github.com/mblondel/1451300 to istota Pythona pokazująca, jak możesz to zrobić za pomocą scikit learn.

ps: Nie mogę opublikować więcej niż 2 linków

Popiół
źródło
Próbowałem to zrobić dla „n”, żaden dokument nie mówi, gdzie są tematy. Jednak dla powiedzmy x liczby dokumentów, wszystkie t tematy prob nie pokazują tylko niektórych (t- nie) tematów prob, gdzie 1 <= no <t. Nie dzieje się tak, gdy przeprowadzam eksperyment na małym rozmiarze dokumentu. Czy to dlatego, że nie drukuje się wcale, jeśli sonda ma wartość 0?
Manish Ranjan
0

W uzupełnieniu do poprzedniej odpowiedzi lepiej nie tylko uruchamiać kmeans bezpośrednio na danych kompozycyjnych pochodzących z dystrybucji lda topic-doc, zamiast tego użyć transformacji danych kompozycyjnych, aby rzutować je na przestrzeń euklidesową, np. Ilr lub clr.

( Przykład )

Anestis Fachantidis
źródło