Как сравнивать адреса?

Сталкивался ли кто-нибудь с задачей сравнения адресов?
Есть два адреса — нужно понять одинаковые ли они (ну, и желательно оценить насколько мы уверены в том, что они одинаковы).

Нужно решения для двух случаев:
1) структурированные адреса (отдельное поле для каждого элемента адреса — города, улицы, дома и т.п.);
2) неструктурированные адреса (записаны просто одной строкой, порядок элементов неизвестен).

При этом нормализовывать адреса (т.е. разбивать их по полям, исправлять ошибки и т.п.) — как в решении ФАКТОР — ненужно.
  • Вопрос задан
  • 6722 просмотра
Пригласить эксперта
Ответы на вопрос 9
Wott
@Wott
Я в одном проекте запрашивал google geocoding и сравнивал координаты :)
Ответ написан
Комментировать
Kindman
@Kindman
Вот как делал я:
1) качал КЛАДР (100 МБ в 5 DBF файлах)
2) вытаскивал из него все УЛИЦЫ (вместе с их населенными пунктами) — 860 тысяч улиц.
получалось как-то так:

020010010030001; Дорожная; ул; Атаевка; д; Уфа; г; Башкортостан; Респ; Уфимский; р-н

для некоторых улиц некоторые поля оставались пустыми, например:

010000010000001; Абадзехская; ул;;; Майкоп; г;;;;

далее для любого пользовательского инпута пробовал получить список всех подходящих улиц:
Например для «Мясоедовская улица» получаем:

380190000930002; Мясоедовская; ул; Екунчет; п;;; Иркутская; обл; Тайшетский; р-н
500340001040001; Мясоедовская; ул; Кондрево; с;;; Московская; обл; Ступинский; р-н
520170000770009; Мясоедовская; ул; Капустиха; д;;; Нижегородская; обл; Воскресенский; р-н

остается лишь уточнить область.
Ответ написан
Комментировать
valerijfrolov
@valerijfrolov
Пришла в голову мысль сортировки двух адресов в одном направлении и посимвольное сравнение, правда пока не знаю на сколько пригоден такой метод.
Ответ написан
valerijfrolov
@valerijfrolov
A-Z или Z-A
Ответ написан
Комментировать
knekrasov
@knekrasov
Задача решаема, если поля структурированы (нормализация либо точный формат строки адреса).
При этом имхо имеет смысл сравнивать поля адреса по принципу сравнения разрядов чисел:
от более приоритетных полей к менее приоритетным или от более общих к более детальным,
например Страна -> Область/район -> населенный пункт etc.
Ответ написан
Комментировать
Можно скармливать гуглу или яндексу, и сравнивать нормализованный результат.
Ответ написан
bigbaraboom
@bigbaraboom
Если работаешь с базами данных то есть решения для многих баз нечеткого сравнения строк.

Вот вариант для PostgreSQL habrahabr.ru/blogs/postgresql/78566/ тут же описан один из алгоритмов, если базами не пользуешься.
Ответ написан
Для неструктурированных адресов можно наверное попробовать так:
— нормализовать по регистру
— разделить на токены (последовательности непрерывных символов: «ул.», «ленина», «123», «А», «8»);
— отсортировать лексикографически
— вычислить над сравниваемыми адресами редакционное расстояние habrahabr.ru/blogs/algorithm/117063/ (считая весь список токенов «строкой», а «буквами» в ней — выделенные токены).

Например, после сортировки
«123», «8», «а», «ленина», «ул»

сравниваем с «москва, ленина, 123, 8»
«123», «8», «ленина», «москва»
редакционное расстояние — 2

сравниваем с «москва, ленина, 123-А, 8»
«123», «8», «а», «ленина», «москва»
редакционное расстояние — 1

Весьма желательно уметь убирать из анализа или приравнивать при сравнении константы «ул.», «улица», «пл.», «пр-д», «проезд», «г.».
Ответ написан
artzub
@artzub
Программист
Скажу так без человеческого вмешательства не обойтись.
Подогнать конечно можно под какой-то шаблон, но вероятность ошибки очень велика.

У меня два проекта, в которых я решал эти задачи. Адреса в одном и том же наборе могут быть, как и структурированные по принципу 9 запятых (это самый простое, можно вычленять автоматически и предлагать подходящие человеку для принятия решения), так же и такие, которые, как говориться: «как бог на душу положит» — это вообще самый не решаемый вариант =)

Что я делаю:
1. Внедрил КЛАДР в свою систему. Конвертировал их данные в древовидную структуру в одной таблице и еще одна таблица с сокращениями.
2. Формируем свои таблицы справочники Регионы, Районы, Города, Улицы. Потому что, КЛАДР это только источник данных к нему нельзя привязывать реальные адреса. Так как при обновлении, не которые записи КЛАДРа могу перейти в состояние не действительных и их ид будут не валидны. Ну то есть храним адреса в своем формате.
Поиск:
1. Если адрес, подается разбору по 9 запятым или меньше, то пробуем найти его в КЛАДР (в КЛАДРе есть не все) по этому анализируется так-же и наши справочники. пункт 3. иначе пункт 2.
2. Если адрес, не поддается разбору. Выводим диалог выбора из классификатора. Пользователь пытается найти адрес, если находи пункт 5, иначе пытается собрать приблизительно соответствующий, допустим в классификаторе нет нужной улицы в нужном городе или населенного пункта в район, такое встречается, выбираем другую улицу и формируем адрес и переходим к пункту 3.
3. Если удается собрать адрес или его часть, то показываем диалог редактирования адреса. Пользователь корректирует и сохраняет, пункт 4.
4. Программа ищет во входящем наборе подобные адреса, которые отличаются каким либо признаком допустим домом, корпусом. И предлагает их привязать к только что созданному. ну или пункт 2.

Ну вообщем что-то приблизительно так.
Но проще всего всю ответственность свалить на оператора, который должен корректно импортировать адреса. Нашу совесть ложиться только помочь более или менее облегчить его муки.

P.S. А вы пробовали анализировать фармацевтический ассортимент =) только человек или гигантская база знании и умный ии решат такую задачу, ваша задача из этого же разряда =)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы