1

我在数据库中有一个相当小的结构化记录语料库。给定一条记录中包含的一小部分信息,通过 Web 表单提交(结构与表模式相同),(让我们称之为测试记录)我需要快速起草一份清单最有可能与测试记录匹配的记录,并提供搜索词与记录匹配程度的置信度估计。此搜索的主要目的是发现是否有人正在尝试输入与语料库中的记录重复的记录。测试记录有合理的可能性是欺骗性的,测试记录也有合理的可能性不是欺骗性的。

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

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

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

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

我的第一个问题是针对房间里的统计学家:我将如何使用频率作为权重?在 n、记录数 f(t)、标记 t 在语料库中出现的频率、记录是原始记录而不是重复记录的概率 o 以及记录的概率 p 之间是否存在精确的数学关系?测试记录真的是记录 x 给定测试和 x 在同一字段中包含相同的 t?跨多个字段的多个令牌匹配的关系如何?

既然我真诚地怀疑是否存在,有什么能让我接近但比一个完全任意的充满魔法因素的黑客更好的东西吗?

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

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

4

1 回答 1

0

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

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

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

为匹配数据库中可能的重复项而提供的作为输入的数据量相对较少,通常使用的属性集相对较少,以及这些属性的明显通用语义(电话号码、地址、姓名……)建议使用手工制作的解决方案而不是完全基于机器学习的。

注意:此后的许多建议不必适用于所有属性(因为其中不到十几个几乎涵盖了所有用法,所以没有意义,至少在开始时对其他属性进行大量投资。

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

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

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

    最后,还有一个部分自动化的过程,您可以根据最终用户提供的一些反馈来更改一些参数。(这很棘手,我会在其他帖子中保留它;-))

于 2010-03-12T02:41:58.803 回答