Kullanılabilir Sokak Adresini, Şehir, Eyalet, Posta Kodunu bir dizeden ayrıştırın [kapalı]


131

Sorun: Access veritabanından Sql Server 2005'e dönüştürülmüş bir adres alanım var. Bu alanda her şey tek bir alanda var. Adresin ayrı bölümlerini normalleştirilmiş bir tabloda uygun alanlara ayrıştırmam gerekiyor. Bunu yaklaşık 4.000 kayıt için yapmam gerekiyor ve tekrarlanabilir olması gerekiyor.

Varsayımlar:

  1. ABD'de bir adres varsayalım (şimdilik)

  2. giriş dizesinin bazen bir muhatap (adreslenen kişi) ve / veya ikinci bir sokak adresi (yani Süit B) içereceğini varsayalım

  3. devletler kısaltılabilir

  4. posta kodu standart 5 haneli veya posta kodu + 4 olabilir

  5. bazı durumlarda yazım hataları var

GÜNCELLEME: Sorulan sorulara yanıt olarak, standartlar evrensel olarak takip edilmedi, yalnızca coğrafi kodu değil, tek tek değerleri de kaydetmem gerekiyor ve hatalar yazım hatası anlamına geliyor (yukarıda düzeltildi)

Örnek veri:

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

  • 11522 Shawnee Yolu, Greenwood DE 19950

  • 144 Kings Otoyolu, SW Dover, DE 19901

  • Entegre İnş. Hizmetler 2 Penns Way Suite 405 New Castle, DE 19720

  • Humes Realty 33 Bridle Ridge Mahkemesi, Lewes, DE 19958

  • Nichols Kazısı 2742 Pulaski Hwy Newark, DE 19711

  • 2284 Bryn Zion Yolu, Smyrna, DE 19904

  • VEI Dover Crossroads, LLC 1500 Serpentine Road, Suite 100 Baltimore MD 21

  • 580 Kuzey Dupont Otoban Kapısı, DE 19901

  • PO Box 778 Dover, DE 19903


Birkaç soru: 1. Sınırlayıcı var mı? 2. Dizedeki alan sırası nedir? 3. Bir veri hatası durumunda hangi davranışı istiyorsunuz (EG adresi SQL tablosundaki tek bir alana kaydırın, diğerlerini boş bırakın)
Jay Mooney

Güzel soru ve çok ilginç cevaplar. Zip'ten geriye doğru çalışmak yaygın bir tema gibi görünüyor, ancak müşterilerden ham veri alıyorsanız zip doğru olmayabilir. Örneğin, 90210'da çoğu sitenin orantısız bir adresi olduğunu tahmin ediyorum.
Kevin Williams

4
@Kevin: Evet, çünkü siz Amerikalılar bir "posta kodu" isteyerek ve posta kodlarımızı kabul etmeyerek Kanadalıları dışarıda bırakmaktan hoşlanıyorsunuz, bu yüzden bizi sistemi atlamak için biraz gevezelik yapmaya zorluyorsunuz .... ne yazık ki, tek zip I 90210 biliyorum :-) Düzenleme: Boşver ... Görünüşe göre BC'de benden birkaç kilometre uzakta yaşıyorsun. Muhtemelen aynı şeyi o zaman da
yaparsınız

2
Buna genişletilmiş bir genel bakış için bu SO sorusuna bakın .
Matt

Yanıtlar:


118

Bu tür bir çözümleme üzerinde çok çalıştım. Hatalar olduğu için% 100 doğruluk elde edemeyeceksiniz, ancak oraya en iyi şekilde ulaşmak için yapabileceğiniz birkaç şey var ve ardından görsel bir BS testi yapın. İşte bunu yapmanın genel yolu. Bu kod değil, çünkü onu yazmak oldukça akademik, tuhaflık yok, sadece çok sayıda ip kullanımı.

