2014-10-15 3 views
2

В качестве ввода я получаю адрес в виде строки. Он может сказать что-то вроде "123 Fake Street\nLos Angeles, CA 99988". Как я могу преобразовать это в объект с такими полями:Как вы преобразовываете строку java в объект почтового адреса?

Address1 
Address2 
City 
State 
Zip Code 

Или что-то похожее на это? Если есть java-библиотека, которая может это сделать, тем лучше.

К сожалению, у меня нет выбора о вводе String. Это часть спецификации, которую я пытаюсь реализовать.

Вход не очень хорошо структурирован, поэтому код должен быть очень устойчивым к отказам. Кроме того, адреса могут быть со всего мира, но 99 из 100, вероятно, находятся в США.

+1

Являются ли форматы входной строки всегда одинаковыми? У вас есть пример ввода с адресом2. Кроме того, это только адреса США или другие страны? –

+0

@AlvinBunk хороший вопрос. Я редактировал свой вопрос. –

+0

Привет, Я задумал создать код Regex на основе примера @ChrisS, однако я согласен с Мэттом в том, что использование Regex's сложно с адресами. Возможно, вы захотите использовать что-то еще. –

ответ

-2

Может быть, вы можете использовать Regular Expression

+1

Хорошо, какое регулярное выражение вы бы использовали? –

+0

Нет! Адреса не являются обычным языком! Регулярные выражения недостаточно эффективны. – Matt

3

Вы можете использовать JGeocoder

public static void main(String[] args) { 
    Map<AddressComponent, String> parsedAddr = AddressParser.parseAddress("Google Inc, 1600 Amphitheatre Parkway, Mountain View, CA 94043"); 
    System.out.println(parsedAddr); 

    Map<AddressComponent, String> normalizedAddr = AddressStandardizer.normalizeParsedAddress(parsedAddr); 
    System.out.println(normalizedAddr); 
    } 

выход будет:

{street=Amphitheatre, city=Mountain View, number=1600, zip=94043, state=CA, name=Google Inc, type=Parkway} 
{street=AMPHITHEATRE, city=MOUNTAIN VIEW, number=1600, zip=94043, state=CA, name=GOOGLE INC, type=PKWY} 

Существует еще одна библиотека International Address Parser вы можете проверить его пробную версию. Он также поддерживает страну.

AddressParser addressParser = AddressParser.getInstance(); 
AddressStandardizer standardizer = AddressStandardizer.getInstance();//if enabled 
AddressFormater formater = AddressFormater.getInstance(); 

String rawAddress = "101 Avenue des Champs-Elysées 75008 Paris"; 

//you can try to detect the country 
CountryDetector detector = CountryDetector.getInstance(); 
String countryCode = detector.getCountryCode("7580 Commerce Center Dr ALABAMA"); 
System.out.println("detected country=" + countryCode); 

Также, пожалуйста, проверьте Implemented Countries в этой библиотеке.

Приветствия!

+0

Я не вижу способа вывести страну из адреса. Знаете ли вы, возможно ли это? –

+0

Я посмотрел исходный код, и это заставило меня поверить, что это работает только для американских адресов. По моему сценарию, адрес предназначен для «места рождения», поэтому очень разумно, чтобы ценность была вне США. –

+0

Итак, у нас есть неамериканский адрес, который также имеет страну и находится в том же формате, что и в приведенном выше примере? –

1

Если вы уверены в формате, вы можете использовать регулярные выражения, чтобы получить адрес из строки. Например, вы предоставили что-то вроде этого:

String address = "123 Fake Street\\nLos Angeles, CA 99988";  
String[] parts = address.split("(.*)\\n(.*), ([A-Z]{2}) ([0-9]{5})"); 
+0

Я не уверен в этом формате. –

+0

Это не будет работать для канадских и британских адресов. Можете ли вы изменить его? –

2

Я работаю на SmartyStreets, где мы разрабатываем алгоритмы анализа и извлечения адресов.

Это сложно.

Если большинство ваших адресов находятся в США, вы можете использовать службу проверки адреса, чтобы обеспечить гарантированные точные результаты синтаксического анализа (поскольку адреса проверяются на главный список).

Есть несколько провайдеров, поэтому осмотритесь и найдите ту, которая вам подходит. Поскольку вы, вероятно, не сможете установить базу данных локально (не без большой платы, поскольку данные адреса лицензируются USPS), найдите тот, который предлагает конечную точку REST, чтобы вы могли просто сделать HTTP-запрос. Поскольку похоже, что у вас много адресов, убедитесь, что API является высокопроизводительным и позволяет выполнять пакетные запросы.

Например, с нашим:

Вход:

13001 Пойнт Richmond Dr NW, Gig Harbor WA

Выход:

Address verified

Или более конкретно разбивки компонентов, если это необходимо:

components

Если вход даже грязнее, есть несколько услуг извлечения адреса доступны, которые могут обрабатывать немного шума в адрес и анализирует адреса из текста и превращает их в свои компоненты. (SmartyStreets предлагает это также как бета-API. Я считаю, что некоторые другие службы НЛП тоже делают подобные вещи.)

Конечно, это работает только для адресов в США. Я не специалист по британским или канадским адресам, но я считаю, что они могут быть немного проще в целом.

(Помимо небольшого количества хорошо развитых стран, международные данные действительно удачны и надежны. Надежные наборы данных трудно получить или их не существует. Но если вы на действительно жесткий бюджет вы можете написать свой собственный парсер для all the address formats.)

0

Предполагаю, что последовательность информации всегда такая же, как и у пользователя, никогда не войдет в почтовый индекс до состояния. Если я правильно задал ваш вопрос, вам понадобится логика для обработки afdress, которая может быть неполной (например, отсутствует часть). Один из способов сделать это - найти части строки, которые, как вы знаете, верны. Вы можете обрабатывать известные части адреса как разделители. Вам понадобится имя города и штата и адресные слова (такие как «Улица», «Авеню», «Дорога» и т. Д.) В массиве.

  1. Выполните указатель с городами, состояниями и адресными словами (и сохраните их).
  2. Подстроить и вырезать первую строку адреса (от начала до индекса, обозначающего слово + его длину).
  3. Проверьте индекс названия города (индекс, найденный на шаге 1). Если это -1, пропустите этот шаг. Если это 0 Вынуть (0 также означает, что адресная строка 2 не находится в строке). Если это больше 0, подстрока и вырезать что угодно от начала строки до индекса имени города как 2-й строки адреса.
  4. Проверьте индекс имени штата. Еще раз, если -1 пропустите этот шаг. Если 0 подстрока и вырезается как имя состояния.
  5. Что бы ни оставалось, ваш почтовый индекс
  6. Проверьте строки, которые вы только что извлекли, для разделителей слева (разделители, точки, новые линии и т. Д.) И извлеките их;

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

Невозможно реализовать то, что вам нужно, но вы, вероятно, не хотите тратить все это время на это. Легче просто убедиться, что пользователь правильно вводит все.

+0

Это хорошее начало, но этот алгоритм предполагает, что [эти слова] (http://pe.usps.com/text/pub28/28apc_002.htm) не отображаются в названии улицы, и это не учитывает directionals. Уличные суффиксы не всегда присутствуют, а на некоторых улицах нет суффиксов (я живу на улице без суффикса. Фактически, мое название улицы - это номер.) Это также не будет работать слишком хорошо, если вход пользователя имеет правописание ошибки или что-то не в порядке. Также может возникнуть проблема, если название города или штата или направление - название улицы, что довольно часто. – Matt