@ yura, это не то, что вы ищете, но я не думаю, что какой-нибудь умный алгоритм сможет постоянно устранять неоднозначность, ссылаются ли запросы типа "soma ca" на Soma в Сан-Франциско или Soma Lake в Канаде , Проблема не в том, что ваш алгоритм не достаточно сложен; проблема в том, что в запросе "soma ca" просто недостаточно информации.
Я не знаю, как выразить это ясно, но здесь происходит информационная теория. Это похоже на то, как случайные данные не могут быть сжаты без потерь: на входе недостаточно информации для вычисления желаемого результата.
Даже если человек будет интерпретировать ваши запросы вручную, он не обязательно поймет, что «сома ча» означает «сома» в SF. Может быть, для вас двухбуквенное сокращение, например, «ca», «естественно» относится к штату США, а не к иностранной стране, но в этом выборе нет ничего принципиально «правильного», и его нельзя получить, используя чистую логику. Это произвольное, специфичное для домена, специальное правило, точно так же как специальная эвристика log(population)
, на которую вы ссылались.
Некоторые возможные «решения» (помимо разработки телепатического компьютера, который может читать мысли пользователей):
- Предоставьте пользователям список возможных совпадений для каждого запроса. Следите за теми, которые они выбирают, и когда другие пользователи позже введут тот же запрос, упорядочьте результаты по популярности.
- ИЛИ, как только вы соберете много данных о популярности результатов запросов, вы даже сможете добывать данные с помощью алгоритмов машинного обучения и получать из этого лучшую эвристику.
- Или, прежде чем запускать приложение в производственную эксплуатацию, вы могли бы сначала скомпилировать тело поддельных запросов вместе с результатами, которые, по вашему мнению, должен выдавать ваш алгоритм для каждого такого запроса. Тогда используйте свои алгоритмы машинного обучения для этого.
- Скомпилируйте совокупность поддельных запросов и желаемых ответов ИЛИ получите данные от выбора реальных пользователей и используйте эти данные для оценки точности разработанной вручную и закодированной эвристики ранжирования. Продолжайте изобретать новую эвристику, пока не найдете ту, которая достигает высокой точности в вашем наборе тестовых данных.