Phân tích địa chỉ đường phố có thể sử dụng, Thành phố, Bang, Zip từ một chuỗi [đã đóng]


131

Vấn đề: Tôi có một trường địa chỉ từ cơ sở dữ liệu Access đã được chuyển đổi sang Sql Server 2005. Trường này có tất cả mọi thứ trong một trường. Tôi cần phân tích các phần riêng lẻ của địa chỉ thành các trường thích hợp của chúng trong một bảng được chuẩn hóa. Tôi cần phải làm điều này cho khoảng 4.000 hồ sơ và nó cần phải được lặp lại.

Giả định:

  1. Giả sử một địa chỉ ở Mỹ (hiện tại)

  2. giả sử rằng chuỗi đầu vào đôi khi sẽ chứa một người nhận (người được đánh địa chỉ) và / hoặc địa chỉ đường phố thứ hai (tức là Suite B)

  3. tiểu bang có thể được viết tắt

  4. mã zip có thể là 5 chữ số tiêu chuẩn hoặc zip + 4

  5. có lỗi chính tả trong một số trường hợp

CẬP NHẬT: Để trả lời các câu hỏi được đặt ra, các tiêu chuẩn không được tuân theo phổ biến, tôi cần lưu trữ các giá trị riêng lẻ, không chỉ mã địa lý và lỗi có nghĩa là lỗi chính tả (đã sửa ở trên)

Dữ liệu mẫu:

  • AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947

  • 11522 Đường Shawnee, Greenwood DE 19950

  • 144 Kings Highway, SW Dover, DE 19901

  • Tích hợp Const. Dịch vụ 2 Pennsylvania Way Suite 405 Lâu đài mới, DE 19720

  • Tòa án Hume Realty 33 Bridle Ridge, Lewes, DE 19958

  • Khai quật Nichols 2742 Pulaski Hwy Newark, DE 19711

  • 2284 Đường Bryn Zion, Smyrna, DE 19904

  • Ngã tư VEI Dover, LLC 1500 Đường Serpentine, Suite 100 Baltimore MD 21

  • Dover đường cao tốc Bắc Dupont, DE 19901

  • PO Box 778 Dover, DE 19903


Vài câu hỏi: 1. Bất kỳ dấu phân cách? 2. Thứ tự trường trong chuỗi là gì? 3. Bạn muốn có hành vi gì trong trường hợp xảy ra lỗi dữ liệu (EG chuyển địa chỉ vào một trường trong bảng SQL, để trống những người khác)
Jay Mooney

Câu hỏi hay và câu trả lời rất thú vị. Làm việc ngược từ zip dường như là một chủ đề phổ biến, nhưng nếu bạn lấy dữ liệu thô từ khách hàng, zip có thể không chính xác. Tôi đoán rằng hầu hết các trang web có số lượng địa chỉ không tương xứng trong 90210 chẳng hạn.
Kevin Williams

4
@Kevin: Vâng, bởi vì người Mỹ của bạn thích khóa người Canada bằng cách yêu cầu mã "zip" và không chấp nhận mã bưu chính của chúng tôi, do đó buộc chúng tôi phải nhập một số jibberish để bỏ qua hệ thống .... thật không may, chỉ có tôi biết là 90210 :-) Chỉnh sửa: Nevermind ... bạn dường như sống cách tôi vài km ở BC. Bạn cũng có thể làm điều tương tự sau đó :-P
mpen

2
Xem câu hỏi SO này để biết tổng quan mở rộng về điều này.
Matt

Câu trả lời:


118

Tôi đã thực hiện rất nhiều công việc về loại phân tích cú pháp này. Bởi vì có những lỗi bạn sẽ không nhận được độ chính xác 100%, nhưng có một vài điều bạn có thể làm để có được phần lớn cách đó, và sau đó làm xét nghiệm BS trực quan. Đây là cách chung để đi về nó. Nó không phải là mã, bởi vì nó khá hàn lâm để viết nó, không có gì lạ, chỉ là xử lý chuỗi nhiều.

