簡體   English   中英

相似數據算法

[英]Similar Data Algorithm

我有幾個用戶信息數據庫,每個數據庫10k-20k條目,每個數據庫來自幾個不同的來源,並且每個數據庫都在不斷增長。 我正在尋找一種可以在一定公差范圍內注意到相似電子郵件或相似名稱(first +''+ last)的工具。 我正在運行一個MySQL數據庫,並且可以與C ++或PHP一起運行比較。 誰能建議任何現有的解決方案/教程,讓我可以對數據庫或數據數組進行檢查並返回可能的重復項? 我只希望它能解決一些常見錯誤,例如:

josh@test.com <> josh@test.test.com <> jash@test.com
Josh O <> josh t O <> Joshua O

也許可以將公差調整到條目之間一定數量的字符差異之內? 非常非常感謝您提供的任何建議或解決方案,Google谷歌搜索並沒有取得多少成功。

我有一些好消息給您,也有一些可怕的消息給您。

好消息是PHP具有一些算法的實現,可以比較內置的字符串:

它還有兩種相對流行的方法,可以將英語單詞分解為更適合比較的簡單表示形式:

雖然這是個好消息,但可怕的消息是,如果使用10-20k條目,則需要使用前兩個選項來進行接近一個半公噸的比較,而它們並不是出色的表演者。 我不太確定big-O表示法是什么,但是我認為它在O(run away)范圍內。

使用后兩個函數預先計算相似性分解,然后對所得數據使用某種分組操作可能會證明是主要的性能並節省了時間。

那將取決於您的“相似性”概念。 如果要查找必須插入,刪除或替換的字符數,才能將一個字符串轉換為另一個字符串,該算法稱為Levenshtein distance 但是請注意,長字符串會非常慢(因為每個比較都使用與mn成正比的許多運算,其中mn是要比較的字符串的長度),但是如果您的數據是電子郵件地址,並且其他短字符串,則應該沒問題(最大的問題是比較數,因為您需要將每對字符串相互比較)。

給定最大字符距離,這聽起來像是bitap算法的工作(Wu和Manber,“快速搜索有文本錯誤”) 這是agrep程序的核心算法,當可接受的字符錯誤數受到限制時,它可能會非常快。 可以在此處找到Google以幾種語言的庫形式的實現 (僅用於近似匹配的代碼相對較短,並且有據可查。)

您仍在將O(n 2 )作為電子郵件與電子郵件比較的總數(對於20k電子郵件為〜400M)。 但是,良好的比較功能(如bitap)的良好實現應有助於減少常數。 您還可以根據長度將電子郵件分為幾組,並且僅在大小差異不大的組之間匹配電子郵件(例如,如果您的容忍度是3個字符的差異,則是將任何10個字符的電子郵件與任何20個字符的電子郵件進行比較是毫無意義的。) 如果您有多核計算機,那么您還應該能夠並行化比較。 同樣,這些都是常量的減少,而不是順序的減少,但是我猜想,在一台快速的計算機上良好的C ++實現可以在幾分鍾之內完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM