数据匹配算法

时间:2010-03-12 19:29:02

标签: .net algorithm design-patterns

我目前正在开展一个需要实施数据匹配算法的项目。 外部系统传入它所知道的有关客户的所有数据,我设计的系统必须返回匹配的客户。因此,外部系统知道客户的正确ID,并获取其他数据或更新自己的特定客户数据。

传入以下字段:

  • 姓名
  • 名称2
  • ZipCode
  • BANKACCOUNTNUMBER
  • BANKNAME
  • BANKCODE
  • 电子邮件
  • 电话
  • 传真
  • 网络

数据质量很高,有很多信息可供使用,但数据通常很糟糕,只有名称和地址可用且可能有拼写。

我正在.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;
}

这将允许我考虑所有匹配的数据,并且根据一些权重,我会增加匹配分数。如果分数足够高,那就是匹配。

知道我的问题是:有没有针对此类事情的最佳实践,例如匹配算法模式等?非常感谢!

4 个答案:

答案 0 :(得分:2)

要获得灵感,请查看Levenshtein distance algorithm。这将为您提供合理的机制来衡量您的比较。

我还想补充一点,根据我的经验,你绝对不能将两个任意数据段匹配到同一个实体中。您需要向用户提供合理的匹配,然后用户可以确认1920 E. Pine的John Smith与Jon Pine在192 East Pine Road的人是否相同。

答案 1 :(得分:2)

根据我对这类事情的经验,实际上是商界人士将可以接受的规则定义为匹配,而不是技术决策。这对我来说很有意义,因为业务最终承担风险。此外,构成匹配的内容可能会发生变化,例如,如果他们使用系统并发现有太多人被排除在外。

我认为您的第一种方法更有意义,因为如果您可以通过姓名和银行帐号来匹配某人,那么您很确定这是他们。但是,如果名称和银行信息都不匹配,但地址,电话和所有匹配的信息(即配偶),那么评分系统可能会错误地匹配人。我意识到这是很多代码,但只要你提取出实际的匹配代码(matchPhoneNumber方法等),那么它的设计就很好了。

我可能会更进一步,将匹配拉出到枚举中,然后列出可接受的匹配项。有点像:     界面匹配     {         布尔匹配(客户c1,客户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数组并测试它们以查看是否适合。我甚至可以将有效匹配列表拉出到配置文件中。这一切都取决于您的系统所需的稳健程度。

答案 2 :(得分:0)

如果您将自己限制在地址和名称,则可以使用harvesine公式或空间索引(如果您有地理位置)。对于名称,您可以使用trie并仅获得第一个结果,可能是10.

答案 3 :(得分:0)

机器学习方法怎么样?创建。每件物品的距离。

这些成为您的输入空间。根据这些距离在正确匹配的custers上构建训练集。浏览您最喜爱的机器学习者算法。获取反映匹配强度的决策函数的参数。调。适用于新病例。去银行。