(Şimdi bazı örnek veriler gönderdiğinize göre, bazı küçük değişiklikler yaptım)

  1. Geriye doğru çalışın. Sona yakın olan posta kodundan ve bilinen iki biçimden birinde başlayın: XXXXX veya XXXXX-XXXX. Bu görünmezse, aşağıda şehir, eyalet bölümünde olduğunuzu varsayabilirsiniz.
  2. Bir sonraki şey, zip'ten önceki durum olacak ve bu ya iki harfli bir formatta ya da kelime olarak olacak. Bunların da ne olacağını biliyorsunuz - sadece 50 tane var. Ayrıca, yazım hatalarını telafi etmeye yardımcı olmak için kelimeleri seslendirebilirsiniz.
  3. ondan önce şehir ve muhtemelen eyalet ile aynı çizgide. Bir posta kodu veritabanı kullanabilirsiniz göre şehri ve eyaleti kontrol etmek için kullanabilir veya en azından bir BS dedektörü olarak kullanabilirsiniz.
  4. Sokak adresi genellikle bir veya iki satırdan oluşur. İkinci satır, varsa, genellikle daire numarası olacaktır, ancak bir posta kutusu da olabilir.
  5. İlk veya ikinci satırdaki bir adı tespit etmek neredeyse imkansız olacak, ancak öneki bir sayı yoksa (veya bir "attn:" veya "dikkat:" ön eki varsa, size şu şekilde bir ipucu verebilir: bir isim mi yoksa adres satırı mı olduğuna.

Umarım bu biraz yardımcı olur.


14
50 eyalet olduğu doğru olsa da, USPS, Amerika Birleşik Devletleri Posta Servisi alanında 59 iki harfli kısaltma olduğunu söylüyor, Amerikan silahlı kuvvetlerini sayarsanız 65. usps.com/send/official-abbreviations.htm
Mike Sherrill'in 'Cat Recall'

17
"Sadece 50", oldukça küçük bir sayı olduğunu belirtmek içindi. "Yalnızca 65" olabilir, ancak eldeki sorunu çözmek için bu önemli değil.
Tim Sullivan

4
Bu algoritma ayrıca USPS Yayını 28
Matta

92

Bence sorunu dış kaynak kullanmak en iyi bahis: Google (veya Yahoo) geocoder'a göndermek. Geocoder yalnızca enlem / boylamı (burada ilgilenilmeyen) değil, aynı zamanda göndermediğiniz alanları doldurarak (ZIP + 4 ve ilçe dahil) adresin zengin bir ayrıştırmasını da döndürür.

Örneğin, "1600 Amphitheatre Parkway, Mountain View, CA" ayrıştırıldığında

{
  "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]
      }
    }
  ]
}

Şimdi bu ayrıştırılabilir!


4
Bu bir toplu işlem olduğundan, aynı anda birden fazla adres gönderebilmeniz için coğrafi kodlamayı yapmak için bir iş parçacığı havuzu kullanmanızı da öneririm (google herhangi bir türden bir toplu arayüzü destekler mi?)
David

Bu, ikinci adres satırına pek yardımcı olmaz (soruda pint 5)
Christopher Mahan

71
Hizmet şartları burada genellikle ticari ve / veya kamuya açık olmayan kullanımlar için sınırlayıcı bir faktördür.
Jay

Bu iyi bir çözümdür, ancak Google / Yahoo'nun sonuç döndürmediği uç durumlar vardır, örneğin yeni adresler ve veritabanlarında eksik olan adresler.
Peter DeWeese

bu iyi bir çözüm olurdu "EĞER" Google, toplu aramaları MAPS API'leriyle sınırlamaz
Hector

25

Orijinal poster muhtemelen uzun süredir ilerledi, ancak geocoder.us tarafından kullanılan Perl Geo :: StreetAddress: ABD modülünü C # ' a taşımak için bir deneme yaptım, onu CodePlex'e döktüm ve gelecekte bu soruyla karşılaşan insanların yararlı bul:

ABD Adres Ayrıştırıcı

Projenin ana sayfasında, (çok gerçek) sınırlamalarından bahsetmeye çalışıyorum. Geçerli sokak adreslerinin USPS veritabanı tarafından desteklenmediğinden, ayrıştırma belirsiz olabilir ve belirli bir adresin geçerliliğini onaylayamaz veya reddedemez. Sadece dizeden veri çekmeyi deneyebilir.

Çoğunlukla doğru alanlarda bir dizi veri almanız gerektiğinde veya veri girişi için bir kısayol sağlamak istediğinizde (kullanıcıların bir adresi birden çok alan arasında sekme yapmak yerine bir metin kutusuna yapıştırmasına izin vermek) içindir. O edilir değil bir adres ulaştırılabilirliğini doğrulamak için geliyordu.

Sokak çizgisinin üstündeki herhangi bir şeyi ayrıştırmaya çalışmaz, ancak makul ölçüde yakın bir şey elde etmek için normal ifadeyle kandırılabilir - muhtemelen bunu sadece ev numarasından ayırırdım.


17

