trouver des adresses en double dans la base de données, empêcher les utilisateurs de les saisir plus tôt ?

StackOverflow https://stackoverflow.com/questions/37568

Question

Comment trouver des adresses en double dans une base de données, ou mieux arrêter les gens déjà au moment de remplir le formulaire ?Je suppose que plus tôt sera le mieux ?

Existe-t-il un bon moyen d'extraire la rue, le code postal, etc. afin que les fautes de frappe et les simples tentatives d'obtention de 2 inscriptions puissent être détectées ?comme:

Quellenstrasse 66/11 
Quellenstr. 66a-11

Je parle d'adresses allemandes...Merci!

Était-ce utile?

La solution

Johannes :

@PConroy :C'était aussi ma pensée initiale.ce qui est intéressant là-dedans, c'est de trouver de bonnes règles de transformation pour les différentes parties de l'adresse !Des bonnes suggestions ?

Lorsque nous travaillions sur ce type de projet auparavant, notre approche consistait à prendre notre corpus d'adresses existant (environ 150k), puis à appliquer les transformations les plus courantes pour notre domaine (Irlande, donc "Dr" -> "Drive", " Rd"->"Route", etc.).Je crains qu'il n'existait pas de ressource en ligne complète pour de telles choses à l'époque, nous avons donc fini par dresser nous-mêmes une liste, en vérifiant des éléments comme l'annuaire téléphonique (on a pressé pour avoir de l'espace, les adresses sont abrégées de toutes sortes de façons ! ).Comme je l'ai mentionné plus tôt, vous seriez étonné du nombre de « doublons » que vous détecterez avec l'ajout de seulement quelques règles communes !

Je suis récemment tombé sur une page avec une description assez complète liste des abréviations d'adresses, même si c'est de l'anglais américain, donc je ne suis pas sûr de son utilité en Allemagne !Une recherche rapide sur Google a révélé quelques sites, mais ils ressemblaient à des pièges d'inscription à la newsletter contenant du spam.Même si c'était moi qui cherchais sur Google en anglais, vous pourriez donc consulter davantage les "abréviations d'adresses allemandes" en allemand :)

Autres conseils

Vous pourriez utiliser le API Google GéoCode

Ce qui donne en fait des résultats pour vos deux exemples, je viens de l'essayer.De cette façon, vous obtenez des résultats structurés que vous pouvez enregistrer dans votre base de données.Si la recherche échoue, demandez à l'utilisateur d'écrire l'adresse d'une autre manière.

Plus tôt vous pourrez arrêter les gens, plus ce sera facile à long terme !

N'étant pas trop familier avec votre schéma de base de données ou votre formulaire de saisie de données, je suggérerais un itinéraire semblable à celui-ci :

  • ayez des champs distincts dans votre base de données pour chaque "partie" d'adresse, par ex.rue, ville, code postal, Länder, etc.

  • ayez votre formulaire de saisie de données décomposé de la même manière, par ex.rue, ville, etc.

Le raisonnement derrière ce qui précède est que chaque partie aura probablement ses propres "règles" particulières pour vérifier les adresses légèrement modifiées ("Quellenstrasse" -> "Quellenstr.", "66/11" -> "66a-11" ci-dessus). afin que votre code de validation puisse vérifier si les valeurs présentées pour chaque champ existent dans leur champ de base de données respectif.Sinon, vous pouvez avoir une classe qui applique les règles de transformation pour chaque champ donné (par ex."strasse" dérive de "str") et vérifie à nouveau les doublons.

Évidemment, la méthode ci-dessus a ses inconvénients :

  • cela peut être lent, en fonction de votre ensemble de données, laissant l'utilisateur attendre

  • les utilisateurs peuvent essayer de le contourner en mettant l'adresse « Parties » dans les mauvais champs (en ajoutant le code postal à la ville, etc.).mais par expérience, nous avons constaté que l'introduction même d'une simple vérification comme celle ci-dessus empêchera un grand pourcentage d'utilisateurs de saisir des adresses préexistantes.

