Как использовать 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 тем. Для меньшего корпуса это не ясно.
И даже с большим количеством тем, я полагаю, что текст запроса может быть слишком коротким.