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


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.