Как использовать LDA gensim для проведения поиска по запросам?

Я пытаюсь понять, как LDA можно использовать для извлечения текста, и в настоящее время я использую модель LdaModel от gensim для реализации LDA, здесь: https://radimrehurek.com/gensim/models/ldamodel.html.

Мне удалось определить k тем и их наиболее часто употребляемые слова, и я понимаю, что LDA - это вероятностное распределение тем и то, как слова распределены по этим темам в документах, так что это имеет смысл.

Тем не менее, я не понимаю, как использовать LdaModel для получения документов, которые имеют отношение к строковому вводу поискового запроса, например, "отрицательные эффекты контроля рождаемости". Я попытался вывести распределения тем по поисковому запросу и найти сходства между распределением тем по поисковому запросу и распределениями тем из корпуса с использованием сходства gensim.MatrixSimility для вычисления сходства косинусов, например, так:

lda = LdaModel(corpus, num_topics=10) index = similarities.MatrixSimilarity(lda[corpus]) query = lda[query_bow] sims = index[query]

Но производительность не очень хорошая. Я считаю, что нахождение распределения тем в поисковом запросе не слишком важно, поскольку в поисковом запросе обычно есть только 1 тема. Но я не знаю, как еще я мог бы реализовать это на LdaModel на Gensim. Любой совет был бы очень признателен, я новичок в теме моделирования и, возможно, я упускаю что-то, что для меня очевидно очевидно? Спасибо!

1 ответ

Решение

Я считаю, что длина вашего текстового запроса слишком мала и / или ваше отношение количества тем к длине запроса слишком мало для того, чего вы хотите достичь.

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

Ваша модель LDA выше имеет только 10 тем, поэтому ваши шансы найти более одной темы в данном предложении очень низки. Итак, я бы посоветовал провести тестирование, если обучение модели на 100 или 200 темах сделает это немного лучше. Теперь у вас есть большие шансы попасть на несколько тем в одном предложении.

Вот (упрощенно) пример того, почему это может работать:
С num_topics=10 у вас могут быть темы:

topic_1: "pizza", "pie", "fork", dinner", "farm",...
topic_2: "pilot", "navy", "ocean", "air", "USA", ...
...

Теперь, если вы запросите предложение

"Tonight at dinner I will eat pizza with a fork"

Вы получите только topic_1 в ответ

Однако с num_topics=200 ваши темы могут быть примерно такими

topic_1: "pizza", "margherita", "funghi",...
topic_2: "fork", "knife", "spoon",...
topic_3: "dinner", "date", "lunch", ...

То же самое предложение теперь cpvers topic_1, topic_2, topic_3,

Теперь от вашего корпуса во многом зависит, увеличит ли количество тем, что сделает вывод хорошим. Для чего-то такого большого, как английская Википедия, работает 200 тем. Для меньшего корпуса это не ясно.

И даже с большим количеством тем, я полагаю, что текст запроса может быть слишком коротким.

Другие вопросы по тегам