2012-11-26 156 views
3

我有一個SQLite數據庫(user_id,name)。我想通過名稱來檢測用戶是否已經在系統中。問題在於名稱來自用戶,意思是他可以拼錯名字,或者可能是名稱的替代版本:「Tim」和「Timothy」。所以我想要一個能夠找到最接近輸入的函數,並給出一個相似性的置信度,以確定是否存在匹配。信心應該在0到1之間(這樣我才能設置一個有意義的截止點)。通過模糊匹配檢測重名

表:

1 | Tim Best 
2 | Roger Thomas 
3 | Roper Bar 
  • 如果用戶輸入Timothy Bert函數應該返回1 | Tim Best | 0.8(0.8是信心,如果這是它正好是)。
  • 如果用戶輸入Roper Thomas函數應該返回2 | Roger Thomas | 0.6
  • 如果用戶輸入Tim Taylor函數應該返回1 | Tim Best | 0.3
  • 如果用戶輸入Foo Taylor函數應該返回2 | Roper Thomas | 0.0

理想情況下是最好的如果我可以在SQLite中編寫查詢來做到這一點,但如果這是不可能的,我也會採取AC解決方案。

+0

在最後一個例子中,爲什麼與'Foo Taylor'最匹配的是'Tim Best'而不是'Roger Thomas'? (「泰勒」和「托馬斯」開始用相同的字母,並具有相同的長度,這似乎不是什麼「蒂姆最佳」顯然率更好的匹配。) –

+0

@TedHopp你是正確的,對不起 – chacham15

回答

1

有幾個嘗試解決模糊字符串匹配。谷歌告訴你很多,wikipedia也是如此。最受歡迎的是Levenshtein。其他有趣的方法是Jaro-WinlerTrigram matching

我個人的經驗表明,你必須玩弄存在的算法。我遇到了一個匹配「FirstName LastName」與「LastName,FirstName」的問題,唯一適合我需求的算法是我從所提供的鏈接開發的修改後的Trigram。

爲了你的需求,你也應保持名稱縮略語的字典,這樣就可以每個短形式轉換爲它的基本名稱,然後做一個比較模糊。但是,這很可能會失敗,例如, 「Tin Taylor」,其中'Tin'拼寫錯誤'Tim'不會導致'Timothy Taylor'。

爲了掩蓋這一點,你將需要一個查找,可以「學習」,即是由一些人編輯。

+0

這些都不給我儘管有意義的信心值 – chacham15