2008-09-01 40 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

約翰內斯:

@PConroy:這是我最初的thougt也。有趣的部分是爲地址的不同部分找到好的轉換規則!有什麼好的建議?

當我們對這種類型的項目前工作,我們的方法是把我們現有的地址的語料庫(150K左右),然後應用最普遍的轉變對我們的域名(愛爾蘭,所以「博士「 - >」駕駛「,」路「 - >」道路「等)。恐怕目前還沒有這方面的綜合在線資源,所以我們最終基本上自己提出了一個清單,檢查電話簿等內容(在那裏按空格,地址以各種方式縮寫! )。正如我前面提到的,只有少數常用規則的添加,您會驚訝地發現您會檢測到多少「重複」!

我最近在頁面上偶然發現了一個相當全面的list of address abbreviations,雖然它的美式英語,所以我不知道它會多麼有用在德國!快速谷歌出現了幾個網站,但他們似乎像垃圾郵件通訊註冊陷阱。雖然這是我在谷歌上搜索英文,所以你可能在德國:)「德國地址縮寫」多看

0

通常情況下,您在數據庫中使用約束來確保數據在基於數據的意義上是「唯一」的。

關於「同構」,我認爲你是你自己的,即寫你的自我代碼。如果在數據庫中可以使用觸發器。

6

越早可以阻止他人,從長遠來看越容易!

不是太熟悉你的數據庫架構或數據輸入表單,我建議的路線類似以下內容:

  • 有不同的領域在你的數據庫爲每個地址「部分」,如街道,城市,郵政編碼,各州等。

  • 你的數據輸入表格也有類似的細分。街道,城市等

上述背後的原因是,每個部分將有可能是稍微改變了解決,(「Quellenstrasse」自己特定的「規則」檢查 - 「 Quellenstr」>,「66/11「 - >」66a-11「),因此您的驗證碼可以檢查每個字段的值是否存在於其各自的db字段中。如果不是,您可以有一個類將每個給定字段的轉換規則(例如「strasse」應用於「str」)並再次檢查重複項。

顯然,上述方法有它的缺點:

  • 它可能會很慢,這取決於你的數據集,讓用戶等待

  • 用戶可能會嘗試通過把地址繞過它「部分「放在錯誤的字段中(將郵編附加到城市等)。 ,但根據經驗我們發現,即使像上面這樣簡單的檢查,也會阻止大部分用戶輸入預先存在的地址。

一旦基本檢查到位,您可以查看優化所需的數據庫訪問,細化規則等以滿足特定模式。你也可以看看MySQL's match() function來制定類似的文字。

10

您可以使用Google GeoCode API

至極實際上給出了兩個例子的結果,剛剛試了一下。這樣你可以得到結構化的結果,你可以保存在你的數據庫中。如果查找失敗,請讓用戶以另一種方式寫入地址。

2

在開始搜索數據庫中的重複地址之前,首先應確保以標準格式存儲地址。

大多數國家都格式化地址的標準方法,在美國它是USPS CASS系統:http://www.usps.com/ncsc/addressservices/certprograms/cass.htm

但大多數其他國家也有類似的服務/標準。試試這個網站更多的國際格式: http://bitboost.com/ref/international-address-formats.html

這不僅有助於找到重複,但也節省了你的郵寄客戶時郵寄服務費(如果地址是標準格式)費用。

根據您的應用程序,在某些情況下,您可能需要存儲「虛擬」地址記錄以及標準地址記錄。這可以讓您的VIP客戶滿意。 A 「虛榮」 地址可能是這樣的:

62西九一街
公寓4D
曼哈頓,紐約,NY 10001

雖然標準的地址可能是這樣的:

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

2

你可能想要看的一件事是Soundex搜索,這對於拼寫錯誤和反對是非常有用的ctions。

但這不是數據庫驗證,所以它可能會或可能不是你要找的。

1

要的答案添加到我自己的問題:

做不同的方式是要求用戶爲他們的手機號碼,發送一個文本消息進行驗證。這阻止了大多數人搞亂重複地址。

我正在談論個人經驗。 (感謝pigsback!)他們通過手機引入了確認。這阻止了我有2個帳戶! :-)

2