(Bây giờ bạn đã đăng một số dữ liệu mẫu, tôi đã thực hiện một số thay đổi nhỏ)

  1. Làm việc lạc hậu. Bắt đầu từ mã zip, sẽ ở gần cuối và ở một trong hai định dạng đã biết: XXXXX hoặc XXXXX-XXXX. Nếu điều này không xuất hiện, bạn có thể giả sử bạn ở thành phố, phần tiểu bang, bên dưới.
  2. Điều tiếp theo, trước mã zip, sẽ là trạng thái và nó sẽ ở dạng hai chữ cái hoặc dưới dạng từ. Bạn cũng biết những thứ này sẽ là gì - chỉ có 50 trong số chúng. Ngoài ra, bạn có thể phát âm các từ để giúp bù cho lỗi chính tả.
  3. trước đó là thành phố và có lẽ nó nằm trên cùng một đường với tiểu bang. Bạn có thể sử dụng cơ sở dữ liệu mã zip để kiểm tra thành phố và tiểu bang dựa trên mã zip hoặc ít nhất sử dụng nó làm máy dò BS.
  4. Địa chỉ đường phố thường sẽ là một hoặc hai dòng. Dòng thứ hai thường sẽ là số bộ nếu có, nhưng cũng có thể là hộp PO.
  5. Sẽ gần như không thể phát hiện tên trên dòng đầu tiên hoặc thứ hai, mặc dù nếu nó không có tiền tố với một số (hoặc nếu nó có tiền tố là "attn:" hoặc "chú ý đến:" thì nó có thể cho bạn một gợi ý như cho dù đó là một tên hoặc một dòng địa chỉ.

Tôi hy vọng điều này sẽ giúp phần nào.


14
Mặc dù đúng là có 50 tiểu bang, USPS cho biết có 59 chữ viết tắt hai chữ cái trong miền của Dịch vụ Bưu chính Hoa Kỳ, 65 nếu bạn tính các lực lượng vũ trang Hoa Kỳ. usps.com/send/official-abenameviations.htmlm
Mike Sherrill 'Cat Recall'

17
"Chỉ 50" là để chỉ ra rằng có một con số khá nhỏ. Nó có thể là "chỉ 65", nhưng điều đó không quan trọng để giải quyết vấn đề trong tay.
Tim Sullivan

4
Thuật toán này cũng được trình bày chi tiết trong Ấn phẩm USPS 28
Matt

92

Tôi nghĩ rằng việc thuê ngoài vấn đề là đặt cược tốt nhất: gửi nó đến trình mã hóa địa lý của Google (hoặc Yahoo). Trình mã hóa địa lý không chỉ trả về lat / long (không quan tâm ở đây) mà còn phân tích địa chỉ phong phú, với các trường được điền vào mà bạn không gửi (bao gồm ZIP + 4 và quận).

Ví dụ: phân tích cú pháp "1600 Amphitheater 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]
      }
    }
  ]
}

Bây giờ có thể phân tích cú pháp!


4
Vì đây là quy trình theo đợt, tôi cũng khuyên bạn nên sử dụng nhóm luồng để thực hiện mã hóa địa lý để bạn có thể gửi nhiều địa chỉ cùng một lúc (google có hỗ trợ giao diện hàng loạt không?)
David

Điều này sẽ không thực sự hữu ích với dòng địa chỉ hai (pint 5 trong câu hỏi)
Christopher Mahan

71
Các điều khoản dịch vụ thường là một yếu tố hạn chế ở đây đối với việc sử dụng thương mại và / hoặc không công khai.
Jay

Đây là một giải pháp tốt nhưng có những trường hợp cạnh mà Google / Yahoo không trả về kết quả, ví dụ như các địa chỉ và địa chỉ mới bị thiếu trong cơ sở dữ liệu của họ.
Peter De Weese

đây sẽ là một giải pháp tốt "NẾU" google đã không giới hạn các cuộc gọi hàng loạt đến những người yêu thích MAPS của họ
Hector

25

Áp phích ban đầu có thể đã được chuyển từ lâu, nhưng tôi đã cố gắng chuyển Perl Geo :: StreetAddress: mô-đun Hoa Kỳ được sử dụng bởi geocoder.us sang C #, đổ nó lên CodePlex và nghĩ rằng mọi người sẽ vấp phải câu hỏi này trong tương lai thấy nó hữu ích:

Trình phân tích địa chỉ Hoa Kỳ

