2008-09-01 3 views
17

Как найти дубликаты адресов в базе данных или лучше остановить людей уже при заполнении формы? Думаю, чем раньше, тем лучше?найти дубликаты адресов в базе данных, запретить пользователям вводить их раньше?

Есть ли хороший способ абстрагирования улицы, почтового индекса и т. Д., Чтобы можно было обнаружить опечатки и простые попытки получить 2 регистрации? как:

Quellenstrasse 66/11 
Quellenstr. 66a-11 

Я говорю немецкие адреса ... Спасибо!

+0

Я ищу ответ, адресованный адресам Соединенных Штатов – 2017-07-03 23:58:26

+0

Я решил ту же проблему в приложении для доставки, используя словарь общих ошибок с ошибками, каждый адрес проверяется через функцию карты, которая сравнивается со списком слова в словаре и исправления перед написанием в нашей БД. – datelligence 2017-07-10 15:55:09

ответ

5

Johannes:

@PConroy: Это был мой первоначальный thougt также. интересная часть этого - найти хорошие правила трансформации для разных частей адреса! Любые хорошие предложения?

Когда мы работали над этим типом проекта, прежде чем наш подход должен был принять наш существующий свод адресов (150k или так), а затем применить наиболее распространенные преобразования для нашего домена (Ирландия, так «Dr "->" Привод "," Rd "->" Дорога "и т. Д.). Я боюсь, что в то время не было исчерпывающего онлайн-ресурса для таких вещей, поэтому мы в итоге в основном придумали список, проверяя такие вещи, как телефонная книга (нажата на место там, адреса сокращены всеми способами!). Как я упоминал ранее, вы были бы удивлены, сколько «дубликатов» вы обнаружите, добавив лишь несколько общих правил!

Я недавно наткнулся на страницу с довольно полным list of address abbreviations, хотя это американский английский, поэтому я не уверен, насколько это было бы полезно в Германии! Быстрый google появился на нескольких сайтах, но они выглядели как спам-ловушки для подписчиков на рассылку новостей. Несмотря на то, что был я в английском прибегая к помощи, так что вы можете иметь больше смотреть с «Немецко адрес аббревиатур» на немецком :)

0

Часто вы используете ограничения в базе данных, чтобы обеспечить уникальность данных в смысле данных.

Что касается «изоморфизмов», я думаю, что вы сами по себе, то есть записываете код самостоятельно. Если в базе данных вы можете использовать триггер.

6

Чем раньше вы сможете остановить людей, тем легче будет в конечном итоге!

Не будучи слишком хорошо знакомы с вашей БД схемы или формы ввода данных, я хотел бы предложить маршрутную что-то вроде следующего:

  • имеют различные поля в вашем дб для каждого адреса «части», например, улица, город, почтовый индекс, земельные участки и т. д.

  • есть форма ввода данных с разбивкой аналогично, например. улица, город, и т.д.

Смысл вышесказанного в том, что каждая часть, скорее всего, имеют свои собственные особые «правила» для проверки слегка изменил своего решения, («Quellenstraße» - «Quellenstr»> «66/11 "->" 66a-11 "выше), поэтому ваш код проверки может проверить, существуют ли значения, представленные для каждого поля, в соответствующем поле db. Если нет, вы можете иметь класс, который применяет правила преобразования для каждого заданного поля (например, «strasse», связанный с «str») и снова проверяет дубликаты.

Очевидно, что выше метод его недостатки:

  • это может быть медленным, в зависимости от набора данных, в результате чего пользователь ждет

  • пользователи могут попытаться обойти его, поставив адрес " Части "в неправильных полях (добавление почтового кода в город и т. Д.). , но по опыту мы обнаружили, что введение даже простой проверки, как указано выше, не позволит большому проценту пользователей вводить ранее существовавшие адреса.

После того как вы базовая проверка на месте, вы можете посмотреть на оптимизацию БДА доступов требуется, уточнение правил и т.д., чтобы удовлетворить вашу конкретную схему. Вы также можете взглянуть на MySQL's match() function для разработки аналогичного текста.

10

Вы можете использовать Google GeoCode API

Wich в том, дает результаты для обоих ваших примеров, просто попробовал. Таким образом, вы получаете структурированные результаты, которые вы можете сохранить в своей базе данных. Если поиск не удался, попросите пользователя записать адрес по-другому.

2

Прежде чем приступать к поиску дублирующих адресов в базе данных, вы должны сначала убедиться, что вы храните адреса в стандартном формате.

Большинство стран имеют стандартный способ форматирования адресов, в США это система USPS CASS: http://www.usps.com/ncsc/addressservices/certprograms/cass.htm

Но большинство других стран имеют аналогичный сервис/стандарт. Попробуйте этот сайт для более международных форматов: http://bitboost.com/ref/international-address-formats.html

Это не только помогает в поиске дубликатов, но и экономит деньги при отправке вам клиентов (почтовые расходы службы меньше, если адрес находится в стандартном формате).

В зависимости от вашего приложения, в некоторых случаях вы можете захотеть сохранить запись адресата «суета», а также стандартную запись адреса. Это делает ваши VIP-клиенты счастливыми. А "тщеславие" адрес может быть что-то вроде:

62 West Девяносто First Street
Квартира 4D
Манхэттен, Нью-Йорк, Нью-Йорк 10001

Хотя стандартный адрес может выглядеть следующим образом:

62 W 91st ST APT 4D
NEW YORK NY 10024-1414

2

Одна вещь, вы можете захотеть взглянуть на это Soundex поисков, которые являются весьма полезными для орфографических и против ctions.

Это, однако, не проверка в базе данных, так что это может быть или не быть тем, что вы ищете.

1

Чтобы добавить ответ на свой вопрос:

Другой способ сделать это, это попросить пользователей для их номера мобильного телефона, отправьте им текстовое сообщение для проверки. Это мешает большинству людей возиться с дублирующимися адресами.

Я говорю из личного опыта. (спасибо pigsback!) Они представили подтверждение через мобильный телефон. Это остановило меня, имея 2 счета! :-)

