Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Разбор полезного адреса улицы, города, штата, Zip из строки
Проблема: у меня есть поле адреса из базы данных Access, которая была преобразована в Sql Server 2005. В этом поле есть все, что находится в одном поле. Мне нужно разобрать отдельные разделы адреса на соответствующие поля в нормализованной таблице. Мне нужно сделать это примерно для 4000 записей, и это должно быть повторяемо.
Предубеждения:
Предположим, что адрес в US (на данный момент)
предположим, что входная строка иногда будет содержать адресата (лицо, к которому обращаются) и/или второй адрес улицы (например, номер B)
государства могут быть сокращены
Код zip может быть стандартным 5-значным или zip+4
в некоторых случаях есть опечатки
UPDATE: в ответ на поставленные вопросы, стандарты не были соблюдены повсеместно, мне нужно хранить индивидуальные значения, а не только геокод и ошибки означает опечатку (исправлено выше)
выборочные данные:
А. П. Кролл & Сын 2299 Льюис-Джорджтаун Hwy, Джорджтаун, DE 19947
11522 Шони-Роуд, Гринвуд DE 19950
144 Кингс-Хайвей, S.W. Дувр, DE 19901
Интегрированная Константа. Услуги 2 Penns Way Suite 405 New Castle, DE 19720
Humes Realty 33 Bridle Ridge Court, Льюис, DE 19958
Раскопки Николса 2742 Pulaski Hwy Newark, DE 19711
2284 Брин Сион Роуд, Смирна, DE 19904
VEI Dover Crossroads, LLC 1500 Serpentine Road, Suite 100 Baltimore MD 21
580 North Dupont Highway Dover, DE 19901
P.O. Вставка 778 Дувр, DE 19903
Я проделал большую работу по этому виду синтаксического анализа. Поскольку есть ошибки, вы не получите точность 100%, но есть несколько вещей, которые вы можете сделать, чтобы получить большую часть пути туда, а затем сделать визуальный тест BS. Вот общий подход к этому вопросу. Это не код, потому что писать его довольно академично, нет никаких странностей, просто много обработки строк.
(Теперь, когда вы опубликовали некоторые примеры данных, я внес некоторые незначительные изменения)
- Работайте в обратном направлении. Начните с кода zip, который будет ближе к концу, и в одном из двух известных форматов: XXXXX или XXXXX-XXXX. Если это не отображается, вы можете предположить, что находитесь в части города, штата, ниже.
- Следующая вещь, перед zip, будет состояние, и оно будет либо в двухбуквенном формате, либо в виде слов. Вы тоже знаете, что это будет - их всего 50 штук. Кроме того, вы можете озвучивать слова, чтобы помочь компенсировать орфографические ошибки.
- до этого-город, и он, вероятно , находится на той же линии, что и штат. Вы можете использовать базу данных с кодом zip для проверки города и штата на основе zip или, по крайней мере, использовать ее в качестве детектора BS.
- Адрес улицы, как правило, будет состоять из одной или двух строк. Вторая строка обычно будет номером люкса, если он есть, но это также может быть поле PO.
- Будет почти невозможно обнаружить имя в первой или второй строке, хотя если оно не имеет префикса с номером (или если оно имеет префикс "attn:" или "attention to:", это может дать вам подсказку о том, является ли это именем или адресной строкой.
Я надеюсь, что это немного поможет.
Я думаю, что аутсорсинг проблемы-это лучший вариант: отправить его в геокодер Google (или Yahoo). Геокодер возвращает не только lat/long (которые здесь не представляют интереса), но и богатый синтаксический анализ адреса, с заполненными полями, которые вы не отправляли (включая ZIP+4 и округ).
Например, разбор "1600 Amphitheatre Parkway, Mountain View, CA" дает
{
"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]
}
}
]
}
Теперь это для анализа!
Оригинальный плакат, вероятно, уже давно перешел, но я попытался перенести модуль Perl Geo::StreetAddress:US , используемый geocoder.us , на C#,, сбросив его на CodePlex, и думаю, что люди, столкнувшиеся с этим вопросом в будущем, могут найти его полезным:
На главной странице проекта я пытаюсь рассказать о его (очень реальных) ограничениях. Поскольку он не поддерживается базой данных USPS действительных уличных адресов, синтаксический анализ может быть неоднозначным, и он не может ни подтвердить, ни опровергнуть действительность данного адреса. Он может просто попытаться вытащить данные из строки.
Это предназначено для случая, когда вам нужно получить набор данных в основном в правильных полях или хотите предоставить ярлык для ввода данных (позволяя пользователям вставлять адрес в textbox, а не вкладывать между несколькими полями). Он не предназначен для проверки доставляемости адреса.
Он не пытается разобрать что-либо выше линии улицы, но, вероятно, можно было бы использовать regex, чтобы получить что-то достаточно близкое-я бы, вероятно, просто разорвал его на номере дома.
Я уже делал это в прошлом.
Либо сделайте это вручную (создайте хороший графический интерфейс, который поможет пользователю сделать это быстро), либо автоматизируйте его и проверьте по последней базе данных адресов (вы должны купить это) и вручную обработайте ошибки.
Ручная обработка займет около 10 секунд каждый, то есть вы можете сделать 3600/10 = 360 в час, так что 4000 должно занять у вас примерно 11-12 часа. Это даст вам высокую степень точности.
Для автоматизации вам нужна последняя база адресов US, и вы можете настроить свои правила против этого. Я предлагаю не увлекаться на regex (трудно поддерживать долгосрочность, так много исключений). Перейти на 90% матч против базы данных, сделать rest вручную.
Получите копию стандартов почтовой адресации (USPS)в http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf и обратите внимание, что она составляет более 130 страниц. Регексы, чтобы реализовать это, были бы орехами.
Для международных адресов все ставки отменяются. US-базированные работники не смогли бы подтвердить это.
Кроме того, можно использовать службу данных. Однако у меня нет никаких рекомендаций.
Кроме того: когда вы отправляете вещи по почте (это то, для чего они нужны, верно?) убедитесь, что вы положили "address correction requested" на конверт (в нужном месте) и обновили базу данных. (Мы сделали простой графический интерфейс для администратора, чтобы сделать это; человек, который на самом деле сортирует почту)
Наконец, когда вы очистили данные, ищите дубликаты.
После приведенного здесь совета я разработал следующую функцию в VB, которая создает проходимые, хотя и не всегда идеальные (если название компании и строка набора Даны, она объединяет набор и город) полезные данные. Пожалуйста, не стесняйтесь comment/refactor/yell на меня за нарушение одного из моих собственных правил и т. д.:
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 & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" возвращает:
2299 Lewes-Georgetown Hwy A. P. Croll & Son Georgetown DE 19947
Я работаю в домене обработки адресов уже около 5 лет, и там действительно нет серебряной пули. Правильное решение будет зависеть от значения данных. Если это не очень ценно, бросьте его через парсер, как предполагают другие ответы. Если это даже в какой-то степени ценно, вам определенно нужно, чтобы человек оценил/исправил все результаты парсера. Если вы ищете полностью автоматизированное, воспроизводимое решение, вы, вероятно, захотите поговорить с поставщиком коррекции адресов, таким как Group1 или Trillium.
SmartyStreets имеет новую функцию, которая извлекает адреса из произвольных входных строк. (Примечание: Я не работаю в SmartyStreets.)
Он успешно извлек все адреса из образца входных данных, приведенного в вопросе выше. (Кстати, только 9 из этих 10 адресов действительны.)
Вот некоторые из выходных данных:
А вот и CSV-форматированный вывод того же запроса:
ID,Start,End,Segment,Verified,Candidate,Firm,FirstLine,SecondLine,LastLine,City,State,ZIPCode,County,DpvFootnotes,DeliveryPointBarcode,Active,Vacant,CMRA,MatchCode,Latitude,Longitude,Precision,RDI,RecordType,BuildingDefaultIndicator,CongressionalDistrict,Footnotes
1,32,79,"2299 Lewes-Georgetown Hwy, Georgetown, DE 19947",N,,,,,,,,,,,,,,,,,,,,,,
2,81,119,"11522 Shawnee Road, Greenwood DE 19950",Y,0,,11522 Shawnee Rd,,Greenwood DE 19950-5209,Greenwood,DE,19950,Sussex,AABB,199505209226,Y,N,N,Y,38.82865,-75.54907,Zip9,Residential,S,,AL,N#
3,121,160,"144 Kings Highway, S.W. Dover, DE 19901",Y,0,,144 Kings Hwy,,Dover DE 19901-7308,Dover,DE,19901,Kent,AABB,199017308444,Y,N,N,Y,39.16081,-75.52377,Zip9,Commercial,S,,AL,L#
4,190,232,"2 Penns Way Suite 405 New Castle, DE 19720",Y,0,,2 Penns Way Ste 405,,New Castle DE 19720-2407,New Castle,DE,19720,New Castle,AABB,197202407053,Y,N,N,Y,39.68332,-75.61043,Zip9,Commercial,H,,AL,N#
5,247,285,"33 Bridle Ridge Court, Lewes, DE 19958",Y,0,,33 Bridle Ridge Cir,,Lewes DE 19958-8961,Lewes,DE,19958,Sussex,AABB,199588961338,Y,N,N,Y,38.72749,-75.17055,Zip7,Residential,S,,AL,L#
6,306,339,"2742 Pulaski Hwy Newark, DE 19711",Y,0,,2742 Pulaski Hwy,,Newark DE 19702-3911,Newark,DE,19702,New Castle,AABB,197023911421,Y,N,N,Y,39.60328,-75.75869,Zip9,Commercial,S,,AL,A#
7,341,378,"2284 Bryn Zion Road, Smyrna, DE 19904",Y,0,,2284 Bryn Zion Rd,,Smyrna DE 19977-3895,Smyrna,DE,19977,Kent,AABB,199773895840,Y,N,N,Y,39.23937,-75.64065,Zip7,Residential,S,,AL,A#N#
8,406,450,"1500 Serpentine Road, Suite 100 Baltimore MD",Y,0,,1500 Serpentine Rd Ste 100,,Baltimore MD 21209-2034,Baltimore,MD,21209,Baltimore,AABB,212092034250,Y,N,N,Y,39.38194,-76.65856,Zip9,Commercial,H,,03,N#
9,455,495,"580 North Dupont Highway Dover, DE 19901",Y,0,,580 N DuPont Hwy,,Dover DE 19901-3961,Dover,DE,19901,Kent,AABB,199013961803,Y,N,N,Y,39.17576,-75.5241,Zip9,Commercial,S,,AL,N#
10,497,525,"P.O. Box 778 Dover, DE 19903",Y,0,,PO Box 778,,Dover DE 19903-0778,Dover,DE,19903,Kent,AABB,199030778781,Y,N,N,Y,39.20946,-75.57012,Zip5,Residential,P,,AL,
Я был разработчиком, который изначально написал сервис. Алгоритм, который мы реализовали, немного отличается от любых конкретных ответов здесь, но каждый извлеченный адрес проверяется с помощью поиска адреса API, поэтому вы можете быть уверены, что он действителен или нет. Каждый проверенный результат гарантирован, но мы знаем, что другие результаты не будут идеальными, потому что, как было совершенно ясно показано в этой теме, адреса непредсказуемы, даже для людей иногда.
Это не решит вашу проблему, но если
вам нужны только данные lat/long для
эти адреса, Гугл Maps API
будем разбирать неформатированные адреса
достаточно хороший.
Это не решит вашу проблему, но если вам нужны только данные lat/long для эти адреса, Гугл Maps API будем разбирать неформатированные адреса достаточно хороший.
Хорошее предложение, в качестве альтернативы вы можете выполнить запрос CURL для каждого адреса в Google Maps, и он вернет правильно отформатированный адрес. От этого вы можете regex в свое удовольствие.
+1 по предложенному Джеймсом А. Розеном решению, поскольку оно хорошо сработало для меня, однако для завершителей этот сайт является увлекательным чтением и лучшей попыткой, которую я видел в документировании адресов по всему миру: http://www.columbia.edu/kermit/postal.html
Попробуйте www.address-parser.com . Мы используем их веб-сервис, который вы можете протестировать онлайн
Существуют ли вообще какие-либо стандарты в том, как записываются адреса? Например:
- Всегда ли существуют запятые или новые строки, отделяющие street1 от street2, город от штата от zip?
- Всегда ли прописаны типы адресов (дорога, улица, бульвар и т. д.)? всегда сокращенно? Некоторые из каждого?
- Определите "error".
Мой общий ответ - это серия регулярных выражений, хотя сложность этого зависит от ответа. И если нет никакой последовательности вообще, то вы можете достичь только частичного успеха с Regex (т. е. отфильтровать код и состояние zip) и должны будете сделать rest вручную (или, по крайней мере, пройти через rest очень тщательно, чтобы убедиться, что вы заметили ошибки).
Еще один запрос на образец данных.
Как уже упоминалось, я буду работать в обратном направлении от zip.
Как только у вас будет zip, я запрошу базу данных zip, сохраню результаты и удалю их & zip из строки.
Это оставит вас с беспорядком адреса. MOST (все?) адреса будут начинаться с числа, поэтому найдите первое вхождение числа в оставшейся строке и захватите все от него до (Нового) конца строки. Это будет ваш адрес. Все, что находится слева от этого номера, скорее всего, является адресатом.
Теперь вы должны иметь город, штат, & Zip, хранящиеся в таблице и, возможно, две строки, адресат и адрес. Для получения адреса проверьте наличие "Suite" или "Apt." и т.д. и разделите это на два значения (адресные строки 1 & 2).
Для адресата я бы взял последнее слово этой строки в качестве фамилии и поместил бы rest в поле первого имени. Если вы не хотите этого делать, вам нужно будет проверить приветствие (Мистер, Мисс, доктор и т. д.) в самом начале и сделать некоторые предположения, основанные на количестве пробелов относительно того, как составляется имя.
Я не думаю, что есть какой-либо способ, которым вы можете анализировать с точностью 100%.
На основе выборочных данных:
Я бы начал с конца веревки. Проанализируйте Zip-код (любой формат). Прочитайте конец до первого пробела. Если код Zip не был найден ошибка.
Затем обрежьте конец для пробелов и специальных символов (запятых)
Затем переходите к состоянию, снова используйте пробел в качестве разделителя. Возможно, использовать список поиска для проверки кодов состояний из 2 букв и полных имен состояний. Если не найдено ни одного допустимого состояния-ошибка.
Снова обрежьте пробелы и запятые с конца.
Город становится хитрым, я бы на самом деле использовал запятую здесь, рискуя получить слишком много данных в городе. Ищите запятую или начало строки.
Если у вас еще остались символы в строке, запихните все это в адресное поле.
Это не идеально, но это должно быть довольно хорошей отправной точкой.
Если это данные, введенные человеком, то вы потратите слишком много времени на попытки кодирования вокруг исключений.
Попробуй:
Регулярное выражение для извлечения кода zip
Zip поиск кода (через соответствующее правительство DB), чтобы получить правильный адрес
Попросите стажера вручную проверить соответствие новых данных старым
RecogniContact - это объект Windows COM, который анализирует US и европейские адреса. Вы можете попробовать его прямо на http://www.loquisoft.com/index.php?Страница=8
Возможно, вы захотите проверить это!! http://jgeocoder.sourceforge.net/parser.html действовал на меня как заклинание.
Этот тип проблемы трудно решить из-за лежащей в основе неоднозначности данных.
Вот решение на основе Perl, которое определяет рекурсивное дерево спуска grammar, основанное на регулярных выражениях для анализа многих допустимых комбинаций уличных адресов: http://search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua/EN/AddressParse.pm . Это включает в себя дополнительные свойства внутри адреса, такие как: 12 1-я Авеню N Suite # 2 где-то CA 12345 USA
Он похож на http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm , упомянутый выше, но также работает для адресов, которые не относятся к USA, таких как UK, Австралия и Канада.
Вот выходные данные для одного из ваших примеров адресов. Обратите внимание, что раздел имени сначала нужно будет удалить из "A. P. Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947", чтобы уменьшить его до "2299 Lewes-Georgetown Hwy, Georgetown, DE 19947". Это легко достигается путем удаления всех данных вплоть до первого числа, найденного в строке.
Non matching part ''
Error '0'
Error descriptions ''
Case all '2299 Lewes-Georgetown Hwy Georgetown DE 19947'
COMPONENTS ''
country ''
po_box_type ''
post_box ''
post_code '19947'
pre_cursor ''
property_identifier '2299'
property_name ''
road_box ''
street 'Lewes-Georgetown'
street_direction ''
street_type 'Hwy'
sub_property_identifier ''
subcountry 'DE'
suburb 'Georgetown'
Для разработчиков ruby или rails есть хороший gem доступный под названием street_address . Я использую его в одном из своих проектов, и он делает ту работу, которая мне нужна.
Единственная проблема, которая у меня была, когда адрес был в этом формате P. O. Box 1410 Durham, NC 27702 , он возвращал ноль, и поэтому мне пришлось заменить "P. O. Box" на " и после этого он смог разобрать его.
Я не знаю, насколько это осуществимо, но я не видел, чтобы это упоминалось, поэтому я решил пойти дальше и предложить это:
Если вы находитесь строго в US... получите огромную базу данных всех кодов zip, штатов, городов и улиц. А теперь поищите их в своих адресах. Вы можете проверить то, что нашли, проверив, существует ли, скажем, найденный вами город в найденном вами штате, или проверив, существует ли найденная вами улица в найденном вами городе. Если нет, то есть вероятность, что Джон-это не улица Джона, а имя адресата... В основном, получить максимум информации, которую вы можете, и проверить свои адреса по ней. Крайним примером может быть получение списка всех адресов в США A, а затем найти, какой из них имеет наиболее релевантное соответствие каждому из ваших адресов...
Существуют службы передачи данных, которые, получив код zip, выдадут вам список названий улиц в этом коде zip.
Используйте regex для извлечения Zip или состояния города-найти правильный или если ошибка получить оба. извлеките список улиц из источника данных , исправьте город и штат, а затем адрес улицы. Как только вы получите действительную адресную строку 1, город, штат и zip, вы можете сделать предположения относительно адресной строки 2..3
Есть javascript порт пакета perl Geo::StreetAddress::US: https://github.com/hassansin/parse-address . Он основан на regex и работает довольно хорошо.