结构化数据的模糊匹配

时间:2010-03-12 02:03:52

标签: algorithm search structured-data record-linkage

我在数据库中有一个相当小的结构化记录集。鉴于单个记录中包含的信息的一小部分,通过Web表单提交(结构与表模式相同),(让我们将其称为测试记录)我需要快速绘制一个列表记录最有可能匹配测试记录的记录,并提供搜索词与记录匹配程度的置信度。此搜索的主要目的是发现某人是否正在尝试输入与语料库中的一个重复的记录。有一个合理的机会,测试记录将成为一个骗局,并且测试记录不会成为欺骗的合理机会。

记录大约12000字节宽,记录总数约为150,000。表模式中有110列,95%的搜索将位于前5%最常搜索的列中。

数据包括姓名,地址,电话号码和其他行业特定号码。在语料库和测试记录中,它是手动输入的,并且在单个字段内是半结构化的。你可能会乍一看说“用手对列进行加权并匹配其中的单词标记”,但这并不容易。我也这么认为:如果我得到一个电话号码,我认为这表明完美匹配。问题在于表单中没有单个字段,其令牌频率不会按数量级变化。电话号码可能在语料库中出现100次,或在语料库中出现1次。任何其他领域也是如此。这使得在现场级别的加权不切实际。我需要一种更细粒度的方法来获得合适的匹配。

我最初的计划是创建哈希哈希值,顶级域名是字段名称。然后,我将从语料库中选择给定字段的所有信息,尝试清理其中包含的数据,并对已清理的数据进行标记,在第二级对标记进行哈希处理,将标记作为键,频率作为值。

我会将频率计数用作权重:参考语料库中令牌的频率越高,如果在测试记录中找到该标记,我附加的权重就越小。

我的第一个问题是房间里的统计人员:我如何将频率用作重量?是否存在n,记录数,f(t),令牌t出现在语料库中的频率,记录是原始而非重复的概率o以及概率p之间的精确数学关系测试记录实际上是一个记录x给定测试,x在同一个字段中包含相同的t?跨多个字段的多个令牌匹配的关系怎么样?

因为我真诚地怀疑是否存在,是否有任何让我接近但却比完全随意的充满魔法因素的黑客更好?

除此之外,有没有人有办法做到这一点?

我特别热衷于其他不涉及在数据库中维护另一个表的建议,例如令牌频率查找表。

1 个答案:

答案 0 :(得分:0)

你可以从这个不同但相似的SO问题中得到一些想法: calculating-context-sensitive-text-correlation

对于手头的问题更具体,这里有一些想法和想法:

首先,承认非常不正确的用法(只有6到10个属性覆盖95%的使用),你可以/应该对属性应用非对称的努力,即在编程时间和期限方面投入更多运行时CPU分配,用于处理这些少数属性,而不是100多个附加属性。

作为输入提供的相对少量的数据用于匹配数据库中可能的重复项,通常使用的相对较小的属性集,以及这些(电话号码,地址,名称......)的明显常见语义表明一只手根据机器学习,制作的解决方案而非一个完全

注意:此后很多建议不需要应用于所有属性(因为其中不到十几个几乎涵盖了所有用法,没有必要,至少在开始时对其他属性投入很多

  • 规范化数据
    如果您不允许更改原始字段值,则可以将相应列复制到“norm_xxx”列,其中xxx是原始名称。
    什么,如何规范化可能会因每个属性而异;对于像数据这样的“自由文本”,确保没有前导空格或尾随空格,单词之间只有一个空格,没有制表符和不可打印的字符。使用全部大写或全部小写(eventhought原始/显示文本可能包括混合,您的处理将通过能够假设统一的套管更快)。更具体地说,对于地址和/或公司名称,您可以将常用术语转换为标准形式(ST用于STREET,ST和ST等)(请务必保留此列表,以便将其应用于用户搜索条件) )。标准化的一部分也可能是完全放弃一些干扰词(如公司名称末尾的CO,INC,GMBH)
  • 创建一些计算列
    例如,对于可以使用尾随通配符搜索的属性,可以反过来使用文本
  • 考虑对某些属性使用类似Soundex的转换。
  • FullText索引,单独地,所有类似文本的列
  • 在所有6到10个常用列
  • 上创建普通(SQL)索引

以上所有内容仅仅是实际执行比赛的离线准备时间。现在..用户输入他/她的查询...这里有一些关于如何处理它的想法

  • 规范化保证的搜索条件
  • 运行多次搜索...
    这有点棘手;执行这些搜索有几个部分冲突的目标。我们希望大幅减少“潜在匹配”的数量:用所提供的标准对所有150,000条记录进行全面的一对一比较实际上是不切实际的。例如,一些匹配逻辑可能意味着计算数据库的给定记录的字段与搜索标准之间的编辑距离。我们还希望确保我们不会从“潜在匹配”列表中排除记录,因为公司名称中的拼写错误...最后我们希望以排名的方式提供潜在匹配列表。
    执行这些搜索的方法遵循一些预定义的启发式方法(我发现策略设计模式适用于此,允许以搜索运行的方式灵活,具体取决于用户提供的输入)。简而言之,我们在最具选择性/相关的属性中搜索最具选择性的单词,并根据发现的“点击”数量,我们或者与其他搜索结果“或”(联合)或“与”,直到我们有一些百条记录。
  • 计算“潜在匹配”记录的每个属性与相应搜索条件之间的相似度值。可能会将一个系数应用于此值(允许将更多权重称为公司名称[部分]匹配到城市匹配)
  • 计算完整记录的完整相似度值(与完整的搜索条件相比)
  • 向最终用户显示超过相似度值特定阈值的记录,以供审核

    最后,有一个部分自动化的过程,你可以根据最终用户提供的一些反馈改变一些参数。 (这是非常棘手的,我会把这个留给其他一些帖子;-))