Une fois que vous avez mis en place la vérification de base, vous pouvez envisager d'optimiser les accès à la base de données requis, d'affiner les règles, etc. pour répondre à votre schéma particulier.Vous pourriez également jeter un oeil à Fonction match() de MySQL pour élaborer un texte similaire.

Avant de commencer à rechercher des adresses en double dans votre base de données, vous devez d'abord vous assurer de stocker les adresses dans un format standard.

La plupart des pays ont une méthode standard de formatage des adresses, aux États-Unis, il s'agit du système USPS CASS : http://www.usps.com/ncsc/addressservices/certprograms/cass.htm

Mais la plupart des autres pays ont un service/une norme similaire.Essayez ce site pour des formats plus internationaux :http://bitboost.com/ref/international-address-formats.html

Cela vous aide non seulement à trouver les doublons, mais vous permet également d'économiser de l'argent lors de l'envoi de courriers à vos clients (le service postal facture moins si l'adresse est dans un format standard).

En fonction de votre application, dans certains cas, vous souhaiterez peut-être stocker un enregistrement d'adresse « personnalisé » ainsi que l'enregistrement d'adresse standard.Cela rend vos clients VIP satisfaits.Une adresse « personnalisée » pourrait ressembler à ceci :

62 ouest quatre-vingt-onzième rue
Appartement 4D
Manhattan, New York, NY 10001

Alors que l'adresse standard pourrait ressembler à ceci :

62 Ouest 91ÈME RUE APT 4D
NEW YORK NY 10024-1414

Une chose que vous voudrez peut-être examiner est Soundex recherches, très utiles pour les fautes d’orthographe et les contractions.

Il ne s'agit cependant pas d'une validation dans la base de données, donc cela peut ou non correspondre à ce que vous recherchez.

Une autre solution possible (en supposant que vous ayez réellement besoin de données d'adresse fiables et que vous n'utilisez pas uniquement les adresses pour éviter les comptes en double) consiste à utiliser un service Web tiers pour normaliser les adresses fournies par vos utilisateurs.

Cela fonctionne de cette façon : votre système accepte l'adresse d'un utilisateur via un formulaire en ligne.Votre formulaire transmet l'adresse de l'utilisateur au service Web de normalisation d'adresse tiers.Le service Web vous renvoie la même adresse mais maintenant avec les données standardisées dans des champs d'adresse discrets et avec les abréviations et formats standard appliqués.Votre application affiche cette adresse standardisée à votre utilisateur pour confirmation avant de tenter de sauvegarder les données dans votre base de données.

Si toutes les adresses des utilisateurs passent par une étape de standardisation et que seules les adresses standardisées sont enregistrées dans votre base de données, la recherche d'enregistrements en double devrait être grandement simplifiée puisque vous comparez désormais des pommes avec des pommes.

Un de ces services tiers est Service interactif de Global Address qui inclut l'Allemagne dans la liste des pays pris en charge, et propose également une démo en ligne qui montre le fonctionnement de leur service (le lien de démonstration peut être trouvé sur cette page Web).

Cette approche présente évidemment un inconvénient en termes de coût.Cependant, le côté positif :

  1. vous n'auriez pas besoin de créer et de maintenir vos propres métadonnées de normalisation des adresses
  2. vous n'aurez pas besoin d'améliorer continuellement vos routines de normalisation des adresses, et
  3. vous êtes libre de concentrer votre énergie de développement logiciel sur les parties de l'application qui sont propres à vos besoins

Clause de non-responsabilité:Je ne travaille pas pour Global Address et je n'ai pas essayé d'utiliser leur service.Je les mentionne simplement à titre d'exemple puisqu'ils ont une démo en ligne avec laquelle vous pouvez réellement jouer.

Pour ajouter une réponse à ma propre question:

Une autre façon de procéder consiste à demander aux utilisateurs leur numéro de téléphone portable et à leur envoyer un SMS pour vérification.Cela empêche la plupart des gens de jouer avec des adresses en double.

Je parle d'une expérience personnelle.(merci cochon !) Ils ont introduit la confirmation par téléphone portable.Cela m'a empêché d'avoir 2 comptes !:-)

Je me rends compte que le message original est spécifique aux adresses allemandes, mais c'est une bonne question pour les adresses en général.