SmartyStreets, adresleri rastgele giriş dizelerinden çıkaran yeni bir özelliğe sahiptir. (Not: SmartyStreets'te çalışmıyorum.)

Yukarıdaki soruda verilen örnek girişten tüm adresleri başarıyla çıkardı. (Bu arada, bu 10 adresten sadece 9 tanesi geçerlidir.)

İşte bazı çıktılar:görüntü açıklamasını buraya girin

Ve işte aynı isteğin CSV biçimli çıktısı:

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,

Hizmeti ilk yazan geliştiriciydim. Uyguladığımız algoritma, buradaki belirli yanıtlardan biraz farklıdır, ancak çıkarılan her adres, adres arama API'sine göre doğrulanır, böylece geçerli olup olmadığından emin olabilirsiniz. Doğrulanmış her bir sonuç garantilidir, ancak diğer sonuçların mükemmel olmayacağını biliyoruz çünkü bu başlıkta çok açık bir şekilde belirtildiği gibi, bazen insanlar için bile adresler tahmin edilemez.


2
Smartystreets yaptıkları işte inanılmaz derecede iyidir. Bunun destekledikleri bir API olduğunu duyduğuma çok sevindim.
ftrotter

16

Bunu geçmişte yaptım.

Ya manuel olarak yapın (kullanıcının hızlı bir şekilde yapmasına yardımcı olan güzel bir kullanıcı arayüzü oluşturun) ya da otomatikleştirin ve yeni bir adres veritabanına göre kontrol edin (bunu satın almanız gerekir) ve hataları manuel olarak işleyin.

Manuel işlem her biri yaklaşık 10 saniye sürecektir, yani saatte 3600/10 = 360 yapabilirsiniz, bu nedenle 4000 sizi yaklaşık 11-12 saat sürer. Bu size yüksek bir doğruluk oranı verecektir.

Otomasyon için, yeni bir ABD adres veritabanına ihtiyacınız var ve kurallarınızı buna göre ayarlamalısınız. Normal ifadeyi beğenmemeyi öneririm (uzun vadede sürdürmek zordur, pek çok istisna vardır). Veritabanına karşı% 90 eşleşmeye gidin, gerisini manuel olarak yapın.

Posta Adresleme Standartlarının (USPS) bir kopyasını http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf adresinden alın ve 130+ sayfa uzunluğunda olduğuna dikkat edin. Uygulanacak normal ifadeler fındık olurdu.

Uluslararası adresler için tüm bahisler kapalıdır. ABD merkezli işçiler onaylayamayacak.

Alternatif olarak, bir veri servisi kullanın. Bununla birlikte, hiçbir tavsiyem yok.

Ayrıca: postayla gönderdiğiniz şeyleri (bunun için, değil mi?) Zarfa (doğru yerde) "adres düzeltmesi isteniyor" yazdığınızdan ve güncelleme yaptığınızdan emin olun ve veritabanını . (Ön büro görevlisinin bunu yapması için basit bir kullanıcı arayüzü yaptık; postayı gerçekten sıralayan kişi)

Son olarak, verileri temizlediğinizde, yinelenenleri arayın.


14

Buradaki tavsiyeden sonra, VB'de her zaman mükemmel olmasa da (bir şirket adı ve bir süit satırı verilirse, süit ve şehri birleştirir) kullanılabilir verileri fena oluşturan aşağıdaki işlevi tasarladım. Lütfen kendi kurallarımdan birini ihlal ettiğim için yorum yapmaktan / düzeltmekten / bağırmaktan çekinmeyin.

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

Geçme parseAddressfonksiyonu "AP Croll & Son 2299 Lewes-Georgetown Highway, Georgetown, DE 19947" döner:

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

13

Yaklaşık 5 yıldır adres işleme alanında çalışıyorum ve gerçekten sihirli bir değnek yok. Doğru çözüm, verilerin değerine bağlı olacaktır. Çok değerli değilse, diğer yanıtların önerdiği gibi bir ayrıştırıcıdan geçirin. Biraz değerli olsa bile, kesinlikle bir insanın ayrıştırıcının tüm sonuçlarını değerlendirmesi / düzeltmesi gerekir. Tam otomatik, tekrarlanabilir bir çözüm arıyorsanız, muhtemelen Group1 veya Trillium gibi bir adres düzeltme satıcısıyla konuşmak istersiniz.


8

Bu, sorununuzu çözmez, ancak bu adresler için yalnızca enlem / boylam verisine ihtiyacınız varsa, Google Haritalar API biçimlendirilmemiş adresleri oldukça iyi ayrıştıracaktır.

İyi bir öneri, alternatif olarak Google Haritalar'a her adres için bir CURL isteği yürütebilirsiniz ve bu, uygun şekilde biçimlendirilmiş adresi döndürecektir. Bundan, kalbinizin içeriğine regex yapabilirsiniz.



6

Adreslerin kaydedilme biçiminde herhangi bir standart var mı? Örneğin:

  1. Cadde1'i sokak2'den şehirden eyalet ve zip'den ayıran her zaman virgül veya yeni satır var mı?
  2. Adres türleri (yol, cadde, bulvar vb.) Her zaman yazılır mı? her zaman kısaltılmış mı? Her biri mi?
  3. "Hata" yı tanımlayın.

Genel cevabım, bir dizi Normal İfadedir, ancak bunun karmaşıklığı cevaba bağlıdır. Ve hiç tutarlılık yoksa, bir Regex ile yalnızca kısmi başarı elde edebilirsiniz (yani: posta kodunu ve durumu filtreleyerek) ve gerisini elle yapmanız (veya en azından geri kalanını çok fazla gözden geçirmeniz) hataları tespit ettiğinizden emin olmak için dikkatlice).


