2010-05-10 89 views
2

我正在尋找關於如何最好地匹配包含字符串鍵/值對的兩個散列表的想法。模糊匹配兩個哈希表?

下面是我遇到的實際問題:我有結構化數據進入數據庫。我需要更新已經在數據庫中的記錄,但是,源中的ANY值可能會更改,因此我沒有可靠的ID。

我想模糊匹配兩行,源和數據庫,並作出「受過教育」的猜測,如果它應該更新或插入。

任何想法將不勝感激。

解決方案

解決方案基於本羅賓遜的職位。工作得很好,允許在這裏和那裏以及基於自定義密鑰的權重有小的不匹配。

require 'rubygems' 
require 'amatch' 

class Hash 
    def fuzzy_match(hash, key_weights = {}) 
    sum_total = 0 
    sum_weights = 0 

    self.keys.each do |key| 
     weight = key_weights[key] || 1 
     next if weight == 0 

     weight *= 10000 
     match = self[key].to_s.levenshtein_similar(hash[key].to_s) * weight 
     sum_total += match 
     sum_weights += weight 
    end 

    sum_total.to_f/sum_weights.to_f 
    end 
end 
+0

我建議你拿出一個防彈解決方案來匹配你收到的東西或準備好你的許多假陰性。你要麼關心重複,要麼不關心。 – 2010-05-10 14:35:42

回答

2

我最近使用了Levenshtein Distance來做模糊匹配。我計算兩個可能的匹配字符串之間的距離,並給出匹配得分,該得分是距離的倒數。然後,我在各個字段中執行weighted average分數來確定記錄的分數,並允許更重要的字段比不太重要的字段更重要。它用於一個CRM應用程序,其中有許多不同來源的線索。客戶需要將這些與現有的線索/機會/扣分/分銷商等進行匹配。它調整了比賽的門檻,而不是什麼。最後,我們得到了大約1%的假陽性率,我認爲這是非常好的。

+0

你可以給一些seudo代碼嗎? – alex 2010-05-10 14:37:49

+0

維基百科文章給出了Levenshtein Distance algorythm的僞代碼示例。加權平均數/平均數就像正常平均數一樣,但不是將數值相加併除以數值的數量,而是將每個數值的總和乘以數值的權重,然後將總數除以總數wieghts。 – 2010-05-10 15:09:18

+0

Peter Norvig實現的Damerau-Levenshtein距離算法非常好理解:http://norvig.com/spell-correct.html – 2010-05-10 17:55:06

1

如果您要在SQL Server中導入數據,SSIS具有模糊匹配任務。試試看看你是否喜歡這個結果。我們發現它在這種情況下非常有用。

+0

您是否知道SSIS早期版本的SSIS模糊匹配的一個很好的替代方案?我正在使用一個沒有模糊匹配功能的舊項目 – Arj 2012-07-09 11:17:31