另一種可能的解決方案(假設你的實際需要可靠的地址數據和你不只是使用的地址,以此來防止重複帳戶)是使用第三方Web服務規範所提供的地址,你的用戶。

是這樣工作的 - 你的系統通過在線的形式接受用戶的地址。您的表單將用戶的地址提交給第三方地址標準化Web服務。網絡服務爲您提供相同的地址,但現在將數據標準化爲離散地址字段,並且使用標準縮寫和格式。在嘗試將數據保存到數據庫之前,應用程序會向用戶顯示此標準化地址以進行確認。

如果所有的用戶地址,經過一個標準化的步驟,只有標準化的地址保存到您的數據庫,然後找到重複的記錄,應大大簡化,因爲你現在比較蘋果和蘋果。

一個這樣的第三方服務是Global Address's Interactive Service其中包括德國在支持國家列表,並且還有一個在線演示,演示了他們的服務如何工作(演示鏈接可以在該網頁上找到)。

顯然,這種方法存在成本劣勢。不過,從好的方面:

  1. 你不會需要創建和維護自己的地址標準化元數據
  2. 你不會需要不斷提高你的地址標準化例程和
  3. 你是自由的將您的軟件開發精力集中在您的需求所特有的應用程序部分上

聲明:我不爲Global Address工作,也沒有嘗試過使用他們的服務。我只是把它們作爲一個例子提及,因爲他們有一個在線演示,你可以真正玩。

1

我意識到,原來的職位是特異性德國地址,但是這是地址的好問題一般。

在美國,有一個叫送點條形碼的地址的一部分。這是一個唯一的12位數字,用於標識一個交付地點,並且可以作爲地址的唯一標識符。要獲得此值,您需要使用地址驗證或地址標準化Web服務API,根據您對其的請求量,花費約20美元/月。

在充分披露的利益,我SmartyStreets的創始人。我們提供這樣一個叫做LiveAddress的address validation web service API。如果您有任何問題,歡迎您親自與我聯繫。

-1

在我看來,假設你已經有很多在你的數據庫髒數據,

你要做的構建「手工製作」骯髒的過濾器,其最大的德國縮寫符號的可檢測...

但是,如果您處理大量數據,您將冒險找到一些假陽性和真陰性樣本......

最後一個半自動化作業(機器人爲輔助時,假陽性或真陰性的概率太高)將是最好的解決方案。

更多你對待「異常」(因爲人類在填充數據時引發異常),更多的「手工製造」過濾器將適合你的需求。

在另一方面,你也可以在用戶端使用一個德國的地址驗證服務,並且只存儲驗證一個...

1

機器學習和人工智能有找到字符串相似性和重複措施的算法。

記錄鏈接或匹配等效記錄 任務語法不同的任務 - 首先在20世紀50年代後期 和20世紀60年代探討。

可以代表每對使用 功能描述各個記錄字段之間的相似性的向量記錄。

例如,自適應重複檢測使用可學習字符串 相似度量。例如,read this doc

  1. 可以使用通用的或手動調諧的距離度量用於估計可能重複的相似性。

  2. 可以使用自適應名稱匹配算法,如哈羅度量,它是基於兩個串之間的數和普通字符順序。

  3. 基於令牌和混合距離。在這種情況下,我們可以將 字符串s和t轉換爲令牌多重集(每個令牌都是一個單詞)並考慮這些多重集上的相似性度量。

0

在美國,您可以使用USPS Address Standardization Web Tool。它會爲您驗證並規範地址。這樣,您可以在檢查地址是否已經存在於數據庫中之前對地址進行規範化。如果數據庫中的所有地址都已經過標準化,則可以輕鬆地找到重複項。

樣品網址:

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

由於谷歌抓取搜索可以搜索數據庫地址字段

首先suggesions,讓我們創建一個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'); 
    } 
?> 
0

匹配地址地址提供DET BundesPost檢測重複。

DET很可能像美國一樣銷售CD。問題然後變成與Bundespost地址匹配。用批准的縮寫等取代縮寫詞的過程很漫長。

同樣的方式在美國。與USPostOffice地址相匹配(對不起,這些花費的錢,所以它沒有完全開放的CD可從美國郵局)找到重複。