Сопоставление почтовых адресов с базой данных

Я разрабатываю веб-приложение (с использованием Google Maps), которое позволит пользователям искать почтовые адреса проживания в моей базе данных.

То есть пользователи будут указывать адреса, а я их сохраню; позже другие пользователи будут вводить адрес, чтобы узнать, есть ли этот адрес в моей базе данных.

Но адреса, как известно, трудно нормализовать; Я не могу понять, как лучше их хранить / запрашивать. (Тем более, что геокодер Google не позволяет мне сохранять результаты геокодера.)

Какой лучший подход?


person Dan Fabulich    schedule 19.12.2013    source источник


Ответы (3)


Это проблема, которую можно решить как с помощью lat-long (используйте R-деревья для быстрых двухмерных ближайших соседей! Входит в стандартную комплектацию MongoDB, но, безусловно, доступен и в Psql, среди прочего)

Здесь также описано сопоставление текста: SO: Что есть способы сопоставления почтовых адресов в SQL Server?

Похоже, есть и сторонние продукты: SO: Мне нужен алгоритм сопоставления адресов < / а>

Если вы хотите объединить эти два подхода, ищите термин «слияние данных», который представляет собой довольно разрозненный набор методов, которые, по сути, придают больший вес более определенным ответам и основывают окончательный ответ на агрегированной достоверности.

Также может быть интересно описание некоторых исследований ГИС-проекта Гарвардского дизайна: http://www.gsd.harvard.edu/gis/manual/geocoding/

Есть список всех городов мира с соответствующими координатами: http://www.maxmind.com/en/worldcities

person claj    schedule 28.12.2013
comment
Я награждаю вас наградой, потому что это лучший ответ, который я получил до сих пор, но я не считаю его правильным, потому что это скорее стратегия исследования проблемы, чем конкретное решение. (Кажется, что ни один из этих продуктов сторонних производителей не делает того, о чем я здесь просил.) - person Dan Fabulich; 29.12.2013
comment
Спасибо! Вы не говорите, какую среду используете, что затрудняет определение определенного решения. Это не простая проблема, но требует сочетания решений. - person claj; 29.12.2013

Вот что я подумал:

1) Геокодируйте адрес на входе, сохраните широту / долготу. Когда пользователь выполняет поиск, геокодируйте адрес и сравнивайте широту и долготу, чтобы увидеть, есть ли у меня в базе данных именно эта широта и долгота.

Но с этим есть проблемы.

  • Сохранение результатов Google Geocoder является нарушением условий их использования.
  • Для этого есть веская причина; Google постоянно обновляет свои геокоды, поэтому широта и долгота адреса могут со временем меняться.
  • Я бы проводил точное сравнение чисел с плавающей запятой, которое может быть неточным.
  • А как насчет нескольких квартир в здании? У них у всех одинаковые широта и долгота, но это разные адреса.

2) Геокодируйте адрес при вводе, но не сохраняйте широту / долготу; сохраните компоненты адреса и сравните их.

Это кажется лучше, но проблемы все еще есть:

  • По-прежнему нарушает условия использования геокодера?
  • ... потому что Google может изменить свои результаты. Возможно, компоненты адреса с меньшей вероятностью изменятся, но они все равно могут измениться, поскольку люди сообщают об ошибках данных в Google. (Конечно, по крайней мере, почтовый индекс может измениться.)

3) Геокодируйте адрес, сохраняйте широту / долготу, но не ищите точно широту / долготу. Выполните поиск в небольшом радиусе вокруг полученной точки в поисках возможных совпадений. Сравните эти возможные совпадения по компонентам адреса.

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

4) Геокодируйте адрес на входе, получите компоненты адреса, но просто используйте их для хранения проанализированного нормализованного почтового адреса в базе данных.

Добавьте вручную скрученный код, чтобы разделить нормализованные адреса на еще более мелкие поля (название улицы, тип улицы, префикс, постфикс ...). Когда пользователь выполняет поиск, запускает тот же код нормализации, а затем выполняет поиск по полям.

Думаю, это сработает, но использование моего собственного парсера адресов кажется рецептом боли. Похоже, это просто не может быть правильным. (Я не могу быть первым, кому нужно решить эту проблему, не так ли?)

person Dan Fabulich    schedule 19.12.2013
comment
Я буду совершенно честен, я не уверен, как работают почтовые индексы в США. Здесь, в Великобритании, все, что вам нужно сделать, это сопоставить почтовый индекс и номер / имя дома. Это дало бы вам совпадение или нет, даже не касаясь геокодирования? - person ChrisSwires; 23.12.2013
comment
Также я всегда обращался с адресами по номеру дома (или имени) / названию улицы / городу / почтовому индексу / штату / стране. Практически то же самое, что и поля адреса в стандартной форме. Я считаю это самым простым. - person ChrisSwires; 23.12.2013
comment
Почтовые индексы США определяются почтовым отделением США; они меняются для удобства почтовых перевозчиков. Да и формат адреса вряд ли можно назвать стандартным. pe.usps.gov/cpim/ftp/pubs/pub28/pub28. pdf - person Dan Fabulich; 24.12.2013

Возможно, вы могли бы использовать geocoder.us, чтобы дополнить или заменить использование геокодера Google. Он отлично разбирает компоненты адреса; это может помочь с нормализацией. Также существует более новая версия, на которую, возможно, стоит посмотреть, как она работает.

person banderkat    schedule 27.12.2013