Analyser utilisable Adresse, Ville, État, code Postal à partir d'une chaîne
Problème: j'ai un champ d'adresse à partir d'une base de données Access qui a été converti à Sql Server 2005. Ce domaine a tout dans un seul domaine. J'ai besoin d'analyser les différentes sections de l'adresse dans leurs champs dans une table normalisée. J'ai besoin de faire cela pour environ 4 000 enregistrements, et elle doit être reproductible.
Hypothèses:
-
Assumer une adresse aux états-unis (pour l'instant)
-
supposons que la chaîne d'entrée contient parfois un destinataire (la personne traitée) et/ou une deuxième adresse de la rue (c'est à dire de la Suite B)
-
états peut être abrégée de la
-
code postal pourrait être de série à 5 chiffres ou zip+4
-
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 suivie, j'ai besoin de besoin de stocker les valeurs individuelles, et pas seulement de géocodage et d'erreurs moyen de faute de frappe (corrigé ci-dessus)
Des Données De L'Échantillon:
-
A. P. Croll & Fils 2299 Lewes-Georgetown Autoroute, Georgetown, DE 19947
-
11522 Shawnee Route, Greenwood DE 19950
-
144 Route des Rois, s.-o. de Dover, DE 19901
-
Intégré Const. Services 2 Penns Façon Suite 405 New Castle, DE 19720
-
Humes Realty 33 Bride de la Crête de la Cour, Lewes, DE 19958
-
Nichols Excavation 2742 Pulaski l'Autoroute Newark, DE 19711
-
2284 Bryn Sion de la Route, de Smyrne, DE 19904
-
VEI Douvres Carrefour, LLC 1500 Serpentine Road, Suite 100 Baltimore MD 21
-
580 Nord Dupont Highway Dover, DE 19901
-
P. O. Box 778 Dover, DE 19903
- Quelques questions: 1. Les délimiteurs? 2. Qu'est-ce que l'ordre des champs dans la chaîne? 3. Ce comportement voulez-vous, dans le cas d'une erreur de données (E. G. pousser adresse dans un seul champ dans la table SQL, laissez les autres en blanc)
- Merci pour l'échantillon de données!
- Bonne question et les réponses très intéressantes. Travailler à rebours à partir de zip semble être un thème commun, mais si vous êtes en données brutes, le zip ne peut pas être exacte. Je suppose que la plupart des sites ont un nombre disproportionné d'adresses dans 90210, par exemple.
- Oui, parce que vous, les Américains, comme de nous enfermer Canadiens par l'exigence d'une "zip code", et de ne pas accepter nos codes postaux, ainsi, nous forçant à entrer dans certains jibberish de contourner le système.... malheureusement, le seul zip je sais, c'est 90210 🙂 Edit: Nevermind... apparemment vous avez vivent à quelques kilomètres de moi, en colombie-britannique. Vous avez probablement faire la même chose, trop 😛
- Voir ce DONC, la question en faveur d'un vaste panorama.
Vous devez vous connecter pour publier un commentaire.
J'ai fait beaucoup de travail sur ce type d'analyse. Parce qu'il y a des erreurs, vous ne pourrez pas obtenir une précision de 100%, mais il ya quelques choses que vous pouvez faire pour obtenir plus de chemin, et puis faire un visual BS test. Voici le chemin pour aller à ce sujet. Ce n'est pas le code, parce qu'il est assez académique à l'écrire, il n'y a pas quelque chose d'étrange, juste beaucoup de manipulation des chaînes.
(Maintenant que vous avez posté des exemples de données, j'ai fait quelques modifications mineures)
J'espère que cela aide un peu.
Je pense que l'externalisation du problème est la meilleure chose à faire: envoyer à Google (ou Yahoo) geocoder. Le geocoder renvoie non seulement le lat/long (qui ne sont pas d'intérêt ici), mais aussi une riche analyse de l'adresse, avec les champs remplis que vous n'avez pas envoyer (ZIP+4 et comté).
Par exemple, l'analyse des "1600 Amphitheatre Parkway, Mountain View, CA" donne
Maintenant c'est parseable!
L'affiche originale a probablement longtemps déplacé, mais j'ai pris un coup de couteau au portage de Perl Geo::StreetAddress:NOUS module utilisé par geocoder.nous à C#, sous-évaluées sur CodePlex, et pense que les gens tombent sur cette question dans l'avenir peuvent le trouver utile:
NOUS Analyseur Adresse
Sur le projet de la page d'accueil, j'ai essayé de parler de sa (très vrai) limitations. Car il n'est pas soutenu par l'USPS base de données valide l'adresse municipale, l'analyse peut être ambiguë et il ne peut pas confirmer ni infirmer la validité d'une adresse donnée. Il peut juste essayer de tirer des données de la chaîne.
Il est destiné pour le cas où vous avez besoin pour obtenir un ensemble de données principalement dans le droit des champs, ou que vous souhaitez fournir un raccourci à l'entrée de données (permettant aux utilisateurs de coller une adresse dans une zone de texte plutôt que de tabulation entre plusieurs champs). Il est pas signifiait pour vérifier la disponibilité d'une adresse.
Il ne cherche pas à analyser tout au-dessus de la rue, mais on pourrait sans doute diddle avec les regex pour obtenir quelque chose d'assez proche--je serais probablement casser juste à le numéro de la maison.
J'ai fait dans le passé.
Soit le faire manuellement, (construire une belle interface qui permet à l'utilisateur de le faire rapidement) ou automatisé et vérifier l'encontre d'un récent adresse de la base de données (vous devez acheter qu') manuellement et de gérer les erreurs.
Manutention manuelle prendra environ 10 secondes, ce qui signifie que vous pouvez faire 3600/10 = 360 par heure, de sorte 4000 devrait vous prendre environ 11 à 12 heures. Cela vous donnera un taux élevé de précision.
Pour l'automatisation, vous besoin une récente NOUS l'adresse de base de données, et de modifier vos règles contre. Je suggère de ne pas aller de fantaisie sur les regex (difficile à maintenir à long terme, de sorte que de nombreuses exceptions). Aller pour 90% match contre la base de données, faire le reste manuellement.
Faire obtenir une copie de la poste et de l'Adressage des Normes (USPS) à http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf et avis il est de 130 pages de long. Regexes à mettre en œuvre qui serait de noix.
Pour des adresses internationales, tous les paris sont éteints. Basée aux etats-unis les travailleurs ne seront pas en mesure de valider.
Vous pouvez également utiliser un service de données. J'ai, cependant, pas de recommandations.
En outre: lorsque vous ne envoyer des trucs par la poste (qu'est ce que c'est, non?) assurez-vous de mettre "correction de l'adresse demandée" sur l'enveloppe (au bon endroit) et mise à jour la base de données. (Nous avons fait une simple interface graphique pour la réception personne pour le faire; la personne qui trie le courrier)
Enfin, lorsque vous avez nettoyée de données, rechercher des doublons.
Après avis ici, j'ai élaboré la fonction suivante dans VB qui crée passable, bien que pas toujours parfait (si un nom de société et d'une suite de la courbe, il combine la suite et de la ville) de données utilisables. N'hésitez pas à commenter/refactor/crier à moi pour casser l'un de mes propres règles, etc.:
Passage de la
parseAddress
fonction "A. P. Croll & Fils 2299 Lewes-Georgetown Autoroute, Georgetown, DE 19947" retourne:J'ai travaillé dans l'adresse de traitement de domaine depuis environ 5 ans maintenant, et il est vraiment pas la panacée. La bonne solution va dépendre de la valeur des données. Si ce n'est pas très utile, le lancer à travers un analyseur comme d'autres réponses suggèrent. Si c'est encore un peu précieux, vous aurez certainement besoin d'avoir un homme évaluer et de corriger les résultats de l'analyseur. Si vous êtes à la recherche d'un entièrement automatisée et reproductible de la solution, vous voulez probablement parler à une correction de l'adresse du fournisseur comme Groupe1 ou Trillium.
SmartyStreets a une nouvelle fonction qui extrait les adresses de l'arbitraire des chaînes d'entrée. (Note: je n'ai pas de travail à la SmartyStreets.)
Il réussi à extraire toutes les adresses à partir de l'échantillon d'entrée donné dans la question ci-dessus. (Par ailleurs, seulement 9 de ces 10 adresses sont valides.)
Voici une partie de la sortie:
Et voici la sortie au format CSV de la même requête:
J'étais le développeur qui a écrit à l'origine du service. L'algorithme que nous avons mis en place est un peu différent des réponses ici, mais chaque extrait adresse est vérifiée à l'encontre de la recherche de l'adresse de l'API, de sorte que vous pouvez être sûr que si c'est valable ou pas. Chaque vérifié résultat est garanti, mais nous savons que les autres résultats ne sera pas parfait, parce que, comme cela a été fait clair dans ce fil, les adresses sont imprévisibles, même pour les humains parfois.
Bonne suggestion, vous pouvez exécuter une demande CURL pour chaque adresse à Google Maps et il sera de retour l'correctement formaté adresse. De cela, vous pouvez regex au contenu de votre coeur.
+1 sur James A. Rosen a suggéré la solution a bien fonctionné pour moi, mais pour completists ce site est une histoire fascinante et la meilleure tentative que j'ai vu dans la documentation des adresses dans le monde entier: http://www.columbia.edu/kermit/postal.html
Existe-il des normes à tous dans la façon dont les adresses sont enregistrées? Par exemple:
Ma réponse générale est une série d'Expressions Régulières, bien que la complexité de ce système dépend de la réponse. Et si il n'y a pas de cohérence à tous, alors vous ne pouvez être en mesure d'atteindre une réussite partielle avec une Regex (ie: le filtrage du code postal et de l'état) et devra faire le reste à la main (ou au moins aller à travers le reste très attentivement afin de bien repérer les erreurs).
Une autre demande pour des données de l'échantillon.
Comme il a été mentionné, je voudrais travailler à rebours à partir de la zip.
Une fois que vous avez un zip, je voudrais interroger un zip de base de données, de stocker les résultats, et de les supprimer & le zip de la chaîne.
Qui vous laisse l'adresse de désordre. La PLUPART (Tous?) des adresses de commencer avec un nombre afin de trouver la première occurrence d'un nombre dans le reste de la chaîne et de saisir tout l' (nouveau) à la fin de la chaîne. Qui sera votre adresse. Quelque chose à la gauche de ce nombre est probablement un destinataire.
Vous devriez maintenant avoir la Ville, l'État, & Zip stockées dans une table et peut-être de deux chaînes, le destinataire et l'adresse. Pour l'adresse, vérifier l'existence d'une "Suite" ou "Apt". etc. et la diviser en deux valeurs (lignes 1 & 2).
Pour le destinataire je punt et de saisir le mot de la fin de cette chaîne que le nom et mettre le reste dans le champ prénom. Si vous ne voulez pas le faire, vous aurez besoin de vérifier pour le titre (M., Mme, Dr, etc.) au début et à faire des hypothèses sur la base du nombre de places à la façon dont le nom est composé.
Je ne pense pas qu'il n'y a aucune façon vous pouvez analyser avec une précision de 100%.
Essayer http://www.address-parser.com. Nous utilisons leur service web, que vous pouvez tester en ligne
Basée sur les données de l'échantillon:
Je voudrais commencer à la fin de la chaîne. Analyser un code Postal (soit le format). Lire la fin de la première de l'espace. Si aucun Code Postal a été trouvé d'Erreur.
De la garniture de la fin, alors pour les espaces et les caractères spéciaux (les virgules)
De passer ensuite à l'État, de nouveau utiliser l'Espace comme délimiteur. Peut-être utiliser une liste de recherche pour valider 2 lettre des codes d'état, et l'état complet des noms. Si aucun état, d'erreur.
Garniture espaces et les virgules à partir de la fin de nouveau.
Ville est difficile, en fait, je peux utiliser une virgule ici, au risque d'avoir trop de données dans la ville. Recherchez la virgule, ou au début de la ligne.
Si vous avez encore des caractères à gauche dans la chaîne, mettre tous dans un champ d'adresse.
Ce n'est pas parfait, mais il devrait être un bon point de départ.
Si elle est humaine saisie de données, alors vous allez passer trop de temps à essayer de code autour de l'exception.
Essayer:
Expression régulière pour extraire le code postal
Code postal de recherche (via approprié gouvernement DB) pour obtenir l'adresse correcte
Obtenir un stagiaire pour vérifier manuellement les nouvelles données correspond à l'ancien
Cela ne résout pas votre problème, mais si vous avez uniquement besoin de latitude et de longitude données pour ces adresses, l'API Google Maps va analyser les non-adresses au format assez bien.
RecogniContact est un Windows un objet COM qui traite des AMÉRICAINS et des Européens adresses. Vous pouvez l'essayer sur la droite
http://www.loquisoft.com/index.php?page=8
Vous pourriez vouloir vérifier cela!! http://jgeocoder.sourceforge.net/parser.html
A travaillé comme un charme pour moi.
Ce type de problème est difficile à résoudre en raison de la sous-jacentes à des ambiguïtés dans les données.
Ici est une interface basée sur la solution qui définit une descente récursive de la grammaire d'arbre basé sur des expressions régulières pour analyser de nombreux combinaison valide de l'adresse municipale: http://search.cpan.org/~kimryan/Lingua-FR-AddressParse-1.20/lib/Lingua/FR/AddressParse.pm . Cela comprend des sous-propriétés à l'intérieur d'une adresse du type:
12 1re Avenue, N Suite # 2 quelque part CA 12345 USA
Il est semblable à http://search.cpan.org/~timb/Geo-StreetAddress-NOUS-1.03/US.pm mentionné ci-dessus, mais fonctionne également pour les adresses qui ne sont pas des etats-unis, comme le royaume-UNI, l'Australie et le Canada.
Ici est la sortie d'un de vos exemples d'adresses. Notez que le nom de l'article devrait être supprimé de la première de "A. P. Croll & Fils 2299 Lewes-Georgetown Autoroute, Georgetown, DE 19947" pour le réduire à "2299 Lewes-Georgetown Autoroute, Georgetown, DE 19947". Ceci est facilement réalisé par la suppression de toutes les données pour le premier nombre qui se trouve dans la chaîne.
Car il y a risque d'erreur dans word, pensez à utiliser SOUNDEX combiné avec les collectivités locales algorithme pour comparer des chaînes de caractères, cela sera d'une grande aide !
à l'aide de l'API google
Pour ruby ou rails de développeurs il y a un beau bijou appelé street_address.
J'ai été en utilisant cette sur un de mes projet et il fait le travail dont j'ai besoin.
Le seul Problème que j'ai eu a chaque fois qu'une adresse est dans ce format
P. O. Box 1410 Durham, NC 27702
il est revenu nul et, par conséquent, j'ai dû remplacer "P. O. Box" avec " et après cela, elle était capable de l'analyser.Il y a des services de transmission de données donné un code postal vous donnera la liste des noms de rue dans ce code postal.
Utiliser une expression régulière pour extraire Zip ou de l'Etat de la Cité de trouver la bonne ou si une erreur de faire les deux.
tirez sur la liste des rues à partir d'un source de données Corriger la ville et l'état, puis l'adresse de la rue. Une fois que vous obtenez une Adresse valide la ligne 1 du, ville, etat, et zip, vous pouvez alors faire des hypothèses sur la ligne d'adresse 2..3
Je ne sais pas COMMENT est ce POSSIBLE, mais je n'ai pas vu cette mentionnée j'ai donc pensé que je pourrais aller de l'avant et de proposer ceci:
Si vous êtes strictement à l'américaine... obtenir une énorme base de données de tous les codes postaux, les états, les villes et les rues. Maintenant, regardez dans vos adresses. Vous pouvez valider ce que vous trouvez en essayant de voir si, par exemple, la ville vous avez trouvé existe dans l'état que vous avez trouvé, ou en vérifiant si la rue vous les avez trouvés existe dans la ville que vous avez trouvé. Si pas, les chances sont que John n'est pas pour Jean de la rue, mais le nom du destinataire... en gros, obtenir le plus d'informations que vous pouvez et vérifiez vos adresses contre elle.
Un exemple extrême serait d'obtenir UNE LISTE DE TOUTES LES ADRESSES DANS LA NOUS DE UN et ensuite de trouver lequel est le plus pertinent correspondre à chacune de vos adresses...
Il est javascript port de perl Geo::StreetAddress::US package: https://github.com/hassansin/parse-address . Il regex de base et fonctionne assez bien.