Aux États-Unis, il existe une partie d’une adresse appelée code-barres du point de livraison.Il s'agit d'un numéro unique à 12 chiffres qui identifie un seul point de livraison et peut servir d'identifiant unique d'une adresse.Pour obtenir cette valeur, vous devrez utiliser une API de service Web de vérification d'adresse ou de normalisation d'adresse, qui peut coûter environ 20 $/mois en fonction du volume de demandes que vous lui adressez.

Dans un souci de transparence, je suis le fondateur de SmartyStreets.Nous proposons justement un tel API du service Web de validation d'adresse appelé LiveAddress.N'hésitez pas à me contacter personnellement pour toute question que vous avez.

L'apprentissage automatique et l'IA disposent d'algorithmes pour trouver des similitudes de chaînes et des mesures en double.

La liaison des enregistrements ou la tâche de faire correspondre les enregistrements équivalents qui diffèrent syntaxiquement - ont été explorés pour la première fois à la fin des années 1950 et 1960.

Vous pouvez représenter toutes les paires d'enregistrements utilisant un vecteur de fonctionnalités qui décrivent la similitude entre les champs d'enregistrement individuels.

Par exemple, la détection en double adaptative à l'aide de mesures de similitude de chaîne apprenables.Par exemple, lis ce document

  1. Vous pouvez utiliser des métriques de distance génériques ou réglées manuellement pour estimer la similarité des doublons potentiels.

  2. Vous pouvez utiliser des algorithmes de correspondance de noms adaptatifs, comme la métrique Jaro, qui est basée sur le nombre et l'ordre des caractères communs entre deux chaînes.

  3. Distance basée sur des jetons et hybride.Dans de tels cas, nous pouvons convertir les chaînes S et T en multisets de jetons (où chaque jeton est un mot) et considérer des mesures de similitude sur ces multisets.

Vous utilisez souvent des contraintes dans une base de données pour garantir que les données soient « uniques » au sens fondé sur les données.

Concernant les "isomorphismes", je pense que vous êtes seul, c'est-à-dire que vous écrivez le code vous-même.Si vous êtes dans la base de données, vous pouvez utiliser un déclencheur.

Je cherche une réponse concernant les adresses aux États-Unis

Le problème en question est d'empêcher les utilisateurs de saisir des doublons comme

Quellenstrasse 66/11 et Quellenstr. 66a-11

Cela se produit lorsque vous laissez votre utilisateur saisir l'adresse complète dans la zone de saisie.

Il existe certaines méthodes que vous pouvez utiliser pour éviter cela.

1.Formatage uniforme à l'aide de RegEx

  • Vous pouvez inviter les utilisateurs à saisir les détails dans un format uniforme.
  • C'est également très efficace lors des requêtes
  • testez la valeur saisie par l'utilisateur par rapport à certaines expressions régulières et en cas d'échec, demandez à l'utilisateur de la corriger.

2.Utilisez une API de carte comme Google Maps et demandez à l'utilisateur d'en sélectionner les détails.

  • Si vous choisissez Google Maps, vous pouvez y parvenir en utilisant le géocodage inversé.

Depuis Guide du développeur Google,

Le terme géocodage fait généralement référence à la traduction d’une adresse lisible par l’homme en un emplacement sur une carte. Le processus consistant à faire le contraire, c'est-à-dire traduire un emplacement sur la carte en une adresse lisible par l'homme, est connu sous le nom de géocodage inversé.

3.Autorisez les données hétérogènes comme indiqué dans la question et comparez-les avec un formatage différent.

  • Dans la question, l'OP autorise l'adresse dans un format différent.
  • Dans ce cas, vous pouvez le modifier sous différentes formes et le vérifier avec la base de données pour obtenir une solution.
  • Cela peut prendre plus de temps et le temps dépend entièrement du nombre de cas de test.

4.Divisez l'adresse en différentes parties, stockez-la dans la base de données et fournissez un tel formulaire à l'utilisateur.

  • Cela signifie fournir différents champs pour stocker la rue, la ville, l'état, etc. dans la base de données.
  • Fournissez également les différents champs de saisie à l'utilisateur pour saisir la rue, la ville, l'état, etc. au format descendant.
  • Lorsque l'utilisateur entre dans un état, affinez la requête pour rechercher les dupes à cet état uniquement.
  • Lorsque l'utilisateur saisit une ville, limitez-le à cette ville uniquement.
  • Lorsque l'utilisateur entre dans la rue, limitez-le à cette rue.

