Nous faisons des affaires principalement aux États-Unis et essayons d'améliorer l'expérience utilisateur en combinant tous les champs d'adresse dans une seule zone de texte. Mais il y a quelques problèmes:
- L'adresse saisie par l'utilisateur peut ne pas être correcte ou dans un format standard
- L'adresse doit être séparée en parties (rue, ville, état, etc.) pour traiter les paiements par carte de crédit
- Les utilisateurs peuvent saisir plus que leur adresse (comme leur nom ou leur entreprise)
- Google peut le faire, mais les conditions d'utilisation et les limites de requêtes sont prohibitives, en particulier avec un budget serré
Apparemment, c'est une question courante:
- Script PHP pour analyser l'adresse?
- Comment analyser l'adresse au format libre à enregistrer dans la base de données
- analyseur d'adresse postale java
- Un moyen plus efficace d'extraire les composants d'adresse
- Comment puis-je afficher une adresse postale pré-remplie dans l'écran des contacts avec rue, ville, code postal sur Android
- Adresse US de l'expression rationnelle PHP
Existe-t-il un moyen d'isoler une adresse du texte qui l'entoure et de la diviser en morceaux? Existe-t-il une expression régulière pour analyser les adresses?
Réponses:
J'ai beaucoup vu cette question lorsque je travaillais pour une entreprise de vérification d'adresse. Je poste la réponse ici pour la rendre plus accessible aux programmeurs qui recherchent avec la même question. L'entreprise dans laquelle je travaillais a traité des milliards d'adresses et nous avons beaucoup appris au cours du processus.
Tout d'abord, nous devons comprendre quelques éléments concernant les adresses.
Les adresses ne sont pas régulières
Cela signifie que les expressions régulières sont supprimées. J'ai tout vu, des simples expressions régulières qui correspondent aux adresses dans un format très spécifique, à ceci:
... à ceci où un fichier de classe de ligne de plus de 900 lignes génère une expression régulière supermassive à la volée pour correspondre encore plus. Je ne les recommande pas (par exemple, voici un violon de l'expression régulière ci-dessus, qui fait beaucoup d'erreurs ). Il n'y a pas de formule magique facile pour que cela fonctionne. En théorie et en théorie, il n'est pas possible de faire correspondre des adresses avec une expression régulière.
La publication USPS 28 documente les nombreux formats d'adresses possibles, avec tous leurs mots-clés et variatons. Pire encore, les adresses sont souvent ambiguës. Les mots peuvent signifier plus d'une chose ("St" peut être "Saint" ou "Street") et il y a des mots que je suis sûr qu'ils ont inventés. (Qui savait que "Stravenue" était un suffixe de rue?)
Vous auriez besoin d'un code qui comprend vraiment les adresses, et si ce code existe, c'est un secret commercial. Mais vous pourriez probablement rouler vous-même si vous aimez vraiment ça.
Les adresses se présentent sous des formes et des tailles inattendues
Voici quelques adresses artificielles (mais complètes):
Même ceux-ci sont peut-être valables:
De toute évidence, ceux-ci ne sont pas normalisés. Ponctuation et sauts de ligne non garantis. Voici ce qui se passe:
Le numéro 1 est complet car il contient une adresse postale et une ville et un état. Avec cette information, il y a assez d'identifier l'adresse, et elle peut être considérée comme "livrable" (avec une certaine normalisation).
Le numéro 2 est complet car il contient également une adresse postale (avec numéro secondaire / d'unité) et un code postal à 5 chiffres, ce qui suffit pour identifier une adresse.
Le numéro 3 est un format de boîte postale complet, car il contient un code postal.
Le numéro 4 est également complet car le code postal est unique , ce qui signifie qu'une entité ou une société privée a acheté cet espace d'adressage. Un code postal unique est destiné aux espaces de livraison à volume élevé ou concentrés. Tout ce qui est adressé au code postal 12345 va à General Electric à Schenectady, NY. Cet exemple n'atteindra personne en particulier, mais l'USPS serait toujours en mesure de le fournir.
Le numéro 5 est également complet, croyez-le ou non. Avec juste ces nombres, l'adresse complète peut être découverte lorsqu'elle est analysée par rapport à une base de données de toutes les adresses possibles. Remplir les directives manquantes, l'indicateur secondaire et le code ZIP + 4 est trivial lorsque vous voyez chaque nombre comme un composant. Voici à quoi il ressemble, entièrement développé et standardisé:
Les données d'adresse ne vous appartiennent pas
Dans la plupart des pays qui fournissent des données d'adresse officielles aux fournisseurs agréés, les données d'adresse elles-mêmes appartiennent à l'agence gouvernementale. Aux États-Unis, l'USPS possède les adresses. Il en va de même pour Postes Canada, Royal Mail et d'autres, bien que chaque pays applique ou définit la propriété un peu différemment. Le savoir est important, car il interdit généralement la rétro-ingénierie de la base de données d'adresses. Vous devez faire attention à l'acquisition, au stockage et à l'utilisation des données.
Google Maps est une solution courante pour les corrections d'adresse rapides, mais le TOS est plutôt prohibitif; par exemple, vous ne pouvez pas utiliser leurs données ou API sans afficher une carte Google Map, et à des fins non commerciales uniquement (sauf si vous payez), et vous ne pouvez pas stocker les données (sauf pour la mise en cache temporaire). Logique. Les données de Google sont parmi les meilleures au monde. Cependant, Google Maps ne vérifie pas l'adresse. Si une adresse n'existe pas, il sera toujours vous montrer où l'adresse serait être si elle a fait exist (essayer sur votre propre rue, utiliser un numéro de la maison que vous savez n'existe pas). Ceci est parfois utile, mais soyez conscient de cela.
La politique d'utilisation de Nominatim est également limitative, en particulier pour un volume élevé et une utilisation commerciale, et les données sont principalement tirées de sources gratuites, donc elles ne sont pas aussi bien entretenues (telle est la nature des projets ouverts) - cependant, cela peut toujours convenir. vos besoins. Il est soutenu par une grande communauté.
L'USPS lui-même a une API, mais il descend beaucoup et n'est livré sans aucune garantie ni support. Il peut également être difficile à utiliser. Certaines personnes l'utilisent avec parcimonie et sans problème. Mais il est facile de rater que l'USPS exige que vous utilisiez son API uniquement pour confirmer les adresses à expédier par leur intermédiaire.
Les gens s'attendent à ce que les adresses soient difficiles
Malheureusement, nous avons conditionné notre société à s'attendre à ce que les adresses soient compliquées. Il y a des dizaines de bons articles UX partout sur Internet à ce sujet, mais le fait est que si vous avez un formulaire d'adresse avec des champs individuels, c'est ce à quoi les utilisateurs s'attendent, même si cela complique la tâche pour les adresses marginales qui ne correspondent pas au formatez le formulaire attendu, ou peut-être que le formulaire nécessite un champ qu'il ne devrait pas. Ou les utilisateurs ne savent pas où mettre une certaine partie de leur adresse.
Je pourrais continuer encore et encore sur le mauvais UX des formulaires de paiement ces jours-ci, mais je dirai simplement que combiner les adresses dans un seul champ sera un changement bienvenu - les gens pourront taper leur adresse comme ils l'entendent , plutôt que d'essayer de comprendre votre longue forme. Cependant, ce changement sera inattendu et les utilisateurs peuvent le trouver un peu discordant au début. Soyez conscient de cela.
Une partie de cette douleur peut être atténuée en plaçant le champ du pays au premier plan, avant l'adresse. Lorsqu'ils remplissent d'abord le champ du pays, vous savez comment faire apparaître votre formulaire. Peut-être avez-vous un bon moyen de gérer les adresses américaines à un seul champ, donc s'ils sélectionnent États-Unis, vous pouvez réduire votre formulaire à un seul champ, sinon afficher les champs du composant. Juste des choses à penser!
Maintenant, nous savons pourquoi c'est difficile; Que peux-tu y faire?
L'USPS octroie des licences aux fournisseurs via un processus appelé Certification CASS ™ pour fournir des adresses vérifiées aux clients. Ces fournisseurs ont accès à la base de données USPS, mise à jour mensuellement. Leur logiciel doit se conformer à des normes rigoureuses pour être certifié, et ils n'ont pas souvent besoin d'accepter les conditions limitatives décrites ci-dessus.
Il existe de nombreuses entreprises certifiées CASS qui peuvent traiter des listes ou avoir des API: Melissa Data, Experian QAS et SmartyStreets pour n'en nommer que quelques-unes.
(En raison de la critique pour la "publicité", j'ai tronqué ma réponse à ce stade. C'est à vous de trouver une solution qui fonctionne pour vous.)
La vérité: Vraiment, mes amis, je ne travaille dans aucune de ces entreprises. Ce n'est pas une publicité.
la source
libpostal: une bibliothèque open-source pour analyser les adresses, s'entraîner avec des données d'OpenStreetMap, OpenAddresses et OpenCage.
https://github.com/openvenues/libpostal ( plus d'infos à ce sujet )
Autres outils / services:
http://www.gisgraphy.com Webservices de géocodage et de géolocalisation gratuits, open source et prêts à l'emploi, intégrant OpenStreetMap, GeoNames et Quattroshapes.
https://github.com/kodapan/osm-common Bibliothèque pour accéder aux services OpenStreetMap, analyser et traiter les données.
http://wiki.openstreetmap.org/wiki/Nominatim
http://address-parser.net/
http://geoservices.tamu.edu/Services/AddressNormalization/
la source
Il existe de nombreux analyseurs d'adresses de rue. Ils viennent dans deux saveurs de base - ceux qui ont des bases de données de noms de lieux et de noms de rues, et ceux qui n'en ont pas.
Un analyseur d'adresse postale d'expression régulière peut atteindre un taux de réussite d'environ 95% sans trop de problèmes. Ensuite, vous commencez à frapper les cas inhabituels. Celui de Perl dans CPAN, "Geo :: StreetAddress :: US", est à peu près aussi bon. Il existe des ports Python et Javascript de cela, tous open source. J'ai une version améliorée en Python qui augmente légèrement le taux de réussite en traitant plus de cas. Cependant, pour obtenir les 3% restants, vous avez besoin de bases de données pour aider à lever l'ambiguïté.
Une base de données avec des codes postaux à 3 chiffres et des noms et abréviations des États américains est d'une grande aide. Lorsqu'un analyseur voit un code postal et un nom d'état cohérents, il peut commencer à se verrouiller sur le format. Cela fonctionne très bien pour les États-Unis et le Royaume-Uni.
L'analyse correcte des adresses civiles commence à partir de la fin et fonctionne à l'envers. C'est ainsi que les systèmes USPS procèdent. Les adresses sont les moins ambiguës à la fin, où les noms de pays, les noms de villes et les codes postaux sont relativement faciles à reconnaître. Les noms de rue peuvent généralement être isolés. Les emplacements dans les rues sont les plus complexes à analyser; là, vous rencontrez des choses telles que "Fifth Floor" et "Staples Pavillion". C'est alors qu'une base de données est d'une grande aide.
la source
MISE À JOUR: Geocode.xyz fonctionne désormais dans le monde entier. Pour des exemples, voir https://geocode.xyz
Pour les États-Unis, le Mexique et le Canada, consultez geocoder.ca .
Par exemple:
Vous pouvez également vérifier les résultats dans l'interface Web ou obtenir une sortie au format Json ou Jsonp. par exemple. Je recherche des restaurants autour du 123 Main Street, New York
la source
geocode.xyz
lascantext
méthode de la méthode a échoué la plupart du temps. Il a toujours choisi «Genève, États-Unis» plutôt que «Genève, Suisse» et était généralement biaisé par les États-Unis.Pas de code? Pour la honte!
Voici un analyseur d'adresse JavaScript simple. C'est assez horrible pour chaque raison donnée par Matt dans sa thèse ci-dessus (avec laquelle je suis presque à 100% d'accord: les adresses sont des types complexes et les humains font des erreurs; mieux vaut sous-traiter et automatiser cela - quand vous pouvez vous le permettre).
Mais plutôt que de pleurer, j'ai décidé d'essayer:
Ce code fonctionne correctement pour analyser la plupart des résultats Esri pour
findAddressCandidate
et aussi avec d'autres géocodeurs (inversés) qui renvoient une adresse sur une seule ligne où la rue / la ville / l'état sont délimités par des virgules. Vous pouvez étendre si vous le souhaitez ou écrire des analyseurs spécifiques au pays. Ou utilisez simplement ceci comme une étude de cas sur la difficulté de cet exercice ou sur la façon dont je suis nul en JavaScript. J'admets que je n'ai passé qu'une trentaine de minutes là-dessus (les futures itérations pourraient ajouter des caches, une validation zip et des recherches d'état ainsi que le contexte de localisation de l'utilisateur), mais cela a fonctionné pour mon cas d'utilisation: l'utilisateur final voit un formulaire qui analyse la réponse de recherche de géocodage en 4 zones de texte. Si l'analyse des adresses est erronée (ce qui est rare à moins que les données source soient médiocres), ce n'est pas grave - l'utilisateur peut le vérifier et le réparer! (Mais pour les solutions automatisées, il est possible de supprimer / ignorer ou de signaler une erreur afin que le développement puisse soit prendre en charge le nouveau format, soit corriger les données source.)la source
Si vous voulez vous fier aux données OSM, libpostal est très puissant et gère un grand nombre des mises en garde les plus courantes avec les entrées d'adresse.
la source
Une autre option pour les adresses basées aux États-Unis est YAddress (créé par l'entreprise pour laquelle je travaille).
De nombreuses réponses à cette question suggèrent des outils de géocodage comme solution. Il est important de ne pas confondre l'analyse des adresses et le géocodage; Ils ne sont pas les mêmes. Bien que les géocodeurs puissent décomposer une adresse en composants comme avantage secondaire, ils s'appuient généralement sur des ensembles d'adresses non standard. Cela signifie qu'une adresse analysée par géocodeur peut ne pas être la même que l'adresse officielle. Par exemple, ce que l'API de géocodage de Google appelle «6th Ave» à Manhattan, USPS appelle «Avenue of the Americas».
la source
Pour l'analyse d'adresses aux États-Unis,
Je préfère utiliser le package usaddress disponible dans pip pour usaddress uniquement
Documentation
PyPi
Cela a bien fonctionné pour moi pour l'adresse américaine.
Exécution de address_parser.py
la source
Dans l'un de nos projets, nous avons utilisé l'analyseur d'adresse suivant. Il analyse les adresses de la plupart des pays du monde avec une bonne précision.
http://address-parser.net/
Il est disponible en tant que bibliothèque autonome ou en tant qu'API en direct.
la source
Je suis en retard à la fête, voici un script Excel VBA que j'ai écrit il y a des années pour l'Australie. Il peut être facilement modifié pour prendre en charge d'autres pays. J'ai créé un référentiel GitHub du code C # ici. Je l'ai hébergé sur mon site et vous pouvez le télécharger ici: http://jeremythompson.net/rocks/ParseAddress.xlsm
Stratégie
Pour tout pays avec un PostCode numérique ou pouvant être associé à un RegEx, ma stratégie fonctionne très bien:
Premièrement, nous détectons le prénom et le nom qui sont supposés être la ligne supérieure. Il est facile d'ignorer le nom et de commencer par l'adresse en décochant la case (appelée «Le nom est la première ligne», comme indiqué ci-dessous).
Ensuite, il est sûr de s'attendre à ce que l'adresse composée de la rue et du numéro vienne avant la banlieue et la rue, Pde, Ave, Av, Rd, Cres, boucle, etc. est un séparateur.
Détecter la banlieue par rapport à l'État et même au pays peut tromper les analyseurs les plus sophistiqués car il peut y avoir des conflits. Pour surmonter cela, j'utilise une recherche PostCode basée sur le fait qu'après avoir dépouillé les numéros de rue et d'appartement / unité ainsi que la PoBox, Ph, Fax , Mobile, etc., seul le numéro PostCode restera. Ceci est facile à associer à un regEx pour rechercher ensuite la ou les banlieues et le pays.
Exemple
Code VBA
AVERTISSEMENT, je sais que ce code n'est pas parfait, ni même bien écrit, mais il est très facile de le convertir dans n'importe quel langage de programmation et de l'exécuter dans n'importe quel type d'application.La stratégie est la réponse en fonction de votre pays et de vos règles, prenez ce code comme exemple :
la source