6

Örnek veriler için başka bir istek.

Bahsedildiği gibi, zip'ten geriye doğru çalışacaktım.

Bir zip'e sahip olduğunuzda, bir zip veritabanını sorgular, sonuçları depolar ve onları ve zip'i dizeden kaldırırdım.

Bu sizi adres karmaşasıyla baş başa bırakacaktır. ÇOĞU (Tümü?) Adresleri bir sayı ile başlayacaktır, bu nedenle kalan dizede bir sayının ilk geçtiği yeri bulun ve ondan dizenin (yeni) sonuna kadar her şeyi alın. Bu senin adresin olacak. Bu numaranın solundaki herhangi bir şey muhtemelen muhataptır.

Şimdi Şehir, Eyalet ve Posta Kodunu bir tabloda ve muhtemelen iki dizeye, muhatap ve adrese sahip olmalısınız. Adres için "Suite" veya "Apt" olup olmadığını kontrol edin. vb. ve bunu iki değere bölün (adres satırları 1 ve 2).

Muhatap için, bu dizenin son kelimesini soyadı olarak alır ve geri kalanını ad alanına koyardım. Bunu yapmak istemiyorsanız, başlangıçta selamlamayı (Bay, Bayan, Dr., vb.) Kontrol etmeniz ve adın nasıl olduğuna dair boşluk sayısına göre bazı varsayımlar yapmanız gerekir. yapılan.

% 100 doğrulukla ayrıştırmanın bir yolu olduğunu sanmıyorum.


6

Www.address-parser.com'u deneyin . Çevrimiçi olarak test edebileceğiniz web hizmetlerini kullanıyoruz


1
Bu, büyük bir html belgesinde bir adres bulmak gibi bir şey için işe yarar. Keşke SABUN yerine bir REST arayüzüne sahip olsalar. Bu bağlantıyı paylaşmak için teşekkürler.
jspooner

1
Onlara bağlıysanız, bunu açıklamanız gerekir.
Matt

1
Bir fiyat vermeden önce hizmetlerinin ne kadar değerli olduğunu söylememi talep etmek yerine bir fiyat tahmini vermeleri güzel olurdu.
Toaster

5

Örnek verilere göre:

  1. İpin sonunda başlardım. Posta kodunu ayrıştırın (her iki biçim). İlk boşluğun sonunu okuyun. Posta Kodu bulunamadı Hata.

  2. Boşluklar ve özel karakterler (virgül) için sonunu kırpın

  3. Ardından Durum'a geçin, yine sınırlayıcı olarak Boşluğu kullanın. Belki 2 harfli durum kodlarını ve tam durum adlarını doğrulamak için bir arama listesi kullanabilirsiniz. Geçerli bir durum yoksa, hata.

  4. Tekrar boşlukları ve virgülleri kesin.

  5. Şehir karmaşıklaşıyor, şehirde çok fazla veri alma riskine rağmen burada virgül kullanırdım. Virgül veya satırın başlangıcını arayın.

  6. Dizede hala karakteriniz varsa, hepsini bir adres alanına kaydırın.

Bu mükemmel değil, ancak oldukça iyi bir başlangıç ​​noktası olmalı.


4

İnsan tarafından girilen verilerse, istisnalar etrafında kodlamaya çalışırken çok fazla zaman harcarsınız.

Deneyin:

  1. Posta kodunu çıkarmak için normal ifade

  2. Doğru adresi almak için posta kodu araması (uygun devlet DB aracılığıyla)

  3. Yeni verilerin eski verilerle eşleştiğini manuel olarak doğrulamak için bir stajyer alın