et enfin

  • Lorsque l'utilisateur saisit l'adresse, modifiez-la dans différents formats et testez-la par rapport à la base de données.

Ceci est efficace même si le nombre de cas de test peut être élevé, le nombre d'entrées que vous testez sera très inférieur et cela prendra donc très moins de temps.

Aux États-Unis, vous pouvez utiliser USPS Outil Web de normalisation des adresses.Il vérifie et normalise les adresses pour vous.De cette façon, vous pouvez normaliser l'adresse avant de vérifier si elle existe déjà dans la base de données.Si toutes les adresses de la base de données sont déjà normalisées, vous pourrez facilement repérer les doublons.

Exemple d'URL :

https://production.shippingapis.com/ShippingAPI.dll?API=Verify&XML=insert_request_XML_here

Demande d'échantillon:

<AddressValidateRequest USERID="XXXXX">
  <IncludeOptionalElements>true</IncludeOptionalElements>
  <ReturnCarrierRoute>true</ReturnCarrierRoute>
  <Address ID="0">  
    <FirmName />   
    <Address1 />   
    <Address2>205 bagwell ave</Address2>   
    <City>nutter fort</City>   
    <State>wv</State>   
    <Zip5></Zip5>   
    <Zip4></Zip4> 
  </Address>      
</AddressValidateRequest>

Exemple de réponse :

<AddressValidateResponse>
  <Address ID="0">
    <Address2>205 BAGWELL AVE</Address2>
    <City>NUTTER FORT</City>
    <State>WV</State>
    <Zip5>26301</Zip5>
    <Zip4>4322</Zip4>
    <DeliveryPoint>05</DeliveryPoint>
    <CarrierRoute>C025</CarrierRoute>
  </Address>
</AddressValidateResponse>

D'autres pays peuvent avoir leurs propres API.D'autres personnes ont mentionné des API tierces prenant en charge plusieurs pays et qui pourraient être utiles dans certains cas.

Lorsque Google récupère des suggestions de recherche, vous pouvez rechercher les champs d'adresse de la base de données.

Tout d’abord, créons un fichier index.htm(l) :

    <!DOCTYPE html>
    <html lang="en">

    <head>
        <meta http-equiv="Content-Language" content="en-us">
        <title>Address Autocomplete</title>
        <meta charset="utf-8">
        <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
        <script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
        <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
        <script src="//netsh.pp.ua/upwork-demo/1/js/typeahead.js"></script>
        <style>
            h1 {
                font-size: 20px;
                color: #111;
            }

            .content {
                width: 80%;
                margin: 0 auto;
                margin-top: 50px;
            }

            .tt-hint,
            .city {
                border: 2px solid #CCCCCC;
                border-radius: 8px 8px 8px 8px;
                font-size: 24px;
                height: 45px;
                line-height: 30px;
                outline: medium none;
                padding: 8px 12px;
                width: 400px;
            }

            .tt-dropdown-menu {
                width: 400px;
                margin-top: 5px;
                padding: 8px 12px;
                background-color: #fff;
                border: 1px solid #ccc;
                border: 1px solid rgba(0, 0, 0, 0.2);
                border-radius: 8px 8px 8px 8px;
                font-size: 18px;
                color: #111;
                background-color: #F1F1F1;
            }
        </style>
        <script>
            $(document).ready(function() {

                $('input.city').typeahead({
                    name: 'city',
                    remote: 'city.php?query=%QUERY'

                });

            })
        </script>

    <script>
            function register_address()
            {
                $.ajax({
                    type: "POST",
                    data: {
                        City: $('#city').val(),
                    },
                    url: "addressexists.php",
                    success: function(data)
                    {
                        if(data === 'ADDRESS_EXISTS')
                        {
                            $('#address')
                                .css('color', 'red')
                                .html("This address already exists!");
                        }

                    }
                })              
            }
        </script>
    </head>

    <body>
        <div class="content">

            <form>
                <h1>Try it yourself</h1>
                <input type="text" name="city" size="30" id="city" class="city" placeholder="Please Enter City or ZIP code">
