所以我有一些包含名稱、地址和郵遞區號的表,沒有附加記錄資料;我有一個表,其中包含所有相同的內容,但包含更多信息,我需要一種在表不 100% 匹配時合併表的方法。
如果它們不相同,我該如何匹配它們?我是 SQL 新手,但我知道它們在大多數情況下不會匹配,而且我不能是唯一遇到此問題的人。然而,實現這一點的軟體已被證明是困難的。
編寫軟體來做到這一點甚至比一開始就必須這樣做更糟糕。
我知道我可以在 Excel 中做到這一點;有點,但事實證明,記錄數量超過一百萬是很困難的。
答案1
我曾經在一家資料庫行銷公司工作(很抱歉向您發送垃圾郵件)。我們的工作是確定「Robert Jones 671 Kimbrough SPFD MO 65802」是否與「Bobbie Joanes 671 Kimbrough St. Sprinfield MO 65809」相同,如果我們沒有匹配,我們就有向潛在客戶發送重複郵件的風險這會讓我們的客戶看起來很愚蠢並且浪費他們的錢。
我們的方法是將問題分解為較小的領域,並應用不同的標準來回答 A大概B. 匹配規則太嚴格,你將無法捕獲重複項。配對規則太寬鬆,您就會拋棄潛在客戶。
我們有實體可以匹配的三個域:名稱、聯絡方式、關係。僅當我們在兩個域之間進行匹配時才允許匹配。
聯絡方式
聯絡方式是郵件、電子郵件或電話。
地址
第一步是標準化所提供的地址。最終目標是獲取您的輸入地址並將其更正為美國郵政局標準。在前面的範例中,兩個地址都可能會收到發送給他們的郵件,但這只是因為郵政承運人了解寄件者的意圖。真實地址是
671 S 金布羅大街 斯普林菲爾德 MO 65806-3342
一旦有了一致的地址,地址匹配問題就更容易解決。您仍然需要擔心不可糾正的地址以及多租戶位置(Suite 200、Apt B 等)的規則,但這是您需要與企業主一起制定的微調的一部分。哦,儘管 +4 數字很方便遞送,但不要讓這些因素影響您的地址匹配邏輯。這些比 5 位數郵遞區號更容易改變。
另一件需要記住的事情是,人們會搬家,因此如果您擁有當前地址資料很重要,那麼您可以獲得過去 X 個時間範圍內的地址轉發資訊(NCOA - 國家地址變更)。當您搬家時,地址轉發文書工作僅在一段時間內有效,在該視窗之後向您發送郵件的任何人都會收到「返回寄件者」訊息,而不是在此地址退回郵件。在發送郵件之前進行 NCOA 處理可以確保您擁有當前地址,即使轉寄已過期也是如此。
我們的方法是根據標準化地址(第 1 行 + 郵遞區號)產生雜湊值,並將其用作比較鍵。
電話
關於電話的唯一棘手的事情是他們是否有與之關聯的區號。我們在儲存它們時沒有分隔符號或格式,任何副檔名都是單獨儲存的。這歸結為 7 或 10 位數的電話號碼。如果我們有地址,就有軟體可以通常填寫區號。當區號分裂時,通常會有一個寬限期,其中一個位置可以由 2 個(或更多)區號提供服務。
電子郵件
一般來說,電子郵件地址要么匹配,要么不匹配。當我們真的非常渴望嘗試匹配時,我們會清理資料。這涉及查看網域並確保它們存在,如果不存在則添加頂級網域。如果我們看到 joan@aol,那麼可以肯定他們的意思是 @aol.com 您可以用來增加電子郵件匹配的另一個技巧是當他們在地址中使用 + 時。一些提供者(例如Google)允許[電子郵件受保護]被傳送到基底地址。我發現將電子郵件地址與我註冊的特定網站關聯起來是一種有用的方法。如果垃圾郵件開始流入該帳戶,那麼我就知道我可以嚼誰的屁股了。但是,出於匹配目的,您可以丟棄 + 到 @ 的內容
名稱
“名字有什麼含義?我們稱之為瓊斯的任何其他拼寫都可能是同一個人”
威廉·馬奇斯皮爾
我們發現需要對名稱執行兩種不同類型的匹配。企業或實體名稱以及個人姓名。美國名字可能有前綴(先生、夫人、博士、Fr、Sen、Sgt 等)、名字、中間名、第二個中間名或父親姓氏、姓氏/母親姓氏、世代(Jr、Sr、IV) )、專業/榮譽/學術(MBA、JD、PhD、esq 等)。這不是很有趣嗎?
只要在各個部分中捕獲數據,情況通常不會那麼糟糕。否則,如果您假設可以通過空格分割來確定名稱部分,那麼您可能會得到奇怪的結果,正如我姓“de los santos”的朋友可以證明的那樣。
公司名稱,通常就是他們給你的。 DBA 做生意時需要注意的事情。 “Soulless megacorporation LLC DBA Happy cuddly puppy Reserve”可能需要匹配“Happy cuddly puppy Reserve”和/或“Soulless Megacorporation”
姓名匹配
個人姓名匹配的第一步是聲學。它通常在 RDBMS 中可用,並且根據您的輸入數據,它可能也可以通過。 soundex 的問題在於它只適用於歐洲名稱的子集。我們使用的一種更聰明的語音方法是雙變音位演算法.這為字串匹配提供了更好的結果。
在上面的範例中,Jones 與 Joanes 的精確匹配將會失敗,但語音匹配應該會成功。但問題是我們有鮑比和羅伯特。無論怎麼想都不會讓這兩個聽起來很相似,但客戶堅持認為我們錯過了匹配,所以我們添加了另一組檢查以將暱稱擴展到其完整值,然後重新進行比較。
在公司名稱比較中,我們發現編制“停用詞" - 名稱中出現的無意義的內容,但出於匹配目的應被忽略(a、of、the、LLC、corp、univ、university)
然後我們收到的回饋是「簡單」的拼字錯誤、字母的換位或遺漏導致了不匹配的實體。隨著這個答案越來越長,我們也收到了有關公司名稱匹配失敗的回饋,例如「Johnsusedtirebarn」到「Johnsmegausedtirebarn」等實體。我們最終實施了一個n 元語法比較以及令牌比較演算法來幫助解決這些情況。此後我與業內其他人進行了交談,他們是使用的支持者編輯距離用於確定字串匹配。
關係
關係基本上是我們知道真實的其他東西。一家公司開展了一項促銷活動,銷售人員透過讓客戶填寫商業回信卡獲得了豐厚的回報。我們有「約翰的舊輪胎穀倉」員工名單,我們需要將不完整的姓名資料與該參考集關聯起來。我在這裡只是為了完整性而談論。對於您的問題,您將查看名稱和 MoC 匹配項。
已經完成了
您的實作細節將取決於您的資料是什麼樣子以及您想在解決問題上投入多少時間和金錢。
我的一般方法是從將兩組資料匯入資料庫開始。具有所有屬性的資料就是您的參考集。較小的資料集是您的候選集。在候選表上,新增包含參考集標識符的列。以下內容缺乏標準化,但這是有意的
CREATE TABLE
dbo.reference
(
reference_id int identity(1,1) NOT NULL PRIMARY KEY
, name_prfix varchar(50) NULL
, name_first varchar(50) NOT NULL
, name_middle varchar(50) NULL
, name_last varchar(50) NOT NULL
, name_suffix varchar(20) NULL
, company_name varchar(100) NULL
, address_line1 varchar(70) NULL
, address_line2 varchar(50) NULL
, address_city varchar(50) NULL
, address_state varchar(20) NULL
, address_postalcode varchar(10) NULL
, address_zip4 char(4) NULL
, phone_number varchar(10) NULL
)
CREATE TABLE
dbo.candidate
(
candidate_id int identity(1,1) NOT NULL PRIMARY KEY
, name_prfix varchar(50) NULL
, name_first varchar(50) NOT NULL
, name_middle varchar(50) NULL
, name_last varchar(50) NOT NULL
, name_suffix varchar(20) NULL
, company_name varchar(100) NULL
, address_line1 varchar(70) NULL
, address_line2 varchar(50) NULL
, address_city varchar(50) NULL
, address_state varchar(20) NULL
, address_postalcode varchar(10) NULL
, address_zip4 char(4) NULL
, reference_id int
)
迭代TSQL
第一步,直接匹配。只要 Candidate 和 Reference 之間存在完全匹配,請將其記錄在 Candidate.reference_id 中,現在它已從流程中排除。
第 2 步,直接比對暱稱擴展和/或停用詞替換
步驟3,位址匹配與模糊名稱相符(雙變音位+ngram+最小編輯距離)
步驟4,地址匹配與模糊暱稱擴展和/或停用詞替換匹配(雙變音位+ngram+最小編輯距離)
步驟 5,檢查剩餘候選池以進行手動匹配
SSIS
SSIS 企業版提供模糊邏輯功能。基本上,它的功能與 TSQL 方法中列出的功能基本相同,而無需您建立自己的名稱匹配框架等。
2012 年發布的 SSIS 也提供了資料品質服務,可以解決地址清理問題以及將名稱拆分成多個部分的問題。