Я пытаюсь сделать автозаполнение на основе пользовательских запросов.У меня есть куча агрегированных запросов, таких как:
QUERY COUNT
"harry potter" 100
"iron man" 93
"harry pott" 32
"harr pott" 5
с 200.000 строк.Как видите, некоторые пользователи широко используют поиск с префиксом, набирая только первые буквы слова.Эти запросы в примере должны быть агрегированы с полной строкой «Гарри Поттер».
Теперь, предполагая, что большинство пользователей ищут с полными словами, я думаю, что я могу эффективно выполнить эту агрегацию (избегая вложенного цикла forпо всему индексу) следующим образом:
Я сортирую токены в запросе по алфавиту и генерирую карту «first_token», например:
"h" "harry potter"
"ha" "harry potter"
"har" "harry potter"
"harr" "harry potter"
"harry" "harry potter"
и соответственно «second_token» и т. д....
"p" "harry potter"
"po" "harry potter"
"pot" "harry potter"
"pott" "harry potter"
"potte" "harry potter"
"potter" "harry potter"
и затем я перебираю сверху вниз, и для каждого элемента, такого как "harr pott", я проверяю, есть ли элемент в "first_token" и "second_token", значение которого одинаководокумент, например, «Гарри Поттер», и этот документ не идентичен оригиналу («Харр Потт») и имеет более высокий балл, и в этом случае я агрегирую его.Время выполнения этого должно быть O (index_size * max_number_of_tokens).
Теперь мне было интересно, есть ли какая-нибудь библиотека для Python, которая могла бы упростить мне реализацию всего этого.Исходя из Java / JS, я еще не очень знаком с Python, я просто знаю, что у него есть много инструментов для NLP.
Может ли что-нибудь в NLTK или так мне помочь?Я думаю, что должен быть хотя бы инструмент для векторизации строк.Возможно, используя это, вы можете выполнить операцию «начинается с» как простой поиск, не создавая карты попыток вручную?