вектор тем фиксированного размера в gensim LDA моделирование тем для поиска похожих текстов - PullRequest
0 голосов
/ 21 ноября 2018

Я использую Gensim LDA для моделирования тем, чтобы найти темы для каждого документа и проверить сходство между документами, сравнивая полученные векторы тем.Каждому документу присваивается различное количество подходящих тем, поэтому сравнение вектора (по косинусному сходству) является неправильным, поскольку требуются векторы одинаковой длины.

Это связанный код:

lda_model_bow = models.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=3, passes=1, random_state=47)

#---------------Calculating and Viewing the topics----------------------------
vec_bows = [dictionary.doc2bow(filtered_text.split()) for filtered_text in filtered_texts]

vec_lda_topics=[lda_model_bow[vec_bow] for vec_bow in vec_bows]

for id,vec_lda_topic in enumerate(vec_lda_topics):
    print ('document ' ,id, 'topics: ', vec_lda_topic)

Выходные векторы:

document  0 topics:  [(1, 0.25697246), (2, 0.08026043), (3, 0.65391296)]
document  1 topics:  [(2, 0.93666667)]
document  2 topics:  [(2, 0.07910537), (3, 0.20132676)]
.....

Как видите, каждый вектор имеет разную длину, поэтому невозможно выполнить косинусное сходство между ними.

Я бынапример, вывод:

document  0 topics:  [(1, 0.25697246), (2, 0.08026043), (3, 0.65391296)]
document  1 topics:  [(1, 0.0), (2, 0.93666667), (3, 0.0)]
document  2 topics:  [(1, 0.0), (2, 0.07910537), (3, 0.20132676)]
.....

Есть идеи, как это сделать?Тпй

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Так как panktijk говорит в комментарии, а также эта тема , решение состоит в том, чтобы изменить minimum_probability со значения по умолчанию от 0.01 до 0.0.

0 голосов
/ 21 ноября 2018

Я использовал gensim для моделирования тем раньше, и я не сталкивался с этой проблемой.В идеале, если вы передадите num_topics=3, тогда он вернет 3 топовые темы с наибольшей вероятностью для каждого документа.И тогда вы сможете сгенерировать матрицу сходства косинусов, выполнив что-то вроде этого:

lda_model_bow = models.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=3, passes=1, random_state=47)
vec_lda_topics = lda_model_bow[bow_corpus]
sim_matrix = similarities.MatrixSimilarity(vec_lda_topics)

Но по какой-то причине, если вы получаете неравное количество тем, вы можете принять нулевое значение вероятности для оставшихсятемы и включите их в свой вектор, когда вы вычисляете сходство.

Ps: Если бы вы могли предоставить образец ваших входных документов, было бы легче воспроизвести ваш вывод и изучить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...