Trên trang chủ của dự án, tôi cố gắng nói về những hạn chế (rất thực tế) của nó. Vì nó không được hỗ trợ bởi cơ sở dữ liệu USPS của các địa chỉ đường phố hợp lệ, phân tích cú pháp có thể mơ hồ và nó không thể xác nhận cũng như từ chối tính hợp lệ của một địa chỉ nhất định. Nó chỉ có thể cố gắng kéo dữ liệu ra khỏi chuỗi.

Điều này có nghĩa là trong trường hợp bạn cần lấy một tập hợp dữ liệu chủ yếu trong các trường bên phải hoặc muốn cung cấp một lối tắt để nhập dữ liệu (cho phép người dùng dán địa chỉ vào hộp văn bản thay vì lập bảng giữa nhiều trường). Nó không có nghĩa là để xác minh khả năng cung cấp của một địa chỉ.

Nó không cố gắng phân tích bất cứ điều gì trên đường phố, nhưng người ta có thể đã vượt qua regex để có được một cái gì đó hợp lý - tôi có lẽ chỉ cần phá vỡ nó ở số nhà.


17

SmartyStreets có một tính năng mới trích xuất địa chỉ từ các chuỗi đầu vào tùy ý. (Lưu ý: Tôi không làm việc tại SmartyStreets.)

Nó trích xuất thành công tất cả các địa chỉ từ đầu vào mẫu được đưa ra trong câu hỏi trên. (Nhân tiện, chỉ có 9 trong số 10 địa chỉ đó là hợp lệ.)

Đây là một số đầu ra:nhập mô tả hình ảnh ở đây

Và đây là đầu ra được định dạng CSV của cùng một yêu cầu:

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,

Tôi là nhà phát triển ban đầu đã viết dịch vụ. Thuật toán chúng tôi triển khai hơi khác so với bất kỳ câu trả lời cụ thể nào ở đây, nhưng mỗi địa chỉ được trích xuất được xác minh dựa trên API tra cứu địa chỉ, vì vậy bạn có thể chắc chắn liệu nó có hợp lệ hay không. Mỗi kết quả được xác minh đều được đảm bảo, nhưng chúng tôi biết các kết quả khác sẽ không hoàn hảo bởi vì, như đã được làm rõ ràng rất nhiều trong chủ đề này, địa chỉ rất khó đoán, ngay cả đối với con người đôi khi.


2
Smartystreets cực kỳ giỏi trong những gì họ làm. Rất vui khi biết rằng đây là một API mà họ hỗ trợ.
ftrotter

16

Tôi đã làm điều này trong quá khứ.

Làm thủ công, (xây dựng một gui đẹp giúp người dùng thực hiện nhanh chóng) hoặc tự động hóa và kiểm tra cơ sở dữ liệu địa chỉ gần đây (bạn phải mua nó) và xử lý lỗi thủ công.

Việc xử lý thủ công sẽ mất khoảng 10 giây mỗi lần, nghĩa là bạn có thể thực hiện 3600/10 = 360 mỗi giờ, vì vậy 4000 sẽ khiến bạn mất khoảng 11-12 giờ. Điều này sẽ cung cấp cho bạn một tỷ lệ chính xác cao.

Để tự động hóa, bạn cần một cơ sở dữ liệu địa chỉ gần đây của Hoa Kỳ và điều chỉnh các quy tắc của bạn theo đó. Tôi đề nghị không nên ưa thích trên regex (khó duy trì lâu dài, rất nhiều trường hợp ngoại lệ). Kết hợp 90% với cơ sở dữ liệu, làm phần còn lại theo cách thủ công.

Hãy lấy một bản sao của Tiêu chuẩn địa chỉ bưu chính (USPS) tại http://pe.usps.gov/cpim/ftp/pub/Pub28/pub28.pdf và nhận thấy nó dài hơn 130 trang. Regexes để thực hiện đó sẽ là hạt.

Đối với các địa chỉ quốc tế, tất cả các cược đã tắt. Công nhân có trụ sở tại Hoa Kỳ sẽ không thể xác nhận.

Ngoài ra, sử dụng một dịch vụ dữ liệu. Tôi có, tuy nhiên, không có khuyến nghị.

Hơn nữa: khi bạn gửi nội dung trong thư (đúng là như vậy, phải không?) Hãy đảm bảo bạn đặt "yêu cầu chỉnh sửa địa chỉ" trên phong bì (ở đúng nơi) và cập nhật cơ sở dữ liệu. (Chúng tôi đã tạo một gui đơn giản cho người lễ tân để làm điều đó; người thực sự sắp xếp qua thư)

