Analyser l'adresse postale, la ville, l'état et le code postal utilisables à partir d'une chaîne [fermé]

131

Problème: J'ai un champ d'adresse d'une base de données Access qui a été convertie en Sql Server 2005. Ce champ a tout dans un seul champ. J'ai besoin d'analyser les sections individuelles de l'adresse dans leurs champs appropriés dans une table normalisée. Je dois le faire pour environ 4 000 enregistrements et il doit être reproductible.

Hypothèses:

  1. Supposons une adresse aux États-Unis (pour l'instant)

  2. supposons que la chaîne d'entrée contiendra parfois un destinataire (la personne adressée) et / ou une deuxième adresse postale (c'est-à-dire Suite B)

  3. les états peuvent être abrégés

  4. le code postal peut être standard à 5 chiffres ou zip + 4

  5. il y a des fautes de frappe dans certains cas

MISE À JOUR: En réponse aux questions posées, les normes n'ont pas été universellement suivies, j'ai besoin de stocker les valeurs individuelles, pas seulement le géocodage et les erreurs signifient une faute de frappe (corrigé ci-dessus)

Exemple de données:

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

  • 11522, chemin Shawnee, Greenwood DE 19950

  • 144 Kings Highway, SW Douvres, DE 19901

  • Constat intégré. Services 2 Penns Way Suite 405 New Castle, DE 19720

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

  • Nichols Excavation 2742 Pulaski Hwy Newark, DE 19711

  • 2284, chemin Bryn Zion, Smyrne, DE 19904

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

  • 580 North Dupont Highway Dover, DE 19901

  • PO Box 778 Dover, DE 19903