2

Другое возможное решение (при условии, что вам действительно нужны надежные адресные данные, и вы не просто используете адреса, чтобы предотвратить дублирование учетных записей) заключается в использовании сторонней веб-службы для стандартизации адресов, предоставляемых вашим пользователи.

Это работает так: ваша система принимает адрес пользователя через онлайн-форму. Ваша форма передает адрес пользователя веб-службе стандартизации сторонних адресов. Веб-служба возвращает вам тот же адрес, но теперь с данными, стандартизованными в поля дискретного адреса, и со стандартными аббревиатурами и форматами. Ваше приложение отображает этот стандартизованный адрес вашему пользователю для подтверждения, прежде чем пытаться сохранить данные в вашей БД.

Если все пользовательские адреса проходят этап стандартизации, и только стандартные адреса сохраняются в вашей БД, тогда поиск дублирующих записей должен быть значительно упрощен, так как теперь вы сравниваете яблоки с яблоками.

Один из таких сторонних сервисов - Global Address's Interactive Service, который включает в себя Германию в списке поддерживаемых стран, а также демонстрационную онлайн-демонстрацию, демонстрирующую, как работает их сервис (демонстрационная ссылка может быть найдена на этой веб-странице).

Очевидно, что для этого подхода существует недостаток затрат. Однако, на положительной стороне:

  1. вам не нужно будет создавать и поддерживать свои собственные метаданные адреса стандартизации
  2. вам не нужно будет постоянно улучшать свои подпрограммы адреса стандартизации и
  3. вы свободны сосредоточить свою энергию разработки программного обеспечения на тех частях приложения, которые уникальны по вашим требованиям.

Отказ от ответственности: Я не работаю для Глобального адреса и не пробовал использовать их услуги. Я просто упоминаю их как пример, так как у них есть онлайн-демоверсия, с которой вы можете играть.

1

Я понимаю, что исходное сообщение предназначено для немецких адресов, но это хорошие вопросы для адресов в целом.

В Соединенных Штатах есть часть адреса, называемого штрих-кодом точки доставки. Это уникальный 12-значный номер, который идентифицирует единую точку доставки и может служить уникальным идентификатором адреса. Чтобы получить это значение, вы захотите использовать API веб-сервиса для проверки адреса или стандартизации адресов, который может стоить около 20 долларов США в месяц в зависимости от объема запросов, которые вы ему делаете.

В интересах полного раскрытия информации я являюсь основателем SmartyStreets. Мы предлагаем именно такой address validation web service API под названием LiveAddress. Вы более чем можете лично связаться со мной по любым вопросам, которые у вас есть.

-1

На мой взгляд, при условии, что у вас уже было много грязных данных в вашей БД,

Вы должны сделать построить свой «ручной» грязный фильтр, который может обнаружить максимум немецкого ... языке Генеральный Общие Аббревиатура

Но если вы обрабатываете много данных, вы рискуете найти ложноположительный и истинный отрицательный образец ...

Наконец-то полуавтоматическое задание (машина с человеческим помощником, когда вероятность ложноположительного или истинного отрицательного слишком высока) будет лучшим решением.

Больше вы относитесь к «исключению» (потому что исключение человеческого повышения при заполнении данных), более ваш «ручной» фильтр будет соответствовать вашему требованию.

