Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 结构化数据的模糊匹配_Algorithm_Search_Structured Data_Record Linkage - Fatal编程技术网

Algorithm 结构化数据的模糊匹配

Algorithm 结构化数据的模糊匹配,algorithm,search,structured-data,record-linkage,Algorithm,Search,Structured Data,Record Linkage,我在数据库中有一个相当小的结构化记录库。给定一条记录中包含的一小部分信息,通过与表模式结构相同的web表单提交,让我们称之为测试记录。我需要快速绘制一个记录列表,其中最有可能与测试记录匹配,以及提供搜索词与记录匹配程度的置信度估计。此搜索的主要目的是发现是否有人试图输入与语料库中的记录重复的记录。测试记录很有可能是一个复制品,测试记录也很有可能不是一个复制品 记录的宽度约为12000字节,记录总数约为150000。表架构中有110列,95%的搜索将位于最常搜索的前5%列 这些数据包括姓名、地址、

我在数据库中有一个相当小的结构化记录库。给定一条记录中包含的一小部分信息,通过与表模式结构相同的web表单提交,让我们称之为测试记录。我需要快速绘制一个记录列表,其中最有可能与测试记录匹配,以及提供搜索词与记录匹配程度的置信度估计。此搜索的主要目的是发现是否有人试图输入与语料库中的记录重复的记录。测试记录很有可能是一个复制品,测试记录也很有可能不是一个复制品

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

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

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

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

我的第一个问题是向在场的统计学家提出的:我将如何使用频率作为权重?在n、记录数量ft、语料库中出现标记t的频率、记录为原始记录而非重复记录的概率o以及测试记录为记录x且x在同一字段中包含相同t的概率p之间是否存在精确的数学关系?跨多个字段的多个令牌匹配的关系如何

既然我真的怀疑有,有什么东西能让我接近,但比一个充满魔力的完全武断的黑客更好吗

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


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

您可能会从这个不同但相似的SO问题中得到一些想法:

针对当前的问题,以下是一些想法和想法:

首先,认识到非常不平衡的使用只有6到10个属性覆盖了95%的使用,您可以/应该在属性上应用不对称的工作,即在编程时间和运行时CPU分配方面,为处理这几个属性投入更多的精力,而不是额外的100多个属性

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

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

规范化数据 如果不允许更改原始字段值,则可以将相应列复制到norm_xxx列,其中xxx是原始名称。 什么、如何规范化可能因每个属性而异;对于类似自由文本的数据,请确保没有前导空格和尾随空格,单词之间只有一个空格,没有制表符和不可打印字符。使用全大写或全小写即使原始/for显示文本可能包含一个混合体,您的处理速度也会更快,因为能够采用统一的大小写。更具体地说,对于地址和/或公司名称,您可以将常用术语转换为街道、街道和街道等的标准格式ST。请确保保留此列表,因为它也将应用于用户搜索条件。标准化的一部分也可能是d rop在公司名称末尾加上一些噪音词,如CO,INC,GMBH 创建几个计算列 例如,对于可以使用尾随通配符搜索的属性,具有相反文本的属性 考虑使用一些属性的SunDox类转换。 全文索引,单独,所有类似文本的列 在所有6到10个常用列上创建普通SQL索引 所有这些,仅仅是为实际比赛进行的离线时间准备。现在用户输入他/她的查询。。。这里有一些关于如何处理它的想法

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

最后,还有一个部分自动化的过程,您可以根据最终用户提供的一些反馈修改一些参数。这是一个非常棘手的问题,我会把它留到其他帖子上;-


谢谢你的想法和更多关于这方面研究的链接。我可能会计算编辑距离,或者不计算,我不能确定。但我想我会在计算编辑距离之前,以1/ft*fieldweight的形式对令牌匹配进行评分,看看这能让我有多接近。