Rob Allen
la source
Quelques questions: 1. Des délimiteurs? 2. Quel est l'ordre des champs dans la chaîne? 3. Quel comportement voulez-vous en cas d'erreur de données (EG enfoncez l'adresse dans un seul champ de la table SQL, laissez les autres vides)
Jay Mooney
Bonne question et réponses très intéressantes. Le travail à rebours à partir du zip semble être un thème courant, mais si vous prenez des données brutes de clients, le zip peut ne pas être précis. J'imagine que la plupart des sites ont un nombre disproportionné d'adresses dans 90210 par exemple.
Kevin Williams
4
@Kevin: Oui, parce que vous, les Américains, aimez nous verrouiller les Canadiens en exigeant un code "zip", et en n'acceptant pas nos codes postaux, nous obligeant ainsi à entrer des bêtises pour contourner le système .... malheureusement, le seul zip que je sais est 90210 :-) Edit: Nevermind ... vous habitez apparemment à quelques kilomètres de moi en Colombie-Britannique. Vous faites probablement la même chose alors :-P
mpen
2
Voir cette question SO pour un aperçu détaillé de cela.
Matt

Réponses:

118

J'ai beaucoup travaillé sur ce genre d'analyse. Parce qu'il y a des erreurs, vous n'obtiendrez pas une précision de 100%, mais il y a quelques choses que vous pouvez faire pour obtenir la plus grande partie du chemin, puis faire un test BS visuel. Voici la façon générale de procéder. Ce n'est pas du code, car c'est assez académique de l'écrire, il n'y a pas de bizarrerie, juste beaucoup de manipulation de chaînes.

(Maintenant que vous avez publié des exemples de données, j'ai apporté quelques modifications mineures)

  1. Travaillez en arrière. Commencez par le code postal, qui sera vers la fin, et dans l'un des deux formats connus: XXXXX ou XXXXX-XXXX. Si cela n'apparaît pas, vous pouvez supposer que vous êtes dans la partie ville, état, ci-dessous.
  2. La prochaine chose, avant le zip, sera l'état, et ce sera soit dans un format de deux lettres, soit sous forme de mots. Vous savez ce que ce sera aussi - il n'y en a que 50. En outre, vous pouvez soundex les mots pour aider à compenser les fautes d'orthographe.
  3. avant cela, c'est la ville, et c'est probablement sur la même ligne que l'État. Vous pouvez utiliser une base de données de codes postaux pour vérifier la ville et l'état en fonction du zip, ou au moins l'utiliser comme détecteur BS.
  4. L'adresse de la rue sera généralement une ou deux lignes. La deuxième ligne sera généralement le numéro de suite s'il y en a un, mais cela peut aussi être une boîte postale.
  5. Il sera presque impossible de détecter un nom sur la première ou la deuxième ligne, mais s'il n'est pas précédé d'un nombre (ou s'il est précédé d'un "attn:" ou "attention to:", cela pourrait vous donner un indice comme à savoir s'il s'agit d'un nom ou d'une ligne d'adresse.

J'espère que cela aide un peu.

Tim Sullivan
la source
14
S'il est vrai qu'il y a 50 États, l'USPS dit qu'il y a 59 abréviations à deux lettres dans le domaine du service postal des États-Unis, 65 si vous comptez les forces armées américaines. usps.com/send/official-abbreviations.htm
Mike Sherrill 'Cat Recall' le
17
"Seulement 50" était pour indiquer qu'il y a un assez petit nombre. Ce n'est peut-être «que 65 ans», mais ce n'est pas important pour résoudre le problème en question.
Tim Sullivan
4
Cet algorithme est également détaillé dans la publication USPS 28
Matt
92

Je pense que l'externalisation du problème est le meilleur pari: envoyez-le au géocodeur de Google (ou Yahoo). Le géocodeur renvoie non seulement le lat / long (qui ne sont pas intéressants ici), mais également une analyse approfondie de l'adresse, avec des champs remplis que vous n'avez pas envoyés (y compris ZIP + 4 et comté).

Par exemple, l'analyse de "1600 Amphitheatre Parkway, Mountain View, CA" donne

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

Maintenant c'est analysable!

James A. Rosen
la source
4
Puisqu'il s'agit d'un processus par lots, je suggérerais également d'utiliser un pool de threads pour effectuer le géocodage afin que vous puissiez soumettre plusieurs adresses à la fois (Google prend-il en charge une interface de traitement par lots de quelque nature que ce soit?)
David
Cela n'aiderait pas vraiment avec la ligne d'adresse deux (pinte 5 dans la question)
Christopher Mahan
71
Les conditions de service sont souvent ici un facteur limitant pour les utilisations commerciales et / ou non publiques.
Jay
C'est une bonne solution mais il existe des cas extrêmes pour lesquels Google / Yahoo ne renvoie pas de résultats, par exemple de nouvelles adresses et adresses qui manquent tout simplement dans leur base de données.
Peter DeWeese
ce serait une bonne solution "SI" google n'a pas limité les appels par lots à leurs API MAPS
Hector
25

L'affiche originale a probablement évolué depuis longtemps, mais j'ai tenté de porter le module Perl Geo :: StreetAddress: US utilisé par geocoder.us vers C #, vidé sur CodePlex et je pense que les gens qui trébucheront sur cette question à l'avenir pourraient trouvez cela utile:

Analyseur d'adresses aux États-Unis

Sur la page d'accueil du projet, j'essaye de parler de ses limites (bien réelles). Puisqu'il n'est pas soutenu par la base de données USPS des adresses de rue valides, l'analyse peut être ambiguë et elle ne peut ni confirmer ni nier la validité d'une adresse donnée. Il peut simplement essayer d'extraire des données de la chaîne.

Il est conçu pour le cas où vous avez besoin d'obtenir un ensemble de données principalement dans les bons champs, ou que vous souhaitez fournir un raccourci vers la saisie de données (permettant aux utilisateurs de coller une adresse dans une zone de texte plutôt que de tabuler entre plusieurs champs). Il n'est pas destiné à vérifier la délivrabilité d'une adresse.

Il n'essaie pas d'analyser quoi que ce soit au-dessus de la ligne de rue, mais on pourrait probablement se passer de l'expression régulière pour obtenir quelque chose de raisonnablement proche - je le casserais probablement au numéro de la maison.

Nicolas Piasecki
la source
17

SmartyStreets a une nouvelle fonctionnalité qui extrait les adresses des chaînes d'entrée arbitraires. (Remarque: je ne travaille pas chez SmartyStreets.)

Il a réussi à extraire toutes les adresses de l'exemple d'entrée donné dans la question ci-dessus. (À propos, seules 9 de ces 10 adresses sont valides.)

Voici quelques-uns des résultats:entrez la description de l'image ici

Et voici la sortie au format CSV de cette même requête:

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,

J'étais le développeur qui a initialement écrit le service. L'algorithme que nous avons implémenté est un peu différent de toute réponse spécifique ici, mais chaque adresse extraite est vérifiée par rapport à l'API de recherche d'adresse, vous pouvez donc être sûr qu'elle est valide ou non. Chaque résultat vérifié est garanti, mais nous savons que les autres résultats ne seront pas parfaits car, comme cela a été clairement expliqué dans ce fil, les adresses sont imprévisibles, même pour les humains parfois.

Mat
la source
2
Smartystreets est incroyablement bon dans ce qu'ils font. Très heureux d'apprendre qu'il s'agit d'une API qu'ils prennent en charge.
ftrotter
16

J'ai fait ça dans le passé.

Soit faites-le manuellement (créez une belle interface graphique qui aide l'utilisateur à le faire rapidement), soit automatisez-le et comparez-le à une base de données d'adresses récente (vous devez l'acheter) et gérez manuellement les erreurs.

La manipulation manuelle prendra environ 10 secondes chacune, ce qui signifie que vous pouvez faire 3600/10 = 360 par heure, donc 4000 devrait vous prendre environ 11-12 heures. Cela vous donnera un taux de précision élevé.

Pour l'automatisation, vous avez besoin une base de données d'adresses américaine récente et ajustez vos règles par rapport à cela. Je suggère de ne pas faire de fantaisie sur l'expression régulière (difficile à maintenir à long terme, tant d'exceptions). Optez pour 90% de correspondance avec la base de données, faites le reste manuellement.

Obtenez une copie des normes d'adressage postal (USPS) à http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf et notez qu'il fait plus de 130 pages. Des expressions régulières pour mettre en œuvre ce serait fou.

Pour les adresses internationales, tous les paris sont ouverts. Les travailleurs basés aux États-Unis ne seraient pas en mesure de valider.

Vous pouvez également utiliser un service de données. Je n'ai cependant aucune recommandation.

De plus: lorsque vous envoyez le contenu par courrier (c'est pour ça, non?), Assurez-vous de mettre "correction d'adresse demandée" sur l'enveloppe (au bon endroit) et mettez à jour la base de données. (Nous avons créé une interface graphique simple pour que la personne de la réception le fasse; la personne qui trie le courrier)

Enfin, lorsque vous avez nettoyé les données, recherchez les doublons.

Christopher Mahan
la source
14

Après les conseils ici, j'ai conçu la fonction suivante dans VB qui crée des données utilisables passables, bien que pas toujours parfaites (si un nom d'entreprise et une ligne de suite sont donnés, cela combine la suite et la ville) des données utilisables. N'hésitez pas à commenter / refactoriser / me crier dessus pour avoir enfreint l'une de mes propres règles, etc.:

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

Le passage de la parseAddressfonction "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" renvoie:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947
Rob Allen
la source
13

Je travaille dans le domaine du traitement d'adresses depuis environ 5 ans maintenant, et il n'y a vraiment pas de solution miracle. La bonne solution dépendra de la valeur des données. Si ce n'est pas très utile, lancez-le dans un analyseur comme le suggèrent les autres réponses. Si c'est même un peu utile, vous aurez certainement besoin d'un humain pour évaluer / corriger tous les résultats de l'analyseur. Si vous recherchez une solution entièrement automatisée et reproductible, vous voudrez probablement parler à un fournisseur de correction d'adresse comme Group1 ou Trillium.

Nicolas Trandem
la source
8

Cela ne résoudra pas votre problème, mais si vous n'aviez besoin que de données lat / long pour ces adresses, l'API Google Maps analysera assez bien les adresses non formatées.

Bonne suggestion, vous pouvez également exécuter une requête CURL pour chaque adresse sur Google Maps et il renverra l'adresse correctement formatée. À partir de là, vous pouvez regex au contenu de votre cœur.

Kevin
la source
7

+1 sur la solution suggérée par James A. Rosen car elle a bien fonctionné pour moi, mais pour les completistes, ce site est une lecture fascinante et la meilleure tentative que j'ai vue pour documenter les adresses dans le monde entier: http://www.columbia.edu/kermit /postal.html

Weston
la source
6

Existe-t-il des normes dans la manière dont les adresses sont enregistrées? Par exemple:

  1. Y a-t-il toujours des virgules ou des nouvelles lignes séparant street1 de street2 de la ville de l'état du zip?
  2. Les types d'adresses (route, rue, boulevard, etc.) sont-ils toujours précisés? toujours abrégé? Certains de chacun?
  3. Définissez «erreur».

Ma réponse générale est une série d'expressions régulières, bien que la complexité de cela dépende de la réponse. Et s'il n'y a pas du tout de cohérence, vous ne pourrez peut-être réussir que partiellement avec un Regex (c'est-à-dire: filtrer le code postal et l'état) et devrez faire le reste à la main (ou au moins passer par le reste très soigneusement pour vous assurer de repérer les erreurs).

Yaakov Ellis
la source
6

Une autre demande d'échantillons de données.

Comme cela a été mentionné, je travaillerais à l'envers à partir du zip.

Une fois que vous avez un zip, j'interroge une base de données zip, stocke les résultats et les supprime et le zip de la chaîne.

Cela vous laissera avec le désordre d'adresse. La plupart des adresses (toutes?) Commenceront par un nombre, alors trouvez la première occurrence d'un nombre dans la chaîne restante et récupérez tout ce qui va de là jusqu'à la (nouvelle) fin de la chaîne. Ce sera votre adresse. Tout ce qui se trouve à gauche de ce numéro est probablement un destinataire.

Vous devriez maintenant avoir la ville, l'état et le code postal stockés dans une table et éventuellement deux chaînes, le destinataire et l'adresse. Pour l'adresse, vérifiez l'existence de "Suite" ou "Apt." etc. et divisez cela en deux valeurs (lignes d'adresse 1 et 2).

Pour le destinataire, je lancerais et saisirais le dernier mot de cette chaîne comme nom de famille et placerais le reste dans le champ du prénom. Si vous ne voulez pas faire cela, vous devrez vérifier les salutations (M., Mme, Dr, etc.) au début et faire des hypothèses basées sur le nombre d'espaces quant à la façon dont le nom est composé.

Je ne pense pas qu'il soit possible d'analyser avec une précision de 100%.

Mandrin
la source
6

Essayez www.address-parser.com . Nous utilisons leur service Web, que vous pouvez tester en ligne

Nous savons
la source
1
Cela fonctionne bien pour quelque chose comme la recherche d'une adresse dans un grand document html. Je souhaite juste qu'ils aient une interface REST et non SOAP. Merci d'avoir partagé ce lien.
jspooner
1
Si vous êtes affilié à eux, vous êtes tenu de le divulguer.
Matt
1
Ce serait bien s'ils donnent une estimation de prix plutôt que d'exiger que je leur dise à quel point leur service est précieux avant de donner un prix.
Grille
5

Sur la base des exemples de données:

  1. Je commencerais à la fin de la chaîne. Analysez un code postal (quel que soit le format). Lisez la fin du premier espace. Si aucun code postal n'a été trouvé Erreur.

  2. Coupez ensuite la fin pour les espaces et les caractères spéciaux (virgules)

  3. Ensuite, passez à l'état, utilisez à nouveau l'espace comme délimiteur. Peut-être utiliser une liste de recherche pour valider les codes d'état à 2 lettres et les noms d'état complets. Si aucun état valide trouvé, erreur.

  4. Coupez à nouveau les espaces et les virgules à partir de la fin.

  5. La ville devient délicate, j'utiliserais en fait une virgule ici, au risque d'avoir trop de données dans la ville. Recherchez la virgule ou le début de la ligne.

  6. Si vous avez encore des caractères dans la chaîne, placez tout cela dans un champ d'adresse.

Ce n'est pas parfait, mais cela devrait être un très bon point de départ.

Jay Mooney
la source
4

S'il s'agit de données saisies par l'homme, vous passerez trop de temps à essayer de coder autour des exceptions.

Essayer:

  1. Expression régulière pour extraire le code postal

  2. Recherche de code postal (via la base de données gouvernementale appropriée) pour obtenir l'adresse correcte

  3. Demandez à un stagiaire de vérifier manuellement que les nouvelles données correspondent aux anciennes

engtech
la source
3

Cela ne résoudra pas votre problème, mais si vous n'aviez besoin que de données lat / long pour ces adresses, l'API Google Maps analysera assez bien les adresses non formatées.

pix0r
la source
3

RecogniContact est un objet Windows COM qui analyse les adresses américaines et européennes. Vous pouvez l'essayer directement sur http://www.loquisoft.com/index.php?page=8


la source
RecogniContact semble être fermé au public. L'accès nécessite l'envoi d'un formulaire de contact, mais il n'y a pas de réponse. Peut-être que quelqu'un d'autre sait comment les contacter.
Luke Van le
3

Ce type de problème est difficile à résoudre en raison des ambiguïtés sous-jacentes des données.

Voici une solution basée sur Perl qui définit un arbre de grammaire de descente récursive basé sur des expressions régulières pour analyser de nombreuses combinaisons valides d'adresses de rue: http://search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua /FR/AddressParse.pm . Cela inclut les sous-propriétés dans une adresse telle que: 12 1st Avenue N Suite # 2 Somewhere CA 12345 USA

Il est similaire à http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm mentionné ci-dessus, mais fonctionne également pour les adresses qui ne sont pas des États-Unis, comme le Royaume-Uni, l'Australie et Canada.

Voici la sortie de l'un de vos exemples d'adresses. Notez que la section de nom devrait d'abord être supprimée de «AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947» pour la réduire à «2299 Lewes-Georgetown Hwy, Georgetown, DE 19947». Ceci est facilement réalisé en supprimant toutes les données jusqu'au premier nombre trouvé dans la chaîne.

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'
Kim Ryan
la source
2

Puisqu'il y a risque d'erreur dans le mot, pensez à utiliser SOUNDEX combiné avec l'algorithme LCS pour comparer des chaînes, cela vous aidera beaucoup!

anand
la source
2

en utilisant l'API google

$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);
komal
la source
1
C'est probablement contraire aux conditions de service, mais il semble que cela devrait fonctionner - bien que la relecture de la question ne corresponde pas exactement aux exigences.
Jamie Bull
2

Pour les développeurs de ruby ​​ou de rails, il existe un joli joyau appelé street_address . Je l'ai utilisé sur l'un de mes projets et il fait le travail dont j'ai besoin.

Le seul problème que j'ai eu était chaque fois qu'une adresse était dans ce format, P. O. Box 1410 Durham, NC 27702 elle retournait nil et j'ai donc dû remplacer "PO Box" par '' et après cela, il a pu l'analyser.

Sachin Prasad
la source
Le lien vers le module ci-dessus est cassé, utilisez plutôt ceci: search.cpan.org/~kimryan/Lingua-EN-AddressParse
Kim Ryan
1

Il existe des services de données qui, avec un code postal, vous donneront la liste des noms de rue dans ce code postal.

Utilisez une expression régulière pour extraire le code postal ou l'état de la ville - trouvez le bon ou si une erreur récupère les deux. extraire la liste des rues d'une source de données Corrigez la ville et l'état, puis l'adresse postale. Une fois que vous avez obtenu une ligne d'adresse 1, une ville, un état et un code postal valides, vous pouvez faire des hypothèses sur la ligne d'adresse 2..3

AdamSane
la source
1

Je ne sais pas à quel point ce serait FAISABLE, mais je n'ai pas vu cela mentionné, alors j'ai pensé que j'irais de l'avant et suggérerais ceci:

Si vous êtes strictement aux États-Unis ... obtenez une énorme base de données de tous les codes postaux, états, villes et rues. Recherchez-les maintenant dans vos adresses. Vous pouvez valider ce que vous trouvez en testant si, par exemple, la ville que vous avez trouvée existe dans l'état que vous avez trouvé, ou en vérifiant si la rue que vous avez trouvée existe dans la ville que vous avez trouvée. Sinon, il y a de fortes chances que John ne soit pas pour la rue de John, mais c'est le nom du destinataire ... Fondamentalement, obtenez le plus d'informations possible et vérifiez vos adresses par rapport à celle-ci. Un exemple extrême serait d'obtenir UNE LISTE DE TOUTES LES ADRESSES AUX ÉTATS-UNIS DE A, puis de trouver celle qui correspond le mieux à chacune de vos adresses ...

Shawn
la source