如何在數據庫中查找重複地址,或者在填寫表單時更好地阻止其他人?我猜越早越好?在數據庫中發現重複地址,請阻止用戶儘早輸入地址?
是否有任何抽象街道,郵政編碼等良好的方式,使錯別字和簡單的嘗試獲得2註冊可以被發現?像:
Quellenstrasse 66/11
Quellenstr. 66a-11
我在說德語地址... 謝謝!
如何在數據庫中查找重複地址,或者在填寫表單時更好地阻止其他人?我猜越早越好?在數據庫中發現重複地址,請阻止用戶儘早輸入地址?
是否有任何抽象街道,郵政編碼等良好的方式,使錯別字和簡單的嘗試獲得2註冊可以被發現?像:
Quellenstrasse 66/11
Quellenstr. 66a-11
我在說德語地址... 謝謝!
約翰內斯:
@PConroy:這是我最初的thougt也。有趣的部分是爲地址的不同部分找到好的轉換規則!有什麼好的建議?
當我們對這種類型的項目前工作,我們的方法是把我們現有的地址的語料庫(150K左右),然後應用最普遍的轉變對我們的域名(愛爾蘭,所以「博士「 - >」駕駛「,」路「 - >」道路「等)。恐怕目前還沒有這方面的綜合在線資源,所以我們最終基本上自己提出了一個清單,檢查電話簿等內容(在那裏按空格,地址以各種方式縮寫! )。正如我前面提到的,只有少數常用規則的添加,您會驚訝地發現您會檢測到多少「重複」!
我最近在頁面上偶然發現了一個相當全面的list of address abbreviations,雖然它的美式英語,所以我不知道它會多麼有用在德國!快速谷歌出現了幾個網站,但他們似乎像垃圾郵件通訊註冊陷阱。雖然這是我在谷歌上搜索英文,所以你可能在德國:)「德國地址縮寫」多看
通常情況下,您在數據庫中使用約束來確保數據在基於數據的意義上是「唯一」的。
關於「同構」,我認爲你是你自己的,即寫你的自我代碼。如果在數據庫中可以使用觸發器。
越早可以阻止他人,從長遠來看越容易!
不是太熟悉你的數據庫架構或數據輸入表單,我建議的路線類似以下內容:
有不同的領域在你的數據庫爲每個地址「部分」,如街道,城市,郵政編碼,各州等。
你的數據輸入表格也有類似的細分。街道,城市等
上述背後的原因是,每個部分將有可能是稍微改變了解決,(「Quellenstrasse」自己特定的「規則」檢查 - 「 Quellenstr」>,「66/11「 - >」66a-11「),因此您的驗證碼可以檢查每個字段的值是否存在於其各自的db字段中。如果不是,您可以有一個類將每個給定字段的轉換規則(例如「strasse」應用於「str」)並再次檢查重複項。
顯然,上述方法有它的缺點:
它可能會很慢,這取決於你的數據集,讓用戶等待
用戶可能會嘗試通過把地址繞過它「部分「放在錯誤的字段中(將郵編附加到城市等)。 ,但根據經驗我們發現,即使像上面這樣簡單的檢查,也會阻止大部分用戶輸入預先存在的地址。
一旦基本檢查到位,您可以查看優化所需的數據庫訪問,細化規則等以滿足特定模式。你也可以看看MySQL's match() function來制定類似的文字。
您可以使用Google GeoCode API
至極實際上給出了兩個例子的結果,剛剛試了一下。這樣你可以得到結構化的結果,你可以保存在你的數據庫中。如果查找失敗,請讓用戶以另一種方式寫入地址。
在開始搜索數據庫中的重複地址之前,首先應確保以標準格式存儲地址。
大多數國家都格式化地址的標準方法,在美國它是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
你可能想要看的一件事是Soundex搜索,這對於拼寫錯誤和反對是非常有用的ctions。
但這不是數據庫驗證,所以它可能會或可能不是你要找的。
要的答案添加到我自己的問題:
做不同的方式是要求用戶爲他們的手機號碼,發送一個文本消息進行驗證。這阻止了大多數人搞亂重複地址。
我正在談論個人經驗。 (感謝pigsback!)他們通過手機引入了確認。這阻止了我有2個帳戶! :-)
另一種可能的解決方案(假設你的實際需要可靠的地址數據和你不只是使用的地址,以此來防止重複帳戶)是使用第三方Web服務規範所提供的地址,你的用戶。
是這樣工作的 - 你的系統通過在線的形式接受用戶的地址。您的表單將用戶的地址提交給第三方地址標準化Web服務。網絡服務爲您提供相同的地址,但現在將數據標準化爲離散地址字段,並且使用標準縮寫和格式。在嘗試將數據保存到數據庫之前,應用程序會向用戶顯示此標準化地址以進行確認。
如果所有的用戶地址,經過一個標準化的步驟,只有標準化的地址保存到您的數據庫,然後找到重複的記錄,應大大簡化,因爲你現在比較蘋果和蘋果。
一個這樣的第三方服務是Global Address's Interactive Service其中包括德國在支持國家列表,並且還有一個在線演示,演示了他們的服務如何工作(演示鏈接可以在該網頁上找到)。
顯然,這種方法存在成本劣勢。不過,從好的方面:
聲明:我不爲Global Address工作,也沒有嘗試過使用他們的服務。我只是把它們作爲一個例子提及,因爲他們有一個在線演示,你可以真正玩。
我意識到,原來的職位是特異性德國地址,但是這是地址的好問題一般。
在美國,有一個叫送點條形碼的地址的一部分。這是一個唯一的12位數字,用於標識一個交付地點,並且可以作爲地址的唯一標識符。要獲得此值,您需要使用地址驗證或地址標準化Web服務API,根據您對其的請求量,花費約20美元/月。
在充分披露的利益,我SmartyStreets的創始人。我們提供這樣一個叫做LiveAddress的address validation web service API。如果您有任何問題,歡迎您親自與我聯繫。
在我看來,假設你已經有很多在你的數據庫髒數據,
你要做的構建「手工製作」骯髒的過濾器,其最大的德國縮寫符號的可檢測...
但是,如果您處理大量數據,您將冒險找到一些假陽性和真陰性樣本......
最後一個半自動化作業(機器人爲輔助時,假陽性或真陰性的概率太高)將是最好的解決方案。
更多你對待「異常」(因爲人類在填充數據時引發異常),更多的「手工製造」過濾器將適合你的需求。
在另一方面,你也可以在用戶端使用一個德國的地址驗證服務,並且只存儲驗證一個...
機器學習和人工智能有找到字符串相似性和重複措施的算法。
記錄鏈接或匹配等效記錄 任務語法不同的任務 - 首先在20世紀50年代後期 和20世紀60年代探討。
可以代表每對使用 功能描述各個記錄字段之間的相似性的向量記錄。
例如,自適應重複檢測使用可學習字符串 相似度量。例如,read this doc
可以使用通用的或手動調諧的距離度量用於估計可能重複的相似性。
可以使用自適應名稱匹配算法,如哈羅度量,它是基於兩個串之間的數和普通字符順序。
基於令牌和混合距離。在這種情況下,我們可以將 字符串s和t轉換爲令牌多重集(每個令牌都是一個單詞)並考慮這些多重集上的相似性度量。
在美國,您可以使用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,在某些情況下可能有用。
由於谷歌抓取搜索可以搜索數據庫地址字段
首先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');
}
?>
匹配地址地址提供DET BundesPost檢測重複。
DET很可能像美國一樣銷售CD。問題然後變成與Bundespost地址匹配。用批准的縮寫等取代縮寫詞的過程很漫長。
同樣的方式在美國。與USPostOffice地址相匹配(對不起,這些花費的錢,所以它沒有完全開放的CD可從美國郵局)找到重複。
我正在尋找一個解答美國地址 – 2017-07-03 23:58:26
我已經解決了相同的問題,在交付應用程序中,使用常見拼寫錯誤的字典,每個地址都通過映射函數進行檢查,該函數與在我們的數據庫中寫入之前,在字典中進行修改。 – datelligence 2017-07-10 15:55:09