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:
Supposons une adresse aux États-Unis (pour l'instant)
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)
les états peuvent être abrégés
le code postal peut être standard à 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 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
la source
Réponses:
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)
J'espère que cela aide un peu.
la source
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
Maintenant c'est analysable!
la source
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.
la source
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:
Et voici la sortie au format CSV de cette même requête:
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.
la source
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.
la source
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.:
Le passage de la
parseAddress
fonction "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" renvoie:la source
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.
la source
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.
la source
+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
la source
Existe-t-il des normes dans la manière 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 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).
la source
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%.
la source
Essayez www.address-parser.com . Nous utilisons leur service Web, que vous pouvez tester en ligne
la source
Sur la base des exemples de données:
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.
Coupez ensuite la fin pour les espaces et les caractères spéciaux (virgules)
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.
Coupez à nouveau les espaces et les virgules à partir de la fin.
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.
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.
la source
S'il s'agit de données saisies par l'homme, vous passerez trop de temps à essayer de coder autour des exceptions.
Essayer:
Expression régulière pour extraire le code postal
Recherche de code postal (via la base de données gouvernementale appropriée) pour obtenir l'adresse correcte
Demandez à un stagiaire de vérifier manuellement que les nouvelles données correspondent aux anciennes
la source
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.
la source
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
Vous voudrez peut-être vérifier cela !! http://jgeocoder.sourceforge.net/parser.html A fonctionné comme un charme pour moi.
la source
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.
la source
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!
la source
en utilisant l'API google
la source
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.la source
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
la source
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 ...
la source
Il existe un port javascript du package perl Geo :: StreetAddress :: US: https://github.com/hassansin/parse-address . Il est basé sur les regex et fonctionne assez bien.
la source