Находить повторяющиеся адреса в базе данных, не позволять пользователям вводить их раньше времени?

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

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

Quellenstrasse 66/11 
Quellenstr. 66a-11

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

Ищу ответ по адресам в США

Alex Gordon 04.07.2017 02:58

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

digitai 10.07.2017 18:55
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
16
2
5 394
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

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

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

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

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

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

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

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

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

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

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

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

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

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

В условиях API Google GeoCode указано, что использование API без отображения результатов на карте запрещено. См. «Ограничения использования» на developers.google.com/maps/documentation/geocoding/index

Ryan 04.10.2012 04:45

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

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

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

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

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

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

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

62 W 91ST СТ APT 4D
НЬЮ-ЙОРК, штат Нью-Йорк, 10024-1414

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

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

Ответ принят как подходящий

Johannes:

@PConroy: This was my initial thougt also. the interesting part on this is to find good transformation rules for the different parts of the address! Any good suggestions?

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

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

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

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

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

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

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

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

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

Очевидно, что у такого подхода есть недостаток стоимости. Однако есть и положительные моменты:

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

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

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

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

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

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

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

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

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

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

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

I'm looking for an answer addressing United States addresses

Проблема в том, что пользователи не могут вводить дубликаты, например

Quellenstrasse 66/11 and Quellenstr. 66a-11

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

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

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

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

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

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

От Руководство разработчика Google,

The term geocoding generally refers to translating a human-readable address into a location on a map. The process of doing the opposite, translating a location on the map into a human-readable address, is known as reverse geocoding.

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

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

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

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

И наконец

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

This is efficient even the number of test cases may high, the number of entries you test against will be very less and so it will consume very less amount of time.

У машинного обучения и искусственного интеллекта есть алгоритмы для поиска сходства строк и повторяющихся показателей.

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

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

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

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

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

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

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

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

Как подсказки 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 и давать ответ в виде 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');
    }
?>

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

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

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

Другие вопросы по теме