问题标签 [record-linkage]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 如何确定每个来源中的记录是否代表同一个人
我有几个包含个人数据的表格来源,如下所示:
因此,假设来自来源 1 和 2 的 ID 为 1 的记录是同一个人,我的问题是如何确定每个来源中的记录是否代表同一个人。此外,确保并非所有记录都存在于所有来源中。所有的名字,主要是用西班牙语写的。
在这种情况下,需要放宽精确匹配,因为我们假设数据源没有经过国家官方身份验证局的严格检查。此外,我们需要假设拼写错误是常见的,因为收集数据的过程的性质。更重要的是,每个来源的记录数量约为 2 或 3 百万……
我们的团队曾考虑过这样的事情:首先,强制在 ID NUMBER 和 NAMES 等选定字段中进行精确匹配,以了解问题的难度。第二,放宽匹配条件,数一数还能匹配多少条记录,但是问题来了:如何放宽匹配条件,既不会产生太大的噪音,又不会限制太多?
什么工具可以更有效地处理这个问题?例如,您是否知道某些数据库引擎中的某些特定扩展以支持这种匹配?您是否知道诸如soundex 之类的巧妙算法来处理这种近似匹配,但对于西班牙语文本?
任何帮助,将不胜感激!
谢谢。
algorithm - 结构化数据的模糊匹配
我在数据库中有一个相当小的结构化记录语料库。给定一条记录中包含的一小部分信息,通过 Web 表单提交(结构与表模式相同),(让我们称之为测试记录)我需要快速起草一份清单最有可能与测试记录匹配的记录,并提供搜索词与记录匹配程度的置信度估计。此搜索的主要目的是发现是否有人正在尝试输入与语料库中的记录重复的记录。测试记录有合理的可能性是欺骗性的,测试记录也有合理的可能性不是欺骗性的。
记录的宽度约为 12000 字节,记录的总数约为 150,000。表架构中有 110 列,95% 的搜索将位于最常搜索的前 5% 列。
数据是诸如姓名、地址、电话号码和其他行业特定号码之类的东西。在语料库和测试记录中,它都是手动输入的,并且在单个字段中是半结构化的。乍一看,您可能会说“手动加权列并匹配其中的单词标记”,但这并不容易。我也是这么想的:如果我得到一个电话号码,我认为这将表明一个完美的匹配。问题是表单中没有一个字段的令牌频率不会按数量级变化。一个电话号码可能在语料库中出现 100 次或在语料库中出现 1 次。任何其他领域也是如此。这使得现场级别的加权变得不切实际。我需要一种更细粒度的方法来获得体面的匹配。
我最初的计划是创建一个哈希值,顶层是字段名。然后,我将从语料库中为给定字段选择所有信息,尝试清理其中包含的数据,并对清理过的数据进行标记,在第二级对标记进行散列,将标记作为键,频率作为值。
我会将频率计数用作权重:参考语料库中标记的频率越高,如果在测试记录中找到该标记,我对该标记的权重就越小。
我的第一个问题是针对房间里的统计学家:我将如何使用频率作为权重?在 n、记录数 f(t)、标记 t 在语料库中出现的频率、记录是原始记录而不是重复记录的概率 o 以及记录的概率 p 之间是否存在精确的数学关系?测试记录真的是记录 x 给定测试和 x 在同一字段中包含相同的 t?跨多个字段的多个令牌匹配的关系如何?
既然我真诚地怀疑是否存在,有什么能让我接近但比一个完全任意的充满魔法因素的黑客更好的东西吗?
除此之外,有没有人有办法做到这一点?
我特别热衷于不涉及在数据库中维护另一个表的其他建议,例如令牌频率查找表。
search - 基于多个输入匹配“模糊”数据
我有一个搜索和匹配问题:
输入
在我的数据库中,除了一些其他匹配特征之外,我还有数千个名称:几列数字数据和几列有助于识别这家特定公司的其他文本。
一个潜在客户有大约 500 个公司名称,然后为每个名称添加了上面提到的稀疏的附加特征。
当前流程
过去,该过程一直是手动的,尝试通过搜索数据库来匹配客户提供的每个名称,找到一个“喜欢”向我报告的名称,然后验证附加特征是否匹配。但是,主要问题是报告的名称不一样,通常可能包含缩写或仅包含存储在我的数据库中的部分名称,并且附加特征也可能不完整或仅部分匹配。
自动化
我想自动化这个过程,因为它经常发生。最佳解决方案是从客户列表中输入一家公司以及他们为其填写的任何其他特征,然后尝试在我的数据库中找到前 5 个匹配项。
我从未使用过 Lucene 或 Sphinx,但它们似乎更受文档驱动。有没有办法格式化这些输入,以便这些库可以解决这个问题,或者相反,还有哪些其他软件工具可以工作?
java - Fellegi-Sunter 有开源实现吗?
Fellegi-Sunter 有开源实现吗?
algorithm - 多列信息的模糊记录匹配
我有一个有点高水平的问题,所以我会尽量具体。
我正在进行大量研究,涉及将不同的数据集与引用同一实体(通常是公司或金融证券)的标题信息相结合。这种记录链接通常涉及标题信息,其中名称是唯一常见的主要标识符,但通常可以使用一些辅助信息(例如城市和州、操作日期、相对大小等)。这些匹配通常是一对多的,但也可能是一对一的,甚至是多对多的。我通常是手动完成这种匹配,或者对已清理的子字符串进行非常基本的文本比较。我偶尔会使用一个简单的匹配算法,比如 Levenshtein 距离测量,但我没有从中得到太多,部分原因是我没有一个好的正式的应用方法。
我的猜测是,这是一个相当普遍的问题,并且必须已经开发了一些正式的流程来完成此类事情。我已经阅读了一些关于该主题的学术论文,这些论文涉及给定方法的理论适用性,但我还没有找到任何好的资源来介绍配方或至少是一个实用的框架。
我的问题如下:
有谁知道实现多维模糊记录匹配的良好来源,例如书籍或网站或已发表的文章或工作论文?
我更喜欢有实际例子和明确方法的东西。
该方法可以是迭代的,在中间阶段进行人工检查以进行改进。
(编辑)链接数据用于统计分析。因此,一点点噪音是可以的,但是对于更少的“不正确匹配”而不是更少的“不正确的不匹配”有强烈的偏好。
如果他们在 Python 中,那就太棒了,但不是必需的。
最后一件事,如果重要的话,是我不太关心计算效率。我没有动态实现这一点,我通常处理几千条记录。
sql - 关于重复数据删除软件的建议?
我正在寻找一些与 MS SQL Server 兼容的重复数据删除软件。我有一个相当广泛和凌乱的表格,其中包含来自世界各地的所有不同语言的地址。该表设置为将欺骗作为父/子记录处理,因此需要一些处理匹配的功能(即不仅仅是删除欺骗)。
编辑:这是结构
MasterID
每条记录都是唯一的。
ParentID
包含MasterID
每个条目的父记录,父记录是MasterID = ParentID
.
CountryCode
是两个字母的 ISO 国家代码(不是电话代码)。
algorithm - 在不到指数的时间内进行模糊匹配重复数据删除?
我有一个大型数据库(可能有数百万条记录),其中包含相对较短的文本字符串(按街道地址、名称等顺序)。
我正在寻找一种删除不精确重复的策略,模糊匹配似乎是首选方法。我的问题:许多文章和 SO 问题都涉及将单个字符串与数据库中的所有记录进行匹配。我希望立即对整个数据库进行重复数据删除。
前者将是一个线性时间问题(将一个值与一百万个其他值进行比较,每次都计算一些相似性度量)。后者是一个指数时间问题(将每条记录的值与其他每条记录的值进行比较;对于一百万条记录,与前一个选项的 1,000,000 次计算相比,这大约是 5 x 10^11 计算)。
我想知道除了我提到的“蛮力”方法之外是否还有另一种方法。我正在考虑可能生成一个字符串来比较每个记录的值,然后对具有大致相等相似性度量的字符串进行分组,然后通过这些组运行蛮力方法。我不会达到线性时间,但它可能会有所帮助。此外,如果我考虑得当,这可能会错过字符串 A 和 B 之间潜在的模糊匹配,因为它们与字符串 C(生成的检查字符串)的相似性非常不同,尽管它们彼此非常相似。
有任何想法吗?
PS 我意识到我可能使用了错误的时间复杂度术语——这是一个我基本掌握的概念,但还不够好,所以我可以当场将算法归入正确的类别。如果我用错了术语,我欢迎更正,但希望我至少能明白我的意思。
编辑
一些评论者问,鉴于记录之间的模糊匹配,我的策略是选择删除哪些记录(即给定“foo”、“boo”和“coo”,它们将被标记为重复并删除)。我应该注意,我不是在这里寻找自动删除。这个想法是在一个 60 多万条记录数据库中标记潜在的重复项,以供人工审查和评估。如果有一些误报是可以的,只要它是一个大致可预测/一致的数量。我只需要了解重复项的普遍性。但是如果模糊匹配传递需要一个月的时间来运行,那么这甚至不是一个选项。
r - 如何使用 R 的 RecordLinkage 包获得匹配对
谁能告诉我我在这里做错了什么。我正在尝试在玩具数据集上测试 R 包 RecordLinkage 的比较功能
记录 1 和 3 明显匹配,但 is_match 对于所有三对都是 NA。
database-design - 交叉引用数据时使用“模糊搜索”
我的部门负责收集和显示来自各种公司内部来源的数据,以用于数据挖掘/公司仪表板。
我们面临的一大挑战是跨部门交叉引用位置名称。我们是一个相当大的组织,具有不同利益的部门对任何一个地点都进行自己的报告。一般来说,在这些部门的报告中,位置名称的确切名称存在很多差异。例如,一个位置可能被称为:
- 神话般的餐厅
- 很棒的餐厅
- 很棒的餐饮
- 当该位置进行一些翻新时......很棒的咖啡馆'
- 甚至利润中心 12345ABC
所以我的问题是在我们自己的数据库和代码中协调这些名称时存在哪些最佳实践?让我们暂时假设我的部门没有能力将组织统一在一个共同的等级标准下(这将是最佳解决方案)。目前,我们的做法是维护不断增长的位置名称参考表,然后将这些参考表引用回我们自己的命名标准。这使我们能够与我们的数据保持历史一致性。
在交叉引用位置时实施某种“模糊搜索”是否可行/可取?例如,可能会忽略诸如“the”之类的词的实例,或者平等对待“cafe”和“restaurant”(基于一些预定义的逻辑)。
我当然不认为我们能够通过算法解释我们遇到的所有随机命名约定,但是能够解释其中的一些/大部分就足够了吗?
java - 使用 Java 上的评分框架/应用程序/服务器进行重复数据删除以处理数据库输入分段
请向我推荐 Java 产品(我更喜欢开源),它确实可以:
- 重复数据删除
- 重复数据删除评分
- 允许自定义重复数据删除规则和评分规则。
请看示例:
- 我有一个名为“INPUT_DB”的输入暂存数据库
- 我有一个名为“INPUT_PERSONS”的表
此表中有几个字段:
ID(一些无意义的代理主键)
FIRST_NAME
LAST_NAME
SECOND_NAME
BIRTH_DATE
PASSPORT_SERIES(PASSPORT_SERIES + PASSPORT_NUM 是公民的唯一标识符)
PASSPORT_NUM
我必须查看 INPUT_PERSONS 中的所有记录并找到重复项和匹配项。应该创建几个规则:
- 如果 PASSPORT_SERIES+PASSPORT_NUM 等于某个记录,则意味着这两个记录是重复的。这种情况的得分是 100 分(满分 100 分)
- 如果 FIRST_NAME、LAST_NAME 相等,但 PASSPORT_SERIES+PASSPORT_NUM 有一个不同的字符(例如打印错误),则这些记录可能重复,其得分为 90 分(满分 100)。
- 等等....
是否有可能找到一些现成的解决方案并将其用作基础?