2008-09-01 20 views
17

¿Cómo puedo encontrar direcciones duplicadas en una base de datos, o mejor detener a las personas cuando completa el formulario? ¿Supongo que cuanto antes mejor?encontrar direcciones duplicadas en la base de datos, ¿evita que los usuarios las ingresen temprano?

¿Hay alguna manera de abstraer la calle, el código postal, etc. para que se puedan detectar errores tipográficos y simples intentos de obtener 2 registros? como:

Quellenstrasse 66/11 
Quellenstr. 66a-11 

estoy hablando direcciones alemanes ... Gracias!

+0

Estoy buscando una respuesta que aborde direcciones de Estados Unidos –

+0

He resuelto el mismo problema, en una aplicación de entrega, utilizando un diccionario de errores ortográficos comunes, cada dirección se comprueba a través de una función de mapa que se compara con la lista de palabras en el diccionario y corrige antes de escribir en nuestro DB. – datelligence

Respuesta

5

Johannes:

@PConroy: Esta fue mi thougt inicial también. ¡la parte interesante de esto es encontrar buenas reglas de transformación para las diferentes partes de la dirección! ¿Alguna buena sugerencia?

Cuando estábamos trabajando en este tipo de proyectos antes, nuestro enfoque era tomar nuestro corpus existente de direcciones (150k o menos), a continuación, aplicar las transformaciones más comunes de nuestro dominio (Irlanda, por lo que "Dr. "->" Drive "," Rd "->" Road ", etc.). Me temo que no había un recurso completo en línea para tales cosas en ese momento, así que terminamos básicamente haciendo una lista nosotros mismos, verificando cosas como la guía telefónica (presionando por espacio allí, ¡las direcciones se abrevian de muchas maneras!) Como mencioné anteriormente, ¡te sorprendería la cantidad de "duplicados" que detectarás con la adición de solo unas pocas reglas comunes!

Recientemente me encontré con una página bastante exhaustiva list of address abbreviations, aunque es inglés americano, ¡así que no estoy seguro de lo útil que sería en Alemania! Un google rápido apareció en un par de sitios, pero parecían trampas de suscripción al boletín de spam. A pesar de que era yo googling en Inglés, por lo que puede tener más mirada con "alemán de dirección abreviaturas" en alemán :)

0

A menudo se utilizan restricciones en una base de datos para garantizar que los datos sean "únicos" en el sentido basado en datos.

En cuanto a "isomorfismos", creo que estás solo, es decir, escribes el código tú mismo. Si está en la base de datos, puede usar un disparador.

6

Cuanto antes pueda detener a las personas, más fácil será a la larga.

Al no ser demasiado familiarizados con el esquema de db o formulario de entrada de datos, me gustaría sugerir una ruta algo como lo siguiente:

  • tienen distintos campos en su base de datos para cada dirección de "parte", por ejemplo, calle, ciudad, código postal, Länder, etc.

  • tienen su formulario de entrada de datos desglosado de manera similar, p. calle, ciudad, etc.

El razonamiento detrás de lo anterior es que cada parte es probable que disponga de una "reglas" particulares para comprobar cambió ligeramente su nombre y dirección, ("Quellenstrasse" - "Quellenstr"> "66/11 "->" 66a-11 "arriba) para que su código de validación pueda verificar si los valores que se presentan para cada campo existen en su respectivo campo db. De lo contrario, puede tener una clase que aplique las reglas de transformación para cada campo dado (por ejemplo, "strasse" derivado de "str") y comprueba nuevamente si hay duplicados.

Obviamente el método anterior tiene sus inconvenientes:

  • puede ser lento, dependiendo de su conjunto de datos, dejando al usuario la espera

  • usuarios pueden tratar de conseguir alrededor de él poniendo la dirección " Partes "en los campos incorrectos (anexando el código postal a la ciudad, etc.). pero según la experiencia, hemos encontrado que introducir incluso comprobaciones sencillas como las anteriores evitará que un gran porcentaje de usuarios ingrese direcciones preexistentes.

Una vez que haya la comprobación básica en su lugar, se puede ver en la optimización de la db accesos requeridos, el perfeccionamiento de las normas, etc para cumplir con su esquema particular. También puede consultar MySQL's match() function para obtener un texto similar.

10

podría utilizar el Google GeoCode API

Wich, de hecho, da resultados para ambos de sus ejemplos, sólo trató de la misma. De esta forma obtendrás resultados estructurados que puedes guardar en tu base de datos. Si la búsqueda falla, solicite al usuario que escriba la dirección de otra manera.

+4

Los términos en la API de Google GeoCode indican que el uso de la API sin mostrar los resultados en un mapa está prohibido. Consulte "Límites de uso" en https://developers.google.com/maps/documentation/geocoding/index. – Ryan

2

Antes de comenzar a buscar direcciones duplicadas en su base de datos, primero debe asegurarse de almacenar las direcciones en un formato estándar.