Cuối cùng, khi bạn đã xóa dữ liệu, hãy tìm các bản sao.


14

Sau lời khuyên ở đây, tôi đã nghĩ ra hàm sau trong VB tạo ra có thể qua được, mặc dù không phải lúc nào cũng hoàn hảo (nếu tên công ty và dòng bộ được đưa ra, nó kết hợp dữ liệu có thể sử dụng của bộ và thành phố). Xin vui lòng bình luận / refactor / la mắng tôi vì đã phá vỡ một trong những quy tắc của riêng tôi, v.v.:

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

Vượt qua parseAddresschức năng "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" trả về:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947

13

Tôi đã làm việc trong lĩnh vực xử lý địa chỉ được khoảng 5 năm và thực sự không có viên đạn bạc nào. Giải pháp chính xác sẽ phụ thuộc vào giá trị của dữ liệu. Nếu nó không có giá trị lắm, hãy ném nó qua một trình phân tích cú pháp như các câu trả lời khác gợi ý. Nếu nó thậm chí có giá trị, chắc chắn bạn sẽ cần phải có đánh giá của con người / sửa tất cả các kết quả của trình phân tích cú pháp. Nếu bạn đang tìm kiếm một giải pháp hoàn toàn tự động, có thể lặp lại, có lẽ bạn muốn nói chuyện với một nhà cung cấp chỉnh sửa địa chỉ như Group1 hoặc Trillium.


8

Điều này sẽ không giải quyết được vấn đề của bạn, nhưng nếu bạn chỉ cần dữ liệu lat / long cho các địa chỉ này, API Google Maps sẽ phân tích địa chỉ không được định dạng khá tốt.

Đề xuất tốt, ngoài ra, bạn có thể thực hiện yêu cầu CURL cho từng địa chỉ cho Google Maps và nó sẽ trả về địa chỉ được định dạng chính xác. Từ đó, bạn có thể regex đến nội dung trái tim của bạn.


7

+1 về giải pháp được đề xuất của James A. Rosen vì nó hoạt động tốt với tôi, tuy nhiên đối với những người hoàn thành thì trang web này là một bài đọc hấp dẫn và là nỗ lực tốt nhất tôi từng thấy trong các tài liệu địa chỉ trên toàn thế giới: http://www.columbia.edu/kermit /postal.html


6

Có bất kỳ tiêu chuẩn nào theo cách mà các địa chỉ được ghi lại không? Ví dụ:

  1. Luôn có dấu phẩy hoặc dòng mới ngăn cách street1 với street2 từ thành phố với tiểu bang từ zip?
  2. Các loại địa chỉ (đường, đường, đại lộ, v.v.) luôn được đánh vần? luôn luôn viết tắt? Một số của mỗi?
  3. Xác định "lỗi".

Câu trả lời chung của tôi là một loạt các Biểu thức chính quy, mặc dù độ phức tạp của điều này phụ thuộc vào câu trả lời. Và nếu hoàn toàn không có sự thống nhất, thì bạn chỉ có thể đạt được thành công một phần với Regex (nghĩa là: lọc mã zip và trạng thái) và sẽ phải làm phần còn lại bằng tay (hoặc ít nhất là trải qua phần còn lại cẩn thận để đảm bảo bạn phát hiện ra các lỗi).


6

Một yêu cầu khác cho dữ liệu mẫu.

Như đã đề cập, tôi sẽ làm việc ngược từ zip.

Khi bạn có mã zip, tôi sẽ truy vấn cơ sở dữ liệu zip, lưu trữ kết quả và xóa chúng & mã zip khỏi chuỗi.

Điều đó sẽ để lại cho bạn với địa chỉ lộn xộn. Các địa chỉ MOST (Tất cả?) Sẽ bắt đầu bằng một số, vì vậy hãy tìm sự xuất hiện đầu tiên của một số trong chuỗi còn lại và lấy mọi thứ từ đầu đến cuối (mới) của chuỗi. Đó sẽ là địa chỉ của bạn. Bất cứ điều gì ở bên trái của số đó có khả năng là một người nhận.

