Проанализируйте применимый Конкретный адрес, Город, состояние, Zip от [закрытой] строки

наблюдаемый может быть преобразован в обетование следующим образом:

let promise=observable.toPromise();
128
задан Matt 25 November 2014 в 20:42
поделиться

14 ответов

Я сделал большую работу над этим видом парсинга. Поскольку существуют ошибки, Вы не получите 100%-ю точность, но существует несколько вещей, которые можно сделать, чтобы получить большую часть пути там и затем сделать визуальный тест БАКАЛАВРА НАУК. Вот общий способ пойти об этом. Это не код, потому что это является довольно академическим для записи этого, нет никакой странности, просто большая строковая обработка.

(Теперь, когда Вы отправили некоторые демонстрационные данные, я внес некоторые незначительные изменения)

  1. Работа назад. Запустите с почтового индекса, который будет около конца, и в одном из двух известных форматов: XXXXX или XXXXX-XXXX. Если это не появляется, можно предположить, что Вы находитесь в городе, скажем часть, ниже.
  2. следующая вещь, перед zip, будет состоянием, и это будет или в двухбуквенном формате, или как слова. Вы знаете, каковы они будут, также - существует только 50 из них. Кроме того, Вы могли soundex слова, чтобы помочь компенсировать орфографические ошибки.
  3. , прежде чем это - город, и это , вероятно на той же строке как состояние. Вы могли использовать база данных индекса , чтобы проверить город и состояние на основе zip, или по крайней мере использовать его в качестве детектора БАКАЛАВРА НАУК.
  4. конкретный адрес обычно будет одной или двумя строками. Вторая строка обычно будет числом комплекта, если будет один, но это мог бы также быть Почтовый ящик.
  5. будет почти невозможным обнаружить имя на первой или второй строке, хотя, если это не снабжается префиксом число (или если это снабжается префиксом "внимание": или "внимание к": это могло дать Вам подсказку относительно того, является ли это именем или строкой адреса.

я надеюсь, что это помогает несколько.

117
ответ дан 24 November 2019 в 00:35
поделиться

На основе демонстрационных данных:

  1. я запустил бы в конце строки. Проанализируйте Индекс (любой формат). Считайте конец первому пространству. Если никакой почтовый индекс не был найден Ошибку.

  2. Trim конец затем для пробелов и специальных символов (запятые)

  3. Затем движение к состоянию, снова используйте Пространство как разделитель. Возможно, используйте список поиска для проверки 2 кодов состояния буквы и полных имен состояния. Если никакое допустимое найденное состояние, ошибка.

  4. пробелы Trim и запятые от конца снова.

  5. City становится хитрым, я на самом деле использовал бы запятую здесь, рискуя тем, чтобы получить слишком много данных в городе. Ищите запятую, или начало строки.

  6. , Если Вы все еще имеете символы в запасе в строке, пихните все это в поле адреса.

Это не прекрасно, но это должна быть довольно хорошая начальная точка.

5
ответ дан 24 November 2019 в 00:35
поделиться

Это не решит Вашу проблему, но если Вам только были нужны lat/long данные для этих адресов, Google Maps, API проанализирует неотформатированные адреса вполне прилично.

3
ответ дан 24 November 2019 в 00:35
поделиться

Существуют услуги передачи данных, которые, учитывая почтовый индекс дадут Вам список названий улицы в том почтовом индексе.

Использование regex для извлечения Zip или города-государства - находит корректный или если ошибка получает обоих. вытяните список улиц от , источник данных Исправляет город и состояние и затем конкретный адрес. После того как Вы получаете допустимую Строку адреса 1, город, состояние, и архивируете Вас, может затем сделать предположения на строке адреса 2.. 3

1
ответ дан 24 November 2019 в 00:35
поделиться

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

Попытка:

  1. Регулярное выражение для извлечения почтового индекса

  2. поиск почтового индекса (через соответствующее правительство DB) для получения корректного адреса

  3. Заставляет интерн вручную проверять, что новые данные соответствуют старому

4
ответ дан 24 November 2019 в 00:35
поделиться

Другой запрос на демонстрационные данные.

, Как был упомянут, я буду работать назад от zip.

, После того как у Вас есть zip, я запросил бы базу данных zip, сохранил бы результаты и удалил бы их & zip от строки.

, Который оставит Вас с путаницей адреса. БОЛЬШИНСТВО (Все?) адреса запустятся с числа, так найдите первое вхождение числа в остающейся строке и захватите все от него до (нового) конца строки. Это будет Вашим адресом. Что-либо слева от того числа вероятно адресат.

у Вас должны теперь быть Город, состояние, & Zip сохранена в таблице и возможно двух строках, адресате и адресе. Для адреса проверьте на существование "Комплекта" или "Кв.". и т.д. и разделение это в два значения (строки адреса 1 & 2).

Для адресата я плыл бы на плоскодонке и захватил бы последнее слово той строки как фамилия и поместил бы остальных в поле имени. Если Вы не захотите делать это, то необходимо будет проверить на привет (г-н, г-жа, Доктор, и т.д.) в запуске и сделать некоторые предположения на основе количества пробелов относительно того, как имя составлено.

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

6
ответ дан 24 November 2019 в 00:35
поделиться

Есть ли какие-либо стандарты вообще в способе, которым зарегистрированы адреса? Например:

  1. там всегда запятые или новые строки, отделяющиеся street1 от street2 из города от состояния от zip?
  2. типы адресов (дорога, улица, бульвар, и т.д.) всегда разъясняемый? всегда сокращаемый? Часть каждого?
  3. Определяют "ошибку".

Мой общий ответ является серией Регулярных выражений, хотя сложность этого зависит от ответа. И если нет никакой непротиворечивости вообще, то можно только смочь добиться частичного успеха с Regex (т.е.: отфильтровывание почтового индекса и состояния), и должен будет сделать остальных вручную (или по крайней мере пройти остальных очень тщательно, чтобы удостовериться, что Вы определяете ошибки).

6
ответ дан 24 November 2019 в 00:35
поделиться

Это не решит Вашу проблему, но если Вам только были нужны lat/long данные для этих адресов, Google Maps, API проанализирует неотформатированные адреса вполне прилично.

Хорошее предложение, альтернативно можно выполнить ВИХРЕВОЙ запрос на каждый адрес к Google Maps, и это возвратит правильно отформатированный адрес. От этого Вы можете regex к содержанию своей основы.

8
ответ дан 24 November 2019 в 00:35
поделиться

Я работал в домене обработки адреса в течение приблизительно 5 лет теперь, и действительно нет никакой серебряной пули. Правильное решение собирается зависеть от значения данных. Если это не очень ценно, бросьте его через синтаксический анализатор, как другие ответы предполагают. Если даже несколько ценно, что Вы должны будете определенно сделать, чтобы человек оценил/исправил все результаты синтаксического анализатора. При поиске полностью автоматизированного, повторяемого решения Вы, вероятно, хотите говорить с поставщиком исправления адреса как Group1 или Триллиум.

13
ответ дан 24 November 2019 в 00:35
поделиться

Я сделал это в прошлом.

Любой делает это вручную, (создайте хороший gui, который помогает пользователю сделать это быстро), или автоматизируйте его и проверьте по недавней базе данных адреса (необходимо купить это), и вручную обработайте ошибки.

Ручная обработка займет приблизительно 10 секунд каждый, означая, что можно сделать 3600/10 = 360 в час, таким образом, 4000 должен взять Вас приблизительно 11-12 часов. Это даст Вам высокий показатель точности.

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

Действительно получают копию Почтовых Стандартов Обращения (USPS) в http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf и замечают, что это 130 + страницы долго. Regexes для реализации, который был бы гаек.

Для международных адресов, все ставки выключены. Американские рабочие не смогли бы проверить.

, С другой стороны, используют услугу передачи данных. У меня нет, однако, рекомендаций.

, Кроме того: когда Вы действительно отсылаете материал в почте (это - то, что это для, правильно?) удостоверяются, что Вы помещаете "исправление адреса, которое требуют" на конверт (в правильном месте) и обновление база данных. (Мы сделали простой gui для человека стойки регистрации, чтобы сделать это; человек, который на самом деле сортирует почту)

Наконец, когда Вы вычистили данные, ищут дубликаты.

16
ответ дан 24 November 2019 в 00:35
поделиться

После совета здесь, я создал следующую функцию в VB, который создает проходимый, хотя не всегда прекрасный (если название компании и строка комплекта даны, это комбинирует комплект и город), применимые данные. Не стесняйтесь комментировать/осуществлять рефакторинг/вопить во мне для повреждения одного из моих собственных правил и т.д.:

Public Function parseAddress(ByVal input As String) As Collection
    input = input.Replace(",", "")
    input = input.Replace("  ", " ")
    Dim splitString() As String = Split(input)
    Dim streetMarker() As String = New String() {"street", "st", "st.", "avenue", "ave", "ave.", "blvd", "blvd.", "highway", "hwy", "hwy.", "box", "road", "rd", "rd.", "lane", "ln", "ln.", "circle", "circ", "circ.", "court", "ct", "ct."}
    Dim address1 As String
    Dim address2 As String = ""
    Dim city As String
    Dim state As String
    Dim zip As String
    Dim streetMarkerIndex As Integer

    zip = splitString(splitString.Length - 1).ToString()
    state = splitString(splitString.Length - 2).ToString()
    streetMarkerIndex = getLastIndexOf(splitString, streetMarker) + 1
    Dim sb As New StringBuilder

    For counter As Integer = streetMarkerIndex To splitString.Length - 3
        sb.Append(splitString(counter) + " ")
    Next counter
    city = RTrim(sb.ToString())
    Dim addressIndex As Integer = 0

    For counter As Integer = 0 To streetMarkerIndex
        If IsNumeric(splitString(counter)) _
            Or splitString(counter).ToString.ToLower = "po" _
            Or splitString(counter).ToString().ToLower().Replace(".", "") = "po" Then
                addressIndex = counter
            Exit For
        End If
    Next counter

    sb = New StringBuilder
    For counter As Integer = addressIndex To streetMarkerIndex - 1
        sb.Append(splitString(counter) + " ")
    Next counter

    address1 = RTrim(sb.ToString())

    sb = New StringBuilder

    If addressIndex = 0 Then
        If splitString(splitString.Length - 2).ToString() <> splitString(streetMarkerIndex + 1) Then
            For counter As Integer = streetMarkerIndex To splitString.Length - 2
                sb.Append(splitString(counter) + " ")
            Next counter
        End If
    Else
        For counter As Integer = 0 To addressIndex - 1
            sb.Append(splitString(counter) + " ")
        Next counter
    End If
    address2 = RTrim(sb.ToString())

    Dim output As New Collection
    output.Add(address1, "Address1")
    output.Add(address2, "Address2")
    output.Add(city, "City")
    output.Add(state, "State")
    output.Add(zip, "Zip")
    Return output
End Function

Private Function getLastIndexOf(ByVal sArray As String(), ByVal checkArray As String()) As Integer
    Dim sourceIndex As Integer = 0
    Dim outputIndex As Integer = 0
    For Each item As String In checkArray
        For Each source As String In sArray
            If source.ToLower = item.ToLower Then
                outputIndex = sourceIndex
                If item.ToLower = "box" Then
                    outputIndex = outputIndex + 1
                End If
            End If
            sourceIndex = sourceIndex + 1
        Next
        sourceIndex = 0
    Next
    Return outputIndex
End Function

Передача parseAddress функция "A. P. Croll & Сын 2299 Льюис-Джорджтаун Hwy, Джорджтаун, Делавэр 19 947" возвратов:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947
14
ответ дан 24 November 2019 в 00:35
поделиться

Я думаю, производя проблему на стороне, лучший выбор: отправьте его в Google (или Yahoo) геокодер. Геокодер возвращает не только lat/long (которые не представляют интереса здесь), но также и богатый парсинг адреса, с полями, заполненными, который Вы не отправили (включая ZIP+4 и графство).

, Например, анализируя урожаи "Amphitheatre Parkway, 1600, Маунтин-Вью, Калифорния"

{
  "name": "1600 Amphitheatre Parkway, Mountain View, CA, USA",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [
    {
      "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "AddressDetails": {
        "Country": {
          "CountryNameCode": "US",
          "AdministrativeArea": {
            "AdministrativeAreaName": "CA",
            "SubAdministrativeArea": {
              "SubAdministrativeAreaName": "Santa Clara",
              "Locality": {
                "LocalityName": "Mountain View",
                "Thoroughfare": {
                  "ThoroughfareName": "1600 Amphitheatre Pkwy"
                },
                "PostalCode": {
                  "PostalCodeNumber": "94043"
                }
              }
            }
          }
        },
        "Accuracy": 8
      },
      "Point": {
        "coordinates": [-122.083739, 37.423021, 0]
      }
    }
  ]
}

Теперь это parseable!

93
ответ дан 24 November 2019 в 00:35
поделиться

RecogniContact is a Windows COM object that parses US and European addresses. You can try it right on http://www.loquisoft.com/index.php?page=8

3
ответ дан 24 November 2019 в 00:35
поделиться

Try www.address-parser.com. Мы используем их веб-сервис, который вы можете протестировать онлайн

6
ответ дан 24 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

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