mayoría de los países tienen una forma estándar de formateo de direcciones, en los EE.UU. es el sistema CASS USPS: http://www.usps.com/ncsc/addressservices/certprograms/cass.htm

Pero la mayoría de los otros países tienen un servicio/estándar similar. Prueba este sitio para los formatos más internacionales: http://bitboost.com/ref/international-address-formats.html

Esto no sólo ayuda en la búsqueda de duplicados, pero también le ahorra dinero al enviar que los clientes (los cargos por servicios postales menos si la dirección está en un formato estándar).

Dependiendo de su aplicación, en algunos casos es posible que desee almacenar un registro de dirección "vanidad", así como el registro de dirección estándar. Esto mantiene felices a sus clientes VIP. Una dirección "tocador" podría ser algo como:

62 West Noventa primera calle
Apartamento 4D
Manhattan, Nueva York, NY 10001

Mientras que la dirección estándar podría tener este aspecto:

62 W 91st St APT 4D
NUEVA YORK NY 10024-1414

2

Una cosa que usted podría querer mirar son Soundex búsquedas, que son muy útiles para las faltas de ortografía y contraindicaciones ctions.

Sin embargo, esto no es una validación en la base de datos, por lo que puede ser o no lo que estás buscando.

1

Para añadir una respuesta a mi propia pregunta:

Una forma diferente de hacerlo es pedir a los usuarios para su número de teléfono móvil, envíeles un mensaje de texto para su verificación. Esto detiene a la mayoría de las personas que juegan con direcciones duplicadas.

Estoy hablando desde mi experiencia personal. (¡Gracias pigsback!) Introdujeron la confirmación a través del teléfono móvil. ¡Eso me detuvo teniendo 2 cuentas! :-)

2

Otra posible solución (suponiendo que realmente necesite datos de dirección confiables y no solo está utilizando las direcciones como una forma de evitar cuentas duplicadas) es utilizar un servicio web de terceros para estandarizar las direcciones proporcionadas por su usuarios.

Funciona de esta manera: su sistema acepta la dirección de un usuario a través de un formulario en línea. Su formulario pasa de la dirección del usuario al servicio web de estandarización de direcciones de terceros. El servicio web le devuelve la misma dirección, pero ahora con los datos estandarizados en campos de direcciones discretas y con las abreviaturas y formatos estándar aplicados. Su aplicación muestra esta dirección estandarizada a su usuario para su confirmación antes de intentar guardar los datos en su base de datos.

Si todas las direcciones de usuario pasan por un paso de estandarización y solo las direcciones estandarizadas se guardan en su base de datos, la búsqueda de registros duplicados se debe simplificar enormemente ya que ahora está comparando manzanas con manzanas.

Uno de estos servicios de terceros es Global Address's Interactive Service que incluye a Alemania en la lista de países admitidos, y también tiene una demostración en línea que muestra cómo funciona su servicio (el enlace de demostración se puede encontrar en esa página web).

Hay una desventaja de costo para este enfoque, obviamente. Sin embargo, en el lado positivo:

  1. que no habría necesidad de crear y mantener su propia dirección de la estandarización de metadatos
  2. no será necesario para mejorar continuamente sus rutinas dirección de normalización, y
  3. eres libre para enfocar su energía de desarrollo de software en las partes de la aplicación que son exclusivas de sus requisitos

Descargo de responsabilidad: No trabajo con Global Address y no he intentado utilizar su servicio. Simplemente los menciono como un ejemplo, ya que tienen una demostración en línea con la que puedes jugar.

1

Me doy cuenta de que la publicación original es específica de las direcciones alemanas, pero esta es una buena pregunta para las direcciones en general.

En los Estados Unidos, hay una parte de una dirección llamada código de barras del punto de entrega. Es un número único de 12 dígitos que identifica un único punto de entrega y puede servir como el único identificador de una dirección. Para obtener este valor, querrá utilizar una API de servicio web de verificación de direcciones o estandarización de direcciones, que puede costar alrededor de $ 20/mes según el volumen de solicitudes que realice.

Con el interés de la divulgación completa, soy el fundador de SmartyStreets. Ofrecemos solo un address validation web service API llamado LiveAddress. Puede contactarme personalmente con cualquier pregunta que tenga.

-1

En mi opinión, si se asume que ya tenía una gran cantidad de datos sucios en su base de datos,

Tienes que hacer construir su "mano" filtro sucio que puede detectar un máximo de abreviación alemana ...

Pero si trata una gran cantidad de datos, se arriesgará a encontrar muestras falsas positivas y negativas verdaderas ...

Por último, un trabajo semi automatizado (máquina con asistencia humana cuando la probabilidad de un caso de falso positivo o verdadero negativo es demasiado alta) será la mejor solución.

Más trate la "excepción" (porque la excepción de aumento humano al llenar datos), más su filtro "hecho a mano" se ajustará a su requerimiento.

En el otro lado, también se puede utilizar un servicio de verificación de direcciones Alemania el lado del usuario, y almacenar únicamente la verificadas uno ...

0