Bây giờ bạn sẽ có Thành phố, Bang và & Zip được lưu trữ trong một bảng và có thể là hai chuỗi, địa chỉ và địa chỉ. Để biết địa chỉ, hãy kiểm tra sự tồn tại của "Suite" hoặc "Apt." vv và chia thành hai giá trị (dòng địa chỉ 1 & 2).

Đối với người nhận, tôi sẽ chọn và lấy từ cuối cùng của chuỗi đó làm tên cuối cùng và đặt phần còn lại vào trường tên đầu tiên. Nếu bạn không muốn làm điều đó, bạn sẽ cần kiểm tra lời chào (Ông, Bà, Tiến sĩ, v.v.) khi bắt đầu và đưa ra một số giả định dựa trên số lượng khoảng trống như cách đặt tên tạo thành.

Tôi không nghĩ có bất kỳ cách nào bạn có thể phân tích với độ chính xác 100%.


6

Hãy thử www.address-parser.com . Chúng tôi sử dụng dịch vụ web của họ, mà bạn có thể kiểm tra trực tuyến


1
Điều này hoạt động tốt cho một cái gì đó như tìm một địa chỉ trong một tài liệu html lớn. Tôi chỉ ước họ có giao diện REST chứ không phải SOAP. Thx đã chia sẻ liên kết này.
jspooner

1
Nếu bạn liên kết với họ, bạn được yêu cầu tiết lộ điều đó.
Matt

1
Sẽ thật tuyệt nếu họ đưa ra ước tính giá thay vì yêu cầu tôi nói với họ rằng dịch vụ của họ có giá trị như thế nào trước khi đưa ra giá.
Máy nướng bánh mì

5

Dựa trên dữ liệu mẫu:

  1. Tôi sẽ bắt đầu ở cuối chuỗi. Phân tích mã Zip (định dạng). Đọc kết thúc không gian đầu tiên. Nếu không tìm thấy Mã Zip.

  2. Cắt phần cuối sau đó cho khoảng trắng và ký tự đặc biệt (dấu phẩy)

  3. Sau đó chuyển sang Trạng thái, một lần nữa sử dụng Dấu cách làm dấu phân cách. Có thể sử dụng danh sách tra cứu để xác thực 2 mã trạng thái chữ cái và tên trạng thái đầy đủ. Nếu không tìm thấy trạng thái hợp lệ, lỗi.

  4. Cắt không gian và dấu phẩy từ cuối một lần nữa.

  5. Thành phố trở nên khó khăn, tôi thực sự sẽ sử dụng dấu phẩy ở đây, có nguy cơ nhận quá nhiều dữ liệu trong thành phố. Tìm dấu phẩy, hoặc bắt đầu của dòng.

  6. Nếu bạn vẫn còn ký tự trong chuỗi, hãy chuyển tất cả số đó vào trường địa chỉ.

Điều này không hoàn hảo, nhưng nó sẽ là một điểm khởi đầu khá tốt.


4

Nếu đó là dữ liệu do con người nhập, thì bạn sẽ mất quá nhiều thời gian để cố gắng viết mã xung quanh các ngoại lệ.

Thử:

  1. Biểu thức chính quy để giải nén mã zip

  2. Tra cứu mã zip (thông qua DB chính phủ phù hợp) để có được địa chỉ chính xác

  3. Nhận một thực tập sinh để xác minh thủ công dữ liệu mới phù hợp với dữ liệu cũ


3

Điều này sẽ không giải quyết được vấn đề của bạn, nhưng nếu bạn chỉ cần dữ liệu lat / long cho các địa chỉ này, API Google Maps sẽ phân tích địa chỉ không được định dạng khá tốt.


3

RecogniContact là một đối tượng COM Windows phân tích địa chỉ Hoa Kỳ và Châu Âu. Bạn có thể dùng thử ngay trên http://www.loquisoft.com/index.php?page=8


RecogniContact dường như bị đóng cửa cho công chúng. Truy cập yêu cầu gửi biểu mẫu liên hệ, nhưng không có phản hồi. Có lẽ ai đó biết làm thế nào để liên lạc với họ.
Luke Van vào


3

Loại vấn đề này rất khó giải quyết vì sự mơ hồ tiềm ẩn trong dữ liệu.

