簡體   English   中英

數據匹配算法

[英]Data matching algorithm

我目前正在開展一個需要實現數據匹配算法的項目。 外部系統傳入它所知道的有關客戶的所有數據,我設計的系統必須返回匹配的客戶。 因此,外部系統然后知道客戶的正確ID,並且它獲得額外的數據或者可以更新其自己的特定客戶的數據。

傳入以下字段:

  • 名稱
  • 名稱2
  • 郵政編碼
  • 銀行帳號
  • 銀行的名字
  • 銀行代碼
  • 電子郵件
  • 電話
  • 傳真
  • 卷筒紙

數據可以是高質量的,並且有很多信息可用,但數據通常很糟糕,只有名稱和地址可用並且可能有拼寫。

我正在.Net中實施該項目。 我目前的做法如下:

public bool IsMatch(Customer customer)
{
    // CanIdentify just checks if the info is provided and has a specific length (e.g. > 1)
    if (CanIdentifyByStreet() && CanIdentifyByBankAccountNumber())
    {
        // some parsing of strings done before (substring, etc.)
        if(Street == customer.Street && AccountNumber == customer.BankAccountNumber) return true;
    }
    if (CanIdentifyByStreet() && CanIdentifyByZipCode() &&CanIdentifyByName())
    {
        ...
    }
}

我對上述方法不太滿意。 這是因為我必須為所有合理的情況(組合)編寫if語句,所以我不會錯過匹配實體的任何機會。

所以我想也許我可以創造一些匹配的分數。 因此,對於匹配的每個標准,將添加分數。 喜歡:

public bool IsMatch(Customer customer)
{
    int matchingScore = 0;
    if (CanIdentifyByStreet())
    {
        if(....)
            matchingScore += 10;
    }
    if (CanIdentifyByName())
    {
        if(....)
            matchingScore += 10;
    }
    if (CanIdentifyBankAccountNumber())
    {
        if(....)
            matchingScore += 10;
    }

    if(matchingScore > iDontKnow)
        return true;
}

這將允許我考慮所有匹配的數據,並且根據一些權重,我會增加匹配分數。 如果分數足夠高,那就是匹配。

知道我的問題是:有沒有最好的做法,比如匹配算法模式等? 非常感謝!

如需靈感,請查看Levenshtein距離算法 這將為您提供合理的機制來衡量您的比較。

我還想補充一點,根據我的經驗,你絕對不能將兩個任意數據段匹配到同一個實體中。 您需要向用戶提供合理的匹配,然后用戶可以確認1920 E. Pine的John Smith與Jon Pine在192 East Pine Road的人是否相同。

根據我對這類事情的經驗,實際上是商界人士將可以接受的規則定義為匹配,而不是技術決策。 這對我來說很有意義,因為業務最終承擔風險。 此外,構成匹配的內容可能會發生變化,例如,如果他們使用系統並發現有太多人被排除在外。

我認為你的第一種方法更有意義,因為如果你可以通過名字和銀行賬號匹配某人,那么你很確定這是他們。 但是,如果名稱和銀行信息都不匹配,但地址,電話和所有匹配的信息(即配偶),那么評分系統可能會錯誤地匹配人。 我意識到這是很多代碼,但只要你提取出實際的匹配代碼(matchPhoneNumber方法等),那么它的設計就很好了。

我可能會更進一步,將匹配拉出到枚舉中,然后列出可接受的匹配項。 有點像這樣:interface Match {boolean matches(Customer c1,Customer c2); }

class BankAccountMatch implements Match
{
    public boolean matches(Customer c1, Customer c2)
    {
        return c1.getBankAccountNumber() == c2.getBankAccountNumber();
    }
}

static Match BANK_ACCOUNT_MATCH = new BankAccountMatch();

Match[][] validMatches = new Match[] [] {
        {BANK_ACCOUNT_MATCH, NAME_MATCH},
        {NAME_MATCH, ADDRESS_MATCH, FAX_MATCH}, ...
};

然后執行驗證的代碼將遍歷validMatches數組並測試它們以查看是否適合。 我甚至可以將有效匹配列表拉出到配置文件中。 這完全取決於您的系統所需的穩健性水平。

機器學習方法怎么樣? 創造。 每件物品的距離。

這些成為您的輸入空間。 根據這些距離在正確匹配的custers上構建訓練集。 瀏覽您最喜愛的機器學習者算法。 獲取反映匹配強度的決策函數的參數。 調。 適用於新病例。 去銀行。

如果您將自己限制在地址和名稱,則可以使用harvesine公式或空間索引(如果您有地理位置)。 對於名稱,您可以使用trie並僅獲得第一個結果,可能是10。

暫無
暫無

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

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