Посмотрите что предоставляет
dadata. У них есть что можно повторить в своём сервисе, например, нормализация адреса.
Ещё прикольная штука для всякого рода голосовых помощников - это корреляционные выборки.
Поясню.
Пользователь разговаривает с ботом. В нём идёт речь о Париже или селе Ольховатка. Таких населенных пунктов сильно больше одного. Особенно Ольховаток. Однако какие-то ольховатки от пользователя в тысячах километров, а одна в десятке км. Какую из них скорее всего имеет в виду пользователь?
Итак, у нас есть несколько опорных адресов: домашний адрес пользователя из профиля, адреса последних запросов погоды от пользователя и т.д.
Теперь пользователь спрашивает где ближайшая пятёрочка в районе Ольховатки.
Мы ищем её в БД и по базе корреляций находим самые релевантные в порядке уменьшения релевантности. Предполагаем самую вероятную и, если у второй и третьей индекс релевантности слишком близок к первой, то уточняем: "это в таком-то-таком районе которая?", пользователь говорит, нет в в таком-то-другом.
Такой-то-другой район как отдельный адрес попадает в кеш POI пользователя и после очередного запроса Ольховатки в базе адресов мы выстраиваем их уже с новым индексом релевантности. Если снова на первом месте отвергнутый вариант, то пропускаем его и делаем следующее уточнение.
Написал сумбурно, но этого не хватает.
Вообще прикольно было бы иметь еще базу алиасов и синонимов топонимов.
Питер, Санкт-Петербург, Ленинград - это алиасы одного населенного пункта.