Dưới đây là giải pháp dựa trên Perl xác định cây ngữ pháp gốc đệ quy dựa trên các biểu thức chính quy để phân tích nhiều kết hợp địa chỉ đường phố hợp lệ: http://search.cpan.org/~kimryan/Lingua-EN-AddressPude-1.20/lib/Lingua /EN/AddressPude.pm . Điều này bao gồm các thuộc tính phụ trong một địa chỉ, chẳng hạn như: 12 1st Avenue N Suite # 2 Somewhere CA 12345 USA

Nó tương tự như http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm đã đề cập ở trên, nhưng cũng hoạt động cho các địa chỉ không phải từ Hoa Kỳ, như Vương quốc Anh, Úc và Canada.

Đây là đầu ra cho một trong những địa chỉ mẫu của bạn. Lưu ý rằng phần tên sẽ cần được xóa trước tiên khỏi "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" để giảm nó thành "2299 Lewes-Georgetown Hwy, Georgetown, DE 19947". Điều này có thể dễ dàng đạt được bằng cách xóa tất cả dữ liệu lên đến số đầu tiên được tìm thấy trong chuỗi.

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'

2

Vì có khả năng xảy ra lỗi trong từ, hãy nghĩ về việc sử dụng SOUNDEX kết hợp với thuật toán LCS để so sánh các chuỗi, điều này sẽ giúp ích rất nhiều!


2

sử dụng google API

$d=str_replace(" ", "+", $address_url);
$completeurl ="http://maps.googleapis.com/maps/api/geocode/xml?address=".$d."&sensor=true"; 
$phpobject = simplexml_load_file($completeurl);
print_r($phpobject);

1
Điều đó có thể chống lại ToS nhưng có vẻ như nó sẽ hoạt động - mặc dù đọc lại câu hỏi, nó không thực sự phù hợp với yêu cầu.
Jamie Bull

2

Đối với các nhà phát triển ruby ​​hoặc rails, có một loại đá quý đẹp có tên là street_address . Tôi đã sử dụng điều này trên một trong những dự án của tôi và nó thực hiện công việc tôi cần.

Vấn đề duy nhất tôi gặp phải là bất cứ khi nào một địa chỉ ở định dạng này, P. O. Box 1410 Durham, NC 27702 nó trả về con số không và do đó tôi phải thay thế "Hộp thư bưu điện" bằng '' và sau đó, nó có thể phân tích cú pháp.


Liên kết đến mô-đun trên bị hỏng, thay vào đó hãy sử dụng mô-đun này: search.cpan.org/~kimryan/Lingua-EN-AddressPude
Kim Ryan

1

Có những dịch vụ dữ liệu được cung cấp mã zip sẽ cung cấp cho bạn danh sách tên đường phố trong mã zip đó.

Sử dụng biểu thức chính quy để trích xuất Zip hoặc Trạng thái thành phố - tìm chính xác hoặc nếu có lỗi cả hai. kéo danh sách các đường phố từ một nguồn dữ liệu Chỉnh sửa thành phố và tiểu bang, rồi đến địa chỉ đường phố. Khi bạn nhận được dòng Địa chỉ 1, thành phố, tiểu bang và zip hợp lệ, bạn có thể đưa ra các giả định trên dòng địa chỉ 2..3


1

Tôi không biết điều này sẽ xảy ra như thế nào, nhưng tôi chưa thấy điều này được đề cập nên tôi nghĩ tôi sẽ tiếp tục và đề xuất điều này:

Nếu bạn nghiêm túc ở Mỹ ... hãy lấy một cơ sở dữ liệu khổng lồ về tất cả các mã zip, tiểu bang, thành phố và đường phố. Bây giờ hãy tìm những thứ này trong địa chỉ của bạn. Bạn có thể xác thực những gì bạn tìm thấy bằng cách kiểm tra nếu, giả sử, thành phố bạn tìm thấy tồn tại ở tiểu bang bạn tìm thấy hoặc bằng cách kiểm tra xem đường phố bạn tìm thấy có tồn tại trong thành phố bạn tìm thấy hay không. Nếu không, rất có thể John không dành cho phố của John, nhưng là tên của người nhận ... Về cơ bản, hãy lấy thông tin nhiều nhất bạn có thể và kiểm tra địa chỉ của bạn để chống lại nó. Một ví dụ cực đoan là lấy một DANH SÁCH TẤT CẢ CÁC ĐỊA CHỈ TẠI MỸ CỦA A và sau đó tìm xem cái nào phù hợp nhất với từng địa chỉ của bạn ...


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.