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


9

Я хочу использовать скрытое выделение дирихле для проекта, и я использую Python с библиотекой gensim. После нахождения тем я хотел бы кластеризовать документы, используя алгоритм, такой как k-means (в идеале я хотел бы использовать хороший для перекрывающихся кластеров, поэтому любая рекомендация приветствуется). Мне удалось получить темы, но они в форме:

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-means по умолчанию является жестким алгоритмом кластеризации, подразумевающим, что он классифицирует каждый документ в один кластер. Вы можете использовать мягкие механизмы кластеризации, которые дадут вам оценку вероятности того, что документ вписывается в кластер - это называется нечетким k-средним . https://gist.github.com/mblondel/1451300 - это Python-гист, показывающий, как вы можете сделать это с помощью scikit learn.

PS: я не могу опубликовать более 2 ссылок


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

0

В дополнение к предыдущему ответу вам лучше не просто запускать kmeans непосредственно для композиционных данных, полученных из дистрибутива lda topic-doc, а использовать некоторое преобразование композиционных данных для проецирования их в евклидово пространство, такое как ilr или clr.

( Пример )

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.