详细内容或原文请订阅后点击阅览
避免数据湖中的实体键漂移:第 2 步,当模糊匹配停止工作时
我构建了一个匹配器,旨在完成标准化留下的清理工作。根据真实数据对其进行测试表明,它的任何版本都不可能是安全的。接下来是匹配器被搁置后留下的架构。避免数据湖中的实体键漂移:第 2 步,当模糊匹配停止工作时首先出现在走向数据科学上。
来源:走向数据科学大多数协调混乱标识符的人都会采用相同的方法:采用编辑距离度量,选择阈值,然后合并任何足够接近的内容。 Damerau-Levenshtein 是对普通编辑距离的明显升级。选择它的理由是合理的。它将转置(两个交换的字符 sds1001 和 sds011)视为一个错误而不是两个错误。
在我使用的 719 个环境传感器站中,一个已确认的拼写错误是 sds011 为 sds1001。两个数字被交换了——任何人都可以在键盘上完成这样的操作。简单的编辑距离将其视为两次编辑,对于两种完全不同的产品收取相同的价格。另一方面,Damerau-Levenshtein 知道这是一个错误,从一开始就将其评分为距离 1。因此,这是一个更好的模型来说明拼写错误是如何发生的,而且采用它实际上不需要任何成本,使其成为最明显的选择。
然而,该指标有一个经常被忽视的缺点。举个例子:hdc1008 和 hdc1080 是同时销售的两个真正的德州仪器 (TI) 湿度传感器,记录在单独的数据表中。虽然普通编辑距离将它们设置为 2,但 Damerau-Levenshtein 将它们拉低至 1,与上述拼写错误的范围相同。请注意,使其能够更好地识别人为错误的相同属性也导致它合并制造商故意将两个完全不同的产品分开一个数字。
这是我从规范化开始的关于实体键漂移的深入研究系列的第 2 部分。如果您还没有阅读第 1 部分,那么值得先看一下,因为它涵盖了本文中的确定性清理。两者的代码和数据都在 GitHub 和 Zenodo 上,以防您想自己检查任何数字。
在这篇文章中,我将介绍当我根据制造商数据表验证的基本事实测量五个字符串相似性指标时发生的情况,为什么它们都无法调整以将拼写错误与真实产品分开 - 以及这种失败对于如何构建系统意味着什么。
这与任何协调来自多个来源的短字母数字标识符(零件号、SKU、型号代码)的人相关,如果您的标识符来自单一来源,则情况就不那么重要了。另外,值得一提的是,这是一个负面结果。如果你正在寻找一个匹配器来复制,我没有,而且我没有的原因比匹配器更重要。
标准化留下了什么
步骤 1 处理简单的情况。在 719 个站点中,一旦应用 NFKC 规范化、大小写折叠和分隔符剥离,114 个不同的传感器类型字符串就会折叠为 99 个自然键。 SDS 011、SDS011 和 sds011 全部合并为 sds011。合并完全没有风险,因为差异纯粹是风格上的,并且进行折叠的函数是确定性的。
99 个键仍然比域实际包含的内容多得多。我的最佳估计是,这里展示了大约两打真实的硬件模型(尽管这只是估计)。确定确切的数字需要一个数据集不包含的零件目录(稍后会详细介绍)。
在尝试缩小间隙之前,间隙的形状很重要。 99 个键中的 52 个是部件编号代码,例如 bme280 和 sds011,它们合计占 4,301 个观察值的 94%,中位长度为 6 个字符。其余部分是 gps 和 regenmesser 等描述性单词的组合,一个字面意思“???”,以及一个将两个零件编号组合在一起的按键,如“tsl45315&veml6070”。
建立一个可以实际检查的基本事实
五个指标,没有一个可以分开
对
人口比看起来更重要。近似字符串匹配并不是真正为此构建的。 Cohen、Ravikumar 和 Fienberg 在 2003 年将字符串指标基准与姓名匹配进行了比较,其中共享前缀就是证据:“Jonathan”和“Jonathon”看起来很相似,因为人类转录的是同一个人。设备标识符不是这样工作的。 bme280 和 bmp280 共享六个字符中的五个,但仍然是两个不同的产品。
无论如何,我还是继续构建了匹配器,并尝试保守地进行。它分两个阶段比较标识符:每个键的数字核心必须完全匹配,然后才能根据相似性判断字母余数。这提供了数字部分不会被公差设置平滑掉的优点; bme280 和 bme680 是通过结构而不是通过调整通道稍后可能放松的阈值来分开的。这样,无论它具有什么安全性,都可以内置到逻辑中,而不是处于加权设置中。
然而,该结构并没有解决它仍然允许进行的比较。一旦两个键共享一个数字核心,就通过相似度来判断字母,而相似度需要一个阈值。因此,整个设计归结为一个问题:任何合理的指标是否存在一个阈值,可以捕获每个拼写错误,而无需合并两个真正不同的产品?
这个问题无法用现有的数据来回答。快照告诉我们每个字符串出现的频率,但它没有告诉我们哪些字符串实际上命名了真正的运输部件,这个问题需要回答。
因此,我在运行单个相似性得分之前手动构建了该列。这个顺序是经过深思熟虑的,因为如果您在了解字符串的评分方式后对其进行分类,您往往会无意中对它们进行分类以适应分数。
对于 16 个字符串中的每一个,我查找了制造商的数据表并记录了结论、官方部件名称、源 URL、生命周期状态和访问日期。所有这些都以 ground_truth_catalog.csv 的形式存在于存储库中,因此它们都不是信任的。
手动执行此操作出现了三件我没想到的事情,它们比匹配器结果明显更有趣。
首先,我的一个假设被证明是错误的。我以为 bmp200 是 bmp280 的拼写错误。博世的压力传感器系列运行 BMP085、BMP180、BMP280、BMP388,其中没有 BMP200。但经过进一步调查,我发现 BMP200 是 Focused Photonics 的 PM10 颗粒物分析仪,这是一家完全不同的制造商,尽管我找不到它的规格表或实际分布的证据。因此,这对可能实际上是一个拼写错误,或者是博世压力传感器和中国空气质量分析仪之间的冲突;即使花了相当多的时间,我也无法分辨出哪个。所以我放弃了这对,这是值得标记的,因为它削弱了我的结果(将确认的拼写错误计数从四对减少到三对使模式更难以证明),但无论如何它仍然存在。
其次,早期的确认结果被证明是不正确的。早期通过的数据记录了 SDS 011,其中有一个空格作为规范并标记为 CONFIRMED,源自第三方镜像站点。但 Nova Fitness 自己的文档显示为 SDS011,封面和页眉中没有空格。镜子出错了,而那个错误就在那里被“确认”标签掩盖了。镜子不是制造商,从一开始就应该更仔细地对待这种区别。
其中没有一个不合并。
列弗
D-L
两级
J-W
q-gram
真相
sds011 / sds1001
2
最后,有一部分的名称并不像大家所说的那样。数据集使用dht22,但是奥松自己的技术手册一次都没有说过。 DHT22 出现在每个店面和网上经销商的镜子上,但在制造商自己的文档中它是 AM2302。该零件本身是真实的,因此该行是有效的,但整个字段使用的名称不是制造商使用的名称。这是我实际上试图衡量的两种故障之下的第三种故障。
经过所有验证后,还剩下什么? 12 个字符串命名了真实的部件,3 个没有命名,1 个被排除——结果是 10 个得分对:3 个真正的拼写错误(我首先构建匹配器的原因)和 7 个对,其中双方都是真实的产品,合并会默默地平均在一起。
如果某个指标的某个阈值合并了所有 3 个拼写错误对,并且没有合并 7 个实际产品对,则该指标有效。我测试了主要家族中的五个:普通编辑距离、换位感知(Damerau-Levenshtein)、前缀加权(Jaro-Winkler)、基于集合(q-gram Jaccard)和我的两阶段数字核心匹配器。
将阈值设置得足够宽松,以捕获所有三个拼写错误,然后计算随之而来的错误。普通编辑距离合并所有七个实数对。达默劳-莱文斯坦:七。两级:七级。 q-gram Jaccard:三。贾罗-温克勒 (Jaro-Winkler) 是五人中最好的一位,他融合了其中之一。
解决这个问题的对是 hdc1008/hdc1080,这是前面提到的两个真正的德州仪器 (TI) 部件。它们不是彼此的变体:不同的封装、不同的电源范围以及 ±4 %RH 相对于 ±2 %RH 的精度。因此,合并它们会将误差两倍的传感器折叠成误差一半的传感器。 Jaro-Winkler 对这一对的得分为 0.971,高于最佳真实拼写错误得分 0.963。 q-gram Jaccard 给出的值为 0.714,高于三个中的两个。在普通编辑距离和两阶段匹配器上,它与得分最差的打字错误并列。在测试的每一项指标中,这对真正不同的产品都在同一组中得分,至少有一个真正的拼写错误。
拒绝
0.928
0.375
拼写错误
hdc1080 / hhdc1080
1
0.963
0.857
hdc1080 / hc1080
0.957
0.571
bme280 / bmp280
0.911
0.429
不同
bme280 / bme680
0.922
bmp085 / bmp280
0.876
0.250
hdc1008 / hdc1080
0.971
0.714
dht11 / dht22
0.813
0.333
scd30 / sgp30
0.760
0.143
sgp30 / sps30
0.880
表 1. 根据数据表验证的基本事实,所有五个指标下的每个得分对。粗体标记了击败棋盘的行。配对按原样使用数据而不是官方部件名称:dht22 是数据包含的内容,尽管制造商将该部件称为 AM2302。匹配器只能看到左列,而这个间隙才是真正的问题。
值得明确的是,这里一对就足够了。自然的反对意见是,n=10 对样本太小,这适用于与此处提出的不同类型的主张。如果目标是证明某个指标有效,则需要大量样本才能以任何置信度限制其错误率。但证明没有阈值可以将这两个组分开,只需要一对在拼写错误范围内得分与相反的基本事实。这里有几个这样的对,涉及测试的每个指标。收集更多数据可以添加更多反例,但不能删除已有的反例。
为什么第六个指标不保存此
阻止规则
两阶段匹配器也值得公平核算。它的数字核心规则根本拒绝考虑 sds011 和 sds1001,因为 011 和 1001 是不同的数字字符串,因此它甚至没有机会捕获它所构建的拼写错误。它仍然以 1 的距离将 bme280 与 bmp280 合并,因为它们共享数字核心 280。我在其中内置的结构安全性保持了我的目标,但在其他地方失败了。它错过了旨在捕获的拼写错误,并发生了旨在防止的碰撞。
全面披露:这个论证有一个版本是不可证伪的,而且这个版本没有多大价值。我没有测试所有可能的匹配器——没有人可以——而且完全有可能一些未经测试的指标看起来对这个特定的样本有效。但我想要提出的主张在这个意义上并不是经验主义的。它是结构性的——决定身份的事实根本不包含在字符串中。
考虑一下我之前废弃的那对。如果博世明年发布 BMP200,则 bmp280 和 bmp200 之间的关系将从拼写错误转变为截然不同,并且两个字符串都不会更改单个字符。所做的是公司内部做出的与任一字符串的字符无关的决定。
这不仅仅是为了效果而设计的假设 - 这是该配对不存在的实际原因。我不能排除 BMP200 的存在,这正是我将这对放在一边而不是评分的原因。事实证明,这种情况是我最终得到三个确认的拼写错误对而不是四个的原因。
没有两个字符串的函数可以读取制造商的目录。不是我测试的五个指标,也不是我没有尝试的第六个指标,也不是一个学习模型。学习实体匹配确实很擅长它的功能——2016 年 Konda 的 Magellan,或者 Li 等人的预训练语言模型方法。 2020 年——但两者都假设你已经标记了训练数据,并且对你无法完全质疑其推理的模型有一定的容忍度。经过训练的模型在这里会失败,原因与手工构建的模型相同:它所需的信号不在输入中。如果您直接将目录交给它,那么您基本上已经重建了下面描述的架构,只是透明度较低且没有审计跟踪,这对于 X 的每个值都一劳永逸地回答“您是否尝试过 X”。
目录也不是固定的参考。窗口中每年都会输入新密钥,第一年 15 个,最后 3 个,累计到 99 个(如下图 2)。因此,该字符串没有命名任何真实内容的说法是在特定时刻发生的,下个季度发布的部件可以翻转这一点,而无需更改单个存储的字节。
再次承认,这可能是整篇文章中最有力的一点:为了构建真实数据列,我必须查阅制造商数据表(手动检查的外部目录),正是因为数据集本身无法回答这个问题。设置实验需要在我运行它之前承认它自己的结论。
对于记录关联文献来说,这些都不是新闻。 Fellegi 和 Sunter 早在 1969 年就正式确定了概率联系; Christen 2012 年的研究指出了近似匹配的局限性。对于名称和地址而言,仅字符串相似性是不够的。这篇文章补充的是,从业者仍然对短字母数字设备代码进行模糊匹配,其中故障是类型而不是程度。身份根本不在代码中,保存身份的目录是外部的,并且会随着时间的推移而变化。
幸存下来的架构
一旦去掉了测量排除的内容,剩下的就是下面的内容。
12
1. 仅合并归一化证明相同的内容。唯一合理的自动合并(步骤 1 已经做到了)是 114 个键到 99 个键,零风险,零阈值。
2. 模糊自动合并是被证据拒绝的,而不是被谨慎拒绝的。保守主义意味着对于风险承受者来说存在更大胆的选择。实际上没有:所需的信息不存在。
3. 其他一切都取决于人类,人类会查阅字符串不携带的目录。人类可以查看 hdc1008 和 hdc1080 并正确区分它们,并将该决定记录为标签 - 在查询时应用的东西,因此存储在数据中的身份仍然是实际观察到的内容的纯函数。
标签层不仅仅是为边缘情况提供便利,它也是必不可少的,因为如果匹配器可以安全地完成这项工作,标签就根本不需要存在。为了使系统保持在一起,它们需要满足三件事。
标签需要有生效日期
每个版本都带有一个有效期间隔,并且查询将根据截至其声明时间有效的版本进行解析。某物是否是真实的部分确实是随时间变化的。目录在窗口的每一年都会选取新的键,这意味着标签可以被世界上的事件推翻,而不是被数据集中到达的新数据推翻。如果您就地编辑标签,则会默默地重新组合历史记录。上个季度的聚合停止复制,而写入时正确的记录最终看起来总是在说不同的东西。该决议不是要纠正过去,而是要确定它的日期。
这个成本是由每个人承担的,而且很容易让机制的整洁隐藏它。一旦标签注明日期,就会出现诸如“部署了多少个 sds011 单元?”之类的问题。不再有一个真理;它在给定日期有一个答案,调用者必须提供该答案。以前不需要时间参数的接口现在需要一个。这就是再现性的代价。
标签永远不会作为训练信号返回到匹配器
造成这种情况的原因有三个,其中任何一个原因就足够了。身份需要保持记录自身内容的功能。如果匹配器根据过去的标签决策进行调整,身份就会成为处理历史的函数,并且随着时间的推移,相同的输入可能会停止生成相同的密钥。这样的匹配器也不再是你可以在审计中指出和解释的东西。一个使用自己的标签来改进匹配的系统,无意中构建了上面已经排除的学习匹配器。
标签也是数据,数据会漂移
对于关于标识符漂移的文章来说,如果旨在修复它的层引入了同一问题的自己的版本,那将是一个真正尴尬的结果。为了避免这种情况,标签必须来自受控词汇,使用与步骤 1 相同的功能进行自然键控和标准化,并记录谁做出决定、何时做出以及基于什么证据。没有附加作者的标签只是一个没有解释的声明。
可以肯定的是,我在编写时测试了这条规则。我的真实 CSV 有一个判决列,验证脚本将其读取为受控词汇表。有一次,我“改进”了一行,将其更改为“CONFIRMED REAL,PART NAME CORRECTED”。它是有效的 CSV,解析得很好,并且它默默地将该行从确认集中删除,因为新字符串不在词汇表中。因此,该规则在编写后大约四个小时内就吸引了其作者。
延期实际费用是多少
循环队列增长的速度取决于目录本身增长的速度。
候选人
将其他所有事情都交给人工处理是可行的,只要最终的队列保持较小。在测量时,这就是我的发现。成对比较所有 99 个键得出 4,851 次比较,但没有人手工审查那么多。阻塞将进一步减少到 30 个候选对,仅占全部空间的 0.62%,并且在初次通过之后,随着新密钥进入目录,每年会分成大约四个新对。因此,从本质上讲,这相当于提前一个早上的工作,以及每年做出的一些决定。
阻止本身并不是什么新鲜事;排序邻域阻塞可以追溯到 Hernández 和 Stolfo 在 1995 年提出的,冠层聚类则可以追溯到 McCallum 等人。 2000 年,局部敏感散列到 1997 年。不那么标准的(至少根据我的经验)是通过实际衡量这些规则的权衡来选择这些规则,而不是仅仅选择感觉熟悉的规则。
阻止哪个特定规则本身就是一个需要衡量的事情,而不是继承的事情。
所有对的百分比
出现拼写错误
编辑距离≤1
0.25%
2 of 3
编辑距离≤2
46
0.95%
3 of 3
编辑距离≤2,长度≥4(已选择)
30
0.62%
q-gram Jaccard ≥ 0.5
15
0.31%
相同数字签名
18
0.37%
表 2. 针对三个已验证的拼写错误测量的阻止规则。三个更便宜的规则漏掉了一个真正的拼写错误。
我测试的三个规则比我最终使用的规则便宜。他们三个都错过了 sds011/sds1001。这不是一次调音事故;而是一次事故。它直接遵循数字签名阻止的工作原理。 011 和 1001 是不同的数字字符串,因此这两个密钥一开始就不会落在同一个块中,这正是正确地将 bme280 和 bme680 分开的属性。结论是:保护你免受某种错误影响的财产,与让你忽视另一种错误的财产是同一个。
容量分类陷阱
任何看到此设置的人都可能会想到一个优化,它更像是一个陷阱而不是捷径。您可以只查看两个键都带有有意义的观察量的对,因为影响两个观察值的对不值得太多关注。这使得排队人数从 30 人减少到 6 人,从表面上看,这看起来像是一场免费的胜利。
它还删除了每一个经过验证的拼写错误。
几乎按照定义,拼写错误很少见。它们是某些贡献者碰巧犯下的错误,而不是大多数人输入的错误。我确认的三个错别字对中少数的一面分别出现了 1、2 和 2 次。因此,任何设置为五或以上的音量阈值都会在人类看到它们之前丢弃所有这三个。
除了传感器之外,这个通用版本也值得牢记。频率过滤器将系统地删除人们实际上试图找到的任何种群,只要该种群因构造而稀有。在这种特殊情况下,队列已经足够小,无论如何都不需要快捷方式。
评论实际购买了什么
这是一个令人不安的事实。手动处理所有 30 对数据,从 4,301 个观测值中总共移动了 5 个观测值,约占数据的 0.12%。
因此,相对于它所防范的内容而言,审查的成本较低,而且这是必要的,因为如果不查看全部 30 个观察结果,就无法找到确实需要修复的 5 个观察结果。
从这个过程中得到的并不是完全正确的数据。它知道数据是正确的。
摘要
这自然会带来一条捷径:为什么不自动合并所有 30 个候选者并跳过审核呢?只不过这会移动 217 个观察值,而不是 5 个,因为这 30 对中的大多数都是真实的产品,只是碰巧看起来很相似。 scd30 和 sps30 有两个特征不同,测量的东西完全不同。队列主要由决定不合并的对组成。这就是为什么它需要一个人来查看而不是由阈值自动决定。
这重新定义了评论实际购买的内容。在此之前,2,430 个观测值(数据集的 56%)位于具有未解析邻居的键上,这意味着无法自信地说该键的计数是否完整。经过审查,这个问题有了答案。
诚实的界限
这种架构并没有弥补它所造成的差距。输入了 99 个键,该领域可能有大约两打真实模型,审核过程解决了 30 对并确认了 3 个拼写错误。这些数字不一致,很容易让读者产生不同的想法。
原因与这里的其他所有内容一致。仅阻止在字符串空间中已经靠近的表面对。表 2 中的每条规则都是距离或重叠规则的某种版本,因此每条规则都会发现近似重复项,除此之外什么也没有。命名相同部分但不共享任何字符的两个键首先永远不会进入队列。
我自己的基本事实提供了一个这样的例子。 dht22 和 AM2302 用两个完全不同的名称命名同一个传感器,没有共享任何字符串 - 编辑距离为 5,共同的二元组为零,并且完全不同的数字签名。运行表 2 中的每条规则,都没有提出这对规则。因此,能够在一秒钟内解决问题的人永远不会被问到这个问题。
精度在这里很重要,因为这就是重点。 AM2302 实际上从未出现在该特定快照中,而 dht22 出现了 22 次。这不是观察到的失误。这就是规则在提供两种拼写时所做的事情,这就是第二个网关报告制造商名称而不是市场名称时发生的情况。在此数据集中,这一对不仅没有被标记,而且还没有被标记。它在所有配对的比较空间中完全缺失。有两个独立的原因导致人工审核员从未被询问,并且阈值调整也无法解决这些问题。别名问题确实比拼写错误问题更难,而这种架构并不能解决它。它拒绝猜测——这比猜错要好——但这并不等同于完成。缩小这一差距需要一个包含别名表的目录,而不是更好的阻止规则。
这里值得指出的两个较小的限制是:范围仅是标识符字段,而不是传感器测量内容的自由文本描述,这是一个相关但独立的问题;这是一个众包网络的快照,其开放提交表单可能会比受控模式产生更多的变化。该机制应该能够很好地推广。具体百分比可能不应该被视为基准。
六件事要带走
在评分之前从数据外部构建基本事实。如果在评分后进行分类,您倾向于进行分类以适合您已有的分数。我的最终否定了我自己的一项主张并纠正了另外两项,这是有效的方法而不是挫折
频率过滤器往往会删除您想要查找的确切稀有人群。拼写错误很少见,因此容量分类看起来是一个明显的胜利,最终会删除所有真实的人群。
复杂的指标更为危险。Damerau-Levenshtein 对换位的认识正是实际产品系列所利用的容忍度,因为制造商经常通过排列数字来对相关产品进行编号。
对于短字母数字代码,决定性的事实是在字符串之外。两个代码是否命名相同的产品由制造商的目录决定,该目录是外部的,随着时间的推移而变化,并且无法从字符本身访问。没有任何指标和学习模型可以解决这个问题。
为标签添加日期;不要改造它们。某件事是否真实通常只在特定时刻才是真实的。因此,有效的约会可以让标签随着时间的推移而改变,而不会让密封的历史记录悄然变得虚假。代价是该标签的每个下游消费者现在都必须提供最新日期。
可交付成果不是更正的数据。它知道数据是正确的。审查从 4,301 个观测值中删除了 5 个观测值,并将 56% 的数据从可能分散的数据变为可验证的完整数据。第二个是值得为一个人付出代价的东西。
这个匹配器最初是为了完成规范化开始而构建的。然而,测量表明它不能以安全的形式存在。一旦对照数据表验证的基本事实进行检查,五个不同的指标就会重叠,一对真实的 TI 部件最终看起来更像是一个拼写错误,而不是实际的拼写错误。根本原因是结构性的:决定身份的事实存在于制造商的目录中,而不是字符串的字符中。还剩下什么?仅在规范化证明安全的情况下自动合并,加上人工裁决的、有效日期的标签层,该标签层完全不参与模型 - 前期 30 对,一年后大约 4 对。
第 3 部分介绍了动态节奏和噪音过滤——新标识符出现并被判断的速度。接下来,第 4 部分介绍幂等存储和不可变快照,其中版本化标签满足密封记录。
参考实现是锚键 Apache-2.0,位于设备身份层(如 Eclipse Ditto 和 Eclipse Hono)之下,两者都假设已经存在稳定的设备身份。
pip install -e .pythonexamples/quickstart.pyfromanchorkeyimportnormalize,same_entity,needs_reviewsame_entity("SDS 011","sds011") # True — 规范化证明 itame_entity("SDS1001", "SDS011") # False — 拼写错误,但不会自动合并needs_review("SDS1001", "SDS011") # True — 路由到一个人,而不是same_entity("bme280", "bmp280") # False — 两个真正的博世部件
如果您在自己的管道中遇到过这个问题 - 特别是如果您找到了一个确实支持短代码的匹配器 - 我真的很想听听它。
再现数据
每个数字都来自公共 openSenseMap API 的一次可重新运行捕获,该 API 根据公共领域奉献和许可证 1.0 发布:
获取 https://api.opensensemap.org/boxes?bbox=7.58,51.93,7.66,51.99&format=json
捕获的是 2026-06-26 UTC 拍摄的 719 个框,产生 114 个不同的传感器类型字符串和 4,301 个观测值。活着算漂移,这是本系列的主题;因此,每个数字均来自存档快照,存放在 DOI 10.5281/zenodo.20989076。
参考文献
每个条目都在上面的特定声明中被引用,并将该部分括在括号中。
I. Fellegi 和 A. Sunter,记录链接理论,JASA 64(328),1969。[为什么第六个指标不能保存这个]
W. Cohen 等人,名称匹配任务的字符串距离度量的比较,IIWeb,2003。[规范化留下了什么]
四个脚本重新生成上面引用的每个数字,每个脚本都会根据此处断言的值交叉检查其输出,并在不匹配时退出非零:collapse_sample.py(114 → 99 减少)、keyshape_sample.py(人口数字)、separability_sample.py(表 1 中的每个分数)和 review_queue_sample.py(队列、阻塞、成本和别名盲点)。第五个是 make_figures.py,绘制图 1 和图 2。
基本事实是签入的工件,而不是附录声明。 ground_truth_catalog.csv 记录了 16 个字符串中的每一个——制造商、官方零件名称、数据表 URL、生命周期状态、访问日期和判决——包括我无法解析的字符串,以及唯一可获得的数据表是镜像而不是制造商托管的副本的三行。这些限制是按行记录的,而不是平滑的,因为源自镜像的目录断言正是本文所讨论的错误。
P. Christen,数据匹配,Springer,2012。[为什么第六个指标不能保存这个]
P. Konda 等人,Magellan:构建实体匹配管理系统,PVLDB 9(12),2016。[为什么第六个指标不能保存这个]
Y. Li et al.,Deep Entity Matching with Pre-Trained Language Models, PVLDB 14(1), 2020。 [为什么第六个指标不能保存这个] 也称为 Ditto;与下面的 Eclipse Ditto 无关。
M. Hernández 和 S. Stolfo,大型数据库的合并/清除问题,SIGMOD,1995。[延迟实际成本]
A. McCallum 等人,《高维数据集的高效聚类与参考匹配的应用》,KDD,2000 年。[延迟实际成本]
A. Broder,论文件的相似性和包含性,SEQUENCES,1997。[推迟实际成本]
Unicode 标准附件 #15,Unicode 规范化形式 [规范化留下了什么]
Eclipse Ditto·Eclipse Hono [摘要]
分类部件的制造商数据表(Bosch Sensortec、TI、Sensirion、Aosong、Nova Fitness),每行位于 ground_truth_catalog.csv 中。 [建立基本事实]
openSenseMap,公共公民科学传感器网络。 [复制数据]
网络资源访问时间:2026 年 8 月 14 日。制造商数据表在 ground_truth_catalog.csv 中包含每行访问日期。