<span id="address"></span>
            </form>
        </div>
    </body>
</html>

Nous allons maintenant créer un fichier city.php qui regroupera notre requête dans la base de données MySQL et donnera une réponse au format JSON.Voici le code :

<?php

//CREDENTIALS FOR DB
define ('DBSERVER', 'localhost');
define ('DBUSER', 'user');
define ('DBPASS','password');
define ('DBNAME','dbname');

//LET'S INITIATE CONNECT TO DB
$connection = mysqli_connect(DBSERVER, DBUSER, DBPASS,"DBNAME") or die("Can't connect to server. Please check credentials and try again");


//CREATE QUERY TO DB AND PUT RECEIVED DATA INTO ASSOCIATIVE ARRAY
if (isset($_REQUEST['query'])) {
    $query = $_REQUEST['query'];
    $sql = mysqli_query ($connection ,"SELECT zip, city FROM zips WHERE city LIKE '%{$query}%' OR zip LIKE '%{$query}%'");
    $array = array();
    while ($row = mysqli_fetch_array($sql,MYSQLI_NUM)) {
        $array[] = array (
            'label' => $row['city'].', '.$row['zip'],
            'value' => $row['city'],
        );
    }
    //RETURN JSON ARRAY
    echo json_encode ($array);
}

?>

puis évitez de les enregistrer dans la base de données s'ils sont trouvés en double dans la colonne du tableau

Et pour votre code addressexists.php :

<?php//CREDENTIALS FOR DB
    define ('DBSERVER', 'localhost');
    define ('DBUSER', 'user');
    define ('DBPASS','password');
    define ('DBNAME','dbname');

    //LET'S INITIATE CONNECT TO DB
    $connection = mysqli_connect(DBSERVER, DBUSER, DBPASS,"DBNAME") or die("Can't connect to server. Please check credentials and try again");


    $city= mysqli_real_escape_string($_POST['city']); // $_POST is an array (not a function)
    // mysqli_real_escape_string is to prevent sql injection

    $sql = "SELECT username FROM ".TABLENAME." WHERE city='".$city."'"; // City must enclosed in two quotations

    $query = mysqli_query($connection,$sql);

    if(mysqli_num_rows($query) != 0)

    {
        echo('ADDRESS_EXISTS');
    }
?>

Faites correspondre l'adresse aux adresses fournies par DET BundesPost pour détecter les doublons.

DET vend probablement un CD comme le font les États-Unis.Le problème devient alors la correspondance avec les adresses de la Bundespost.Juste un long processus de remplacement des abréviations par les abréviations post-approuvées et autres.

De la même manière aux USA.Faites correspondre les adresses USPostOffice (désolé, cela coûte de l'argent, donc ses CD pas entièrement ouverts sont disponibles auprès du bureau de poste américain) pour trouver des doublons.

C'est une vieille question, mais une autre approche consiste à calculer la distance de Levenshtein aux adresses et de cette façon vous pouvez trouver des adresses déjà existantes qui sont très similaires.Vous pouvez en voir plus ici. Recherche d'adresses en double à l'aide de la métrique de distance Levenshtein dans SQL.

À mon avis, en supposant que vous ayez déjà beaucoup de données sales dans votre base de données,

Vous devez faire construire votre filtre sale "fait main" qui pourra détecter un maximum d'abréviation allemande...

Mais si vous traitez beaucoup de données, vous prendrez le risque de trouver des échantillons faussement positifs et vrais négatifs...

Enfin un travail semi-automatisé (machine avec assistance humaine lorsque la probabilité d'un cas de faux positif ou de vrai négatif est trop élevée) sera la meilleure solution.

Plus vous traitez "l'exception" (car l'homme déclenche une exception lors du remplissage des données), plus votre filtre "fait main" répondra à vos besoins.

D'un autre côté, vous pouvez également utiliser un service de vérification d'adresse allemand côté utilisateur et stocker uniquement celle vérifiée...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top