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

16

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

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

Quellenstrasse 66/11 
Quellenstr. 66a-11

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

    
задан Johannes 01.09.2008 в 09:30
источник
  • Я ищу ответ, адресованный адресам Соединенных Штатов –  l--''''''---------'''''''''''' 04.07.2017 в 01:58
  • Я решил ту же проблему в приложении для доставки, используя словарь общих ошибок орфографической ошибки, каждый адрес проверяется с помощью функции карты, которая сравнивается со списком слов в словаре и исправляется до написания в нашей БД. –  datelligence 10.07.2017 в 17:55

15 ответов

4
  

Johannes:

     
    

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

  

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

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

    
ответ дан ConroyP 01.09.2008 в 11:05
10

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

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

    
ответ дан Espo 01.09.2008 в 09:58
  • Термины в API Google GeoCode утверждают, что использование API без отображения результатов на карте запрещено. См. «Пределы использования» на странице developers.google.com/maps/documentation/geocoding/index. –  Ryan 04.10.2012 в 02:45
6

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

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

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

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

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

Очевидно, что вышеупомянутый метод имеет свои недостатки:

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

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

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

    
ответ дан ConroyP 01.09.2008 в 09:52
2

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

В большинстве стран есть стандартный способ форматирования адресов, в США это система USPS CASS: Ссылка

Но большинство других стран имеют аналогичный сервис / стандарт. Попробуйте этот сайт для более международных форматов: Ссылка

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

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

62 Западная девяносто первая улица
Апартаменты 4D
Манхэттен, Нью-Йорк, Нью-Йорк 10001

Хотя стандартный адрес может выглядеть так:

62 W 91ST ST APT 4D
НЬЮ-ЙОРК NY 10024-1414

    
ответ дан urini 01.09.2008 в 10:31
2

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

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

    
ответ дан Jon Limjap 01.09.2008 в 10:34
2

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

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

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

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

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

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

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

    
ответ дан mdy 02.09.2008 в 10:44
1

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

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

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

    
ответ дан Johannes 01.09.2008 в 11:24
1

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

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

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

    
ответ дан Jonathan Oliver 13.10.2011 в 03:49
1

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

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

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

Например, Adaptive Duplicate Detection с помощью Learnable String Меры сходства. например, прочитайте этот документ

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

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

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

ответ дан Tal Avissar 04.07.2017 в 22:58
0

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

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

    
ответ дан svrist 01.09.2008 в 09:44
0
  

Я ищу ответ, адресованный адресам Соединенных Штатов.

Данная проблема не позволяет пользователям вводить дубликаты, например

  

Quellenstrasse 66/11 и     % Co_de%

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

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

1. Равномерное форматирование с использованием RegEx

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

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

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

В руководстве разработчика Google ,

  

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

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

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

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

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

И наконец

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

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

    
ответ дан Sagar V 04.07.2017 в 07:47
0

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

Пример URL:

Ссылка

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

<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, которые поддерживают несколько стран, которые могут быть полезны в некоторых случаях.

    
ответ дан kichik 05.07.2017 в 22:26
0

В качестве предложений google fetch для поиска вы можете искать поля адресов базы данных

Сначала давайте создадим файл 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>

Теперь мы создадим файл 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');
    }
?>
    
ответ дан Muhammad Muazzam 08.07.2017 в 15:23
0

Соответствует адресу, указанному DET BundesPost, для обнаружения дубликатов.

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

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

    
ответ дан danny117 10.07.2017 в 16:13
-1

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

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

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

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

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

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

    
ответ дан A STEFANI 04.07.2017 в 01:38