В другой стороны, вы также можете использовать услугу проверки адреса Германии на стороне пользователя, и хранить только проверенные один ...

0

Я ищу ответ адресации США адреса

проблема в вопросе запретить пользователь вступающих дубликатов как

Quellenstrasse 66/11 и Quellenstr. 66a-11

Это происходит, когда вы позволяете своему пользователю вводить полный адрес в поле ввода.

Есть несколько способов, которые можно использовать для предотвращения этого.

1. Равномерное форматирование с помощью регулярных выражений

  • Вы можете подсказать пользователям ввести данные в едином формате.
  • Это очень эффективно при запросе
  • проверить введенное пользователем значение в отношении некоторых регулярных выражений, а в случае неудачи попросить его исправить.

2.Используйте карту api, как google maps, и попросите пользователя выбрать детали.

  • Если вы выберете карты Google, вы можете достичь этого, используя обратное геокодирование.

От Google Developer's guide,

Термина геокодирование обычно относится к переводу удобочитаемого адреса в местоположение на карте. Процесс выполнения противоположного, переводящего местоположение на карту в удобочитаемый для человека адрес, известен как обратное геокодирование.

3. Разрешите использовать гетерогенные данные, как показано на вопрос, и сравнить его с другим форматированием.

  • В вопросе адрес разрешения допускается в другом формате.
  • В таком случае вы можете изменить его на разные формы и проверить его с помощью базы данных, чтобы получить решение.
  • Это может занять больше времени, и время полностью зависит от количества тестовых случаев.

4.Разделите адрес на разные части и сохраните его в db и предоставите такую ​​форму пользователю.

  • Это база данных, в которой хранятся данные об Улице, городе, штате и т. Д.
  • Также укажите различные поля ввода для ввода улицы, города, штата и т. Д. В формате сверху вниз.
  • Когда пользователь вводит состояние, сушите запрос, чтобы найти дубликатов только в этом состоянии.
  • Когда пользователь вводит город, сужайте его только в этом городе.
  • Когда пользователь входит на улицу, сушите ее до этой улицы.

И наконец

  • Когда пользователь вводит адрес, изменить его в различные форматы и протестировать его против базы данных.

Это эффективно даже количество тестовых случаев может высоким, количество записей вы проверяете против будет очень меньше и поэтому он будет потреблять очень меньшее количество времени.

1

Машиноведение и ИИ имеют алгоритмы для поиска строковых сходств и дублирующих мер.

Запись связи или задача сопоставления эквивалентных записей , которые отличаются синтаксически - были впервые исследованы в конце 1950-х годов и в 1960-х годах.

Вы можете представлять каждую пару записей, используя вектор , которые описывают сходство между отдельными полями записи.

Например, адаптивное повторное обнаружение с использованием обучаемой строки Мнения об сходстве. например, read this doc

  1. Вы можете использовать общие или вручную настроены показатели расстояния для оценки сходства потенциальных дублей.

  2. Вы можете использовать алгоритмы сопоставления адаптивных имен, такие как метрика Jaro, которая основана на количестве и порядке общих символов между двумя строками.

  3. Token-based и hybrid distance. В таких случаях мы можем преобразовать строки s и t в мультисентеры-маркеры (где каждый токен - это слово) и рассмотреть метрики подобия на этих мультимножествах.

0

В США вы можете использовать USPS Address Standardization Web Tool. Он проверяет и нормализует адреса для вас. Таким образом, вы можете нормализовать адрес, прежде чем проверять, существует ли он в базе данных. Если все адреса в базе данных уже нормализованы, вы сможете легко найти дубликаты.

Пример URL:

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

Пример запроса:

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

Пример ответа:

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

Другие страны могут иметь свои собственные API. Другие люди упомянули сторонние API, которые поддерживают несколько стран, которые могут быть полезны в некоторых случаях.

0

Как Google выборки suggesions поиска вы можете искать адреса базы данных полей

во-первых, давайте создадим index.htm (л) Файл:

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

Теперь создадим файл city.php, который будет агрегировать наш запрос в MySQL DB и дать ответ как JSON. Вот код:

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

?> 

, а затем предотвратить сохранение их в базе данных, если найден дубликат в таблице колонки

И для кода 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

спичек адрес для адресов обеспечивается DET BundesPost для обнаружения дубликатов.

DET, вероятно, продает компакт-диск, подобный США. Затем проблема становится совпадающей с адресами Bundespost. Просто долгий процесс замены аббревиатур на одобренные должности сокращения и т. Д.

То же самое в США. Совпадение с адресами USPostOffice (Извините, эти деньги, поэтому его не полностью открытые компакт-диски доступны в почтовом отделении США), чтобы найти дубликаты.

 Смежные вопросы

  • Нет связанных вопросов^_^