Кластеризація документів із використанням тем, похідних від розподілу прихованого Діріхле


9

Я хочу використовувати Latent Dirichlet Allocation для проекту, і я використовую Python з бібліотекою gensim. Знайшовши теми, я хотів би згрупувати документи за допомогою такого алгоритму, як k-засоби (в ідеалі я хотів би використовувати хороший для перекриття кластерів, тому будь-яка рекомендація вітається). Мені вдалося отримати теми, але вони є у формі:

0,041 * міністр + 0,041 * ключ + 0,041 * моменти + 0,041 * суперечливий + 0,041 * прайм

Для того, щоб застосувати алгоритм кластеризації та виправити мене, якщо я помиляюся, я вважаю, що я повинен знайти спосіб представити кожне слово як число, використовуючи або tfidf, або word2vec.

Чи є у вас ідеї, як я міг би "зняти" текстову інформацію зі списку, щоб це зробити, а потім розмістити їх назад, щоб зробити відповідне множення?

Наприклад, так, як я бачу це, якщо слово Міністр має tfidf вагою 0,042 і так далі для будь-якого іншого слова в межах тієї ж теми, я повинен був обчислити щось на кшталт:

0,041 * 0,42 + ... + 0,041 * tfidf (Prime) і отримайте результат, який буде згодом використаний для кластеризації результатів.

Спасибі за ваш час.


1
Як пояснено в навчальному посібнику , документи ви можете виражати як вектори. Кластер цих векторів.
Емре

Я знаю товариша, але мені доводиться класифікувати їх відповідно до тем, створених після того, як я застосую LDA у своїй колекції. Кожна тема повинна бути представлена ​​як вектор, щоб порівняти кожен документ із кожною темою та знайти відповідну тему чи теми для кожного документа.
Swan87

Не потрібно представляти кожне слово як вектор. Ви отримаєте нове представлення для всього документа , застосувавши до корпусу трансформацію LDA, яку ви вивчили . Для прикладу з LSI дивіться це посилання: radimrehurek.com/gensim/tut2.html Ключова частина полягає в тому, де вони застосовують вивчене перетворення LSI на весь корпус з lsi [doc_bow]
Буде Стентон

Відповіді:


4

Якщо припустити, що LDA склав список тем і поставив оцінку проти кожної теми для кожного документа, ви можете представити документ і його оцінки як вектор:

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

Щоб отримати бали за кожен документ, ви можете запустити документ. як мішок слів, через навчену модель LDA. З документації gensim:

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

Тоді ви можете запустити k-засоби на цій матриці, і вона повинна згрупувати документи, схожі разом. K-засоби за замовчуванням - це алгоритм жорсткого кластеризації, що означає, що він класифікує кожен документ в один кластер. Ви можете використовувати м'які механізми кластеризації, які дадуть вам оцінку ймовірності того, що документ поміщається в кластер - це називається нечіткими k-засобами . https://gist.github.com/mblondel/1451300 - це суть Python, яка показує, як ви можете це зробити з scikit learn.

ps: Я не можу розмістити більше 2 посилань


Я намагався зробити це для "n" жодної документації, де написано тему. Однак, скажімо, x ні документів, у всіх проблемах t не відображаються лише деякі (t- ні) тематичні завдання, де 1 <= ні <t. Це не відбувається, коли я запускаю експеримент з невеликим розміром документа. Це тому, що він взагалі не друкує, якщо зонд 0?
Маніш Ранджан

0

Доповнення до попередньої відповіді, вам краще не просто запускати kmeans безпосередньо на композиційних даних, отриманих від розподілу lda topic-doc, а використовувати деякі композиційні перетворення даних, щоб спроектувати їх у евклідовий простір, наприклад, ilr або clr.

( Приклад )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.