estoy buscando una respuesta frente a Estados Unidos se refieren a

El tema en cuestión es evitar que los usuarios duplicados que entran como

Quellenstrasse 66/11 y Quellenstr. 66a-11

Esto sucede cuando su usuario ingresa la dirección completa en el cuadro de entrada.

Existen algunos métodos que puede utilizar para evitar esto.

1. formato uniforme usando expresiones regulares

  • Usted puede solicitar a los usuarios a introducir los datos en un formato uniforme.
  • Eso es muy eficiente mientras consulta también
  • prueba el valor introducido por el usuario contra algunas expresiones regulares y si falla, solicite al usuario que lo corrija.

2.Utilice una API de mapa como google maps y solicite al usuario que seleccione detalles de ella.

  • Si elige Google Maps, puede lograrlo utilizando la codificación inversa.

De Google Developer's guide,

El término geocodificación generalmente se refiere a la traducción de una dirección legible por humanos en una ubicación en un mapa. El proceso de hacer lo contrario, traducir una ubicación en el mapa en una dirección legible por el ser humano, se conoce como geocodificación inversa.

3. Permitir datos heterogéneos como se muestra en la pregunta y compararlos con diferentes formatos.

  • En la pregunta, el OP permite la dirección en un formato diferente.
  • En tal caso, puede cambiarlo a formularios diferentes y verificarlo con la base de datos para obtener una solución.
  • Esto puede llevar más tiempo y el tiempo depende por completo del número de casos de prueba.

4.Divida la dirección en diferentes partes y guárdela en db y proporciónela al usuario.

  • Esto le proporciona diferentes campos para almacenar Street, city, state, etc. en la base de datos.
  • También proporcione los diferentes campos de entrada al usuario para ingresar a calle, ciudad, estado, etc. en formato de arriba hacia abajo.
  • Cuando el usuario ingresa estado, restrinja la consulta para encontrar duplicados solo para ese estado.
  • Cuando el usuario ingresa ciudad, restrinjala solo a esa ciudad.
  • Cuando el usuario ingrese a la calle, acórtela a esa calle.

Y finalmente

  • Cuando el usuario introduce la dirección, el cambio a diferentes formatos y probarlo contra la base de datos.

Esto es eficaz incluso el número de casos de prueba puede alta, el número de entradas se prueba en contra será muy inferior y por lo que va a consumir menos cantidad de tiempo.

1

Machine learning y AI tiene algoritmos para encontrar similitudes de cadenas y medidas duplicadas.

Enlace de registro o la tarea de coincidencia de registros equivalentes que difieren sintácticamente: se exploró por primera vez a finales de la década de 1950 y 1960.

Puede representar cada par de registros utilizando un vector de características que describen la similitud entre los campos de registro individuales.

Por ejemplo, Detección de duplicados adaptables con Learnable String Medidas de similitud. por ejemplo, read this doc

  1. Usted puede utilizar métricas de distancia genéricos o sintonizados manualmente para estimar la similitud de los duplicados potenciales.

  2. Puede usar algoritmos adaptativos de coincidencia de nombres, como la métrica Jaro, que se basa en el número y el orden de los caracteres comunes entre dos cadenas.

  3. Distancia híbrida e híbrida. En tales casos, podemos convertir las cadenas 0 yen token multisectos (donde cada token es una palabra) y considerar las métricas de similitud en estos multiestratos.

0

En los EE. UU., Puede usar USPS Address Standardization Web Tool. Verifica y normaliza direcciones para usted. De esta forma, puede normalizar la dirección antes de verificar si ya existe en la base de datos. Si todas las direcciones en la base de datos ya están normalizadas, podrá detectar duplicados fácilmente.

URL de ejemplo:

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

Solicitud de muestra:

<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> 

respuestas de ejemplo:

<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> 

Otros países pueden tener sus propias APIs. Otras personas mencionaron API de terceros que admiten varios países que podrían ser útiles en algunos casos.

0

como Google buscar a suggesions para la búsqueda puede buscar campos de dirección de base de datos

En primer lugar, vamos a crear un index.htm (l) Archivo:

<!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> 

Ahora vamos a crear un archivo city.php cuales agregará nuestra consulta a MySQL DB y dará respuesta como JSON. Aquí está el código:

<?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); 
} 

?> 

y luego evitar guardar ellos en la base de datos si se encuentra duplicado en la columna de la tabla

Y para su código 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'); 
    } 
?> 
0

dirección del partido a direcciones proporcionada por DET BundesPost para detectar duplicados.

DET probablemente venda un CD como lo hace USA. El problema luego se convierte en coincidencia con las direcciones de Bundespost. Simplemente un largo proceso de sustitución de abreviaturas con las abreviaturas aprobadas y similares.

De la misma manera en Estados Unidos. Haga coincidir direcciones de USPostOffice (lo sentimos, cuestan dinero, por lo que no hay CD totalmente abiertos disponibles en la oficina de correos de EE. UU.) Para encontrar duplicados.

Cuestiones relacionadas