3

Bu, sorununuzu çözmez, ancak bu adresler için yalnızca enlem / boylam verisine ihtiyacınız varsa, Google Haritalar API biçimlendirilmemiş adresleri oldukça iyi ayrıştıracaktır.


3

RecogniContact, ABD ve Avrupa adreslerini ayrıştıran bir Windows COM nesnesidir. Doğrudan http://www.loquisoft.com/index.php?page=8 adresinden deneyebilirsiniz.


RecogniContact halka kapalı görünüyor. Erişim bir iletişim formu göndermeyi gerektirir, ancak yanıt verilmez. Belki başka biri onlarla nasıl iletişime geçileceğini biliyordur.
Luke Van


3

Verilerdeki temel belirsizlikler nedeniyle bu tür bir sorunun çözülmesi zordur.

Burada, birçok geçerli sokak adresi kombinasyonunu ayrıştırmak için düzenli ifadeleri temel alan özyinelemeli bir dilbilgisi ağacını tanımlayan Perl tabanlı bir çözüm var: http://search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua /EN/AddressParse.pm . Bu, aşağıdaki gibi bir adresteki alt mülkleri içerir: 12 1st Avenue N Suite # 2 Somewhere CA 12345 USA

Benzer Http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm'yeYukarıda bahsedilen , ancak aynı zamanda Birleşik Krallık, Avustralya ve ABD'den olmayan adresler için de işe yarar. Kanada.

İşte örnek adreslerinizden birinin çıktısı. "2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" olarak azaltmak için ad bölümünün önce "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" den kaldırılması gerektiğine dikkat edin. Bu, dizede bulunan ilk sayıya kadar tüm verileri kaldırarak kolayca başarılır.

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

Sözcükte hata olasılığı olduğundan, dizeleri karşılaştırmak için SOUNDEX'i LCS algoritması ile birlikte kullanmayı düşünün, bu çok yardımcı olacaktır!


2

google API kullanarak

$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
Bu muhtemelen Hizmet Şartları'na aykırıdır, ancak işe yaraması gerektiği gibi görünüyor - soruyu yeniden okumanıza rağmen, gereksinimleri tam olarak karşılamıyor.
Jamie Bull

2

Ruby veya ray geliştiricileri için street_address adında güzel bir mücevher vardır . Bunu bir projemde kullanıyorum ve ihtiyacım olan işi yapıyor.

Sahip olduğum tek sorun, bir adres bu formatta olduğunda P. O. Box 1410 Durham, NC 27702 sıfır döndürmesiydi ve bu nedenle "Posta Kutusu" nu "" ile değiştirmek zorunda kaldım ve bundan sonra onu ayrıştırabildim.


Yukarıdaki modülün bağlantısı bozuk, bunun yerine şunu kullanın: search.cpan.org/~kimryan/Lingua-EN-AddressParse
Kim Ryan

1

Bir posta kodu verilen veri hizmetleri, o posta kodunda size sokak adlarının listesini verecektir.

Zip veya Şehir Eyaletini çıkarmak için bir normal ifade kullanın - doğru olanı bulun veya bir hata oluştuğunda her ikisini de alın. cadde listesini bir veri kaynağından alma Şehri ve eyaleti ve ardından sokak adresini düzeltin. Geçerli bir Adres satırı 1, şehir, eyalet ve posta kodu aldığınızda, adres satırı 2'de varsayımlarda bulunabilirsiniz.


1

Bunun NE KADAR UYGUN OLACAĞINI bilmiyorum, ancak bunun bahsedildiğini görmedim, bu yüzden devam edip şunu önereceğimi düşündüm:

Kesinlikle ABD'deyseniz ... tüm posta kodları, eyaletler, şehirler ve caddelerin bulunduğu devasa bir veritabanı edinin. Şimdi bunları adreslerinizde arayın. Bulduğunuz şeyi, bulduğunuz şehrin bulduğunuz eyalette bulunup bulunmadığını test ederek veya bulduğunuz caddenin bulduğunuz şehirde olup olmadığını kontrol ederek doğrulayabilirsiniz. Değilse, muhtemelen John, John'un caddesi için değil, muhatabın adıdır ... Temel olarak, alabileceğiniz en fazla bilgiyi alın ve adreslerinizi buna göre kontrol edin. Aşırı bir örnek, A'NIN ABD'DEKİ TÜM ADRESLERİN LİSTESİNİ almak ve ardından adreslerinizden her biri için hangisinin en uygun eşleşmeye sahip olduğunu bulmak olabilir ...


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.