如何转换机密数据集中的名称以使其匿名,但保留名称的某些特征?

数据挖掘 数据清理 匿名化
2021-09-16 20:46:24

动机

我使用包含个人身份信息 (PII) 的数据集,有时需要与第三方共享部分数据集,这种方式不会暴露 PII 并使我的雇主承担责任。我们通常的做法是完全保留数据,或者在某些情况下降低其分辨率;例如,用相应的县或人口普查区替换确切的街道地址。

这意味着某些类型的分析和处理必须在内部完成,即使第三方拥有更适合该任务的资源和专业知识。由于没有披露源数据,我们进行这种分析和处理的方式缺乏透明度。因此,任何第三方执行 QA/QC、调整参数或进行改进的能力都可能非常有限。

匿名化机密数据

其中一项任务涉及在用户提交的数据中通过姓名识别个人,同时考虑到错误和不一致。一个私人可能在一个地方被记录为“Dave”,在另一个地方被记录为“David”,商业实体可以有许多不同的缩写,并且总是有一些拼写错误。我已经根据一些标准开发了脚本,这些标准确定两个名称不同的记录何时代表同一个人,并为它们分配一个公共 ID。

此时,我们可以通过保留名称并用这个个人 ID 号替换它们来使数据集匿名。但这意味着接收者几乎没有关于例如匹配强度的信息。我们希望能够在不泄露身份的情况下传递尽可能多的信息。

什么不起作用

例如,能够在保持编辑距离的同时加密字符串会很棒。这样,第三方可以自己做一些 QA/QC,或者选择自己做进一步的处理,而无需访问(或可能进行反向工程)PII。也许我们在内部将字符串与编辑距离 <= 2 进行匹配,而接收者想要查看将公差收紧到编辑距离 <= 1 的含义。

但我熟悉的唯一方法是ROT13(更一般地说,任何移位密码),它甚至几乎不能算作加密;这就像把名字倒过来然后说,“保证你不会把纸翻过来?”

另一个糟糕的解决方案是缩写所有内容。“艾伦·罗伯茨”变成了“ER”等等。这是一个糟糕的解决方案,因为在某些情况下,与公共数据相关联的姓名首字母会揭示一个人的身份,而在其他情况下,它太模棱两可了;“Benjamin Othello Ames”和“Bank of America”将具有相同的首字母,但它们的名称不同。所以它不会做我们想要的任何事情。

一个不优雅的替代方法是引入额外的字段来跟踪名称的某些属性,例如:

+-----+----+-------------------+-----------+--------+
| Row | ID | Name              | WordChars | Origin |
+-----+----+-------------------+-----------+--------+
| 1   | 17 | "AMELIA BEDELIA"  | (6, 7)    | Eng    |
+-----+----+-------------------+-----------+--------+
| 2   | 18 | "CHRISTOPH BAUER" | (9, 5)    | Ger    |
+-----+----+-------------------+-----------+--------+
| 3   | 18 | "C J BAUER"       | (1, 1, 5) | Ger    |
+-----+----+-------------------+-----------+--------+
| 4   | 19 | "FRANZ HELLER"    | (5, 6)    | Ger    |
+-----+----+-------------------+-----------+--------+

我称之为“不优雅”,因为它需要预测哪些品质可能会很有趣,而且它相对粗糙。如果删除了名称,则您无法合理地得出关于第 2 行和第 3 行之间匹配强度或第 2 行和第 4 行之间距离(​​即它们与匹配的接近程度)的合理结论。

结论

目标是以这样一种方式转换字符串,即尽可能多地保留原始字符串的有用品质,同时掩盖原始字符串。无论数据集的大小如何,解密都应该是不可能的,或者实际上是不可能的。特别是,保留任意字符串之间的编辑距离的方法将非常有用。

我找到了几篇可能相关的论文,但它们有点超出我的想象:

4个回答

我在 OP 中提到的参考资料之一使我找到了一个看起来非常强大的潜在解决方案,在“使用 Bloom 过滤器的隐私保护记录链接”(doi:10.1186/1472-6947-9-41)中进行了描述:

已经开发了一种用于与加密标识符进行隐私保护记录链接的新协议,该协议允许标识符中的错误。该协议基于 q-gram 标识符的 Bloom 过滤器。

本文详细介绍了该方法,我将尽我所能在此总结。

布隆过滤器是一个固定长度的位序列,存储一组固定的独立散列函数的结果,每个散列函数都在相同的输入值上计算。每个哈希函数的输出应该是过滤器中可能索引中的一个索引值;即,如果您有一个 0 索引的 10 位系列,则哈希函数应返回(或映射到)从 0 到 9 的值。

过滤器从每个位设置为 0 开始。在用散列函数集合中的每个函数对输入值进行散列后,任何散列函数返回的索引值对应的每个位都设置为 1。如果相同的索引被多个与一个哈希函数相比,该索引处的位仅设置一次。您可以将布隆过滤器视为一组哈希到固定位范围的叠加。

上述链接文章中描述的协议将字符串划分为 n-gram,在这种情况下是字符集。例如,"hello"可能会产生以下一组 2-gram:

["_h", "he", "el", "ll", "lo", "o_"]

在构建 n-gram 时,用空格填充前后似乎通常是可选的;论文中给出的提出这种方法的例子使用了这种填充。

每个 n-gram 可以被散列以产生一个布隆过滤器,并且这组布隆过滤器可以叠加在自身上(按位或运算)以产生字符串的布隆过滤器。

如果过滤器包含比散列函数或 n-gram 更多的位,则任意字符串相对不太可能产生完全相同的过滤器。然而,两个字符串共有的 n-gram 越多,它们的过滤器最终共享的比特就越多。然后,您可以A, B通过其 Dice 系数来比较任何两个过滤器:

D A, B = 2h / (a + b)

其中h是在两个过滤器中设置为 1a的位数,是在过滤器 A中设置为 1 的位数,是b在过滤器 B中设置为 1 的位数。如果字符串完全相同,骰子系数将为 1;差异越大,系数越接近0

因为哈希函数将不确定数量的唯一输入映射到少量可能的位索引,不同的输入可能会产生相同的过滤器,因此系数仅表示字符串相同或相似的概率。不同哈希函数的数量和过滤器中的位数是确定误报可能性的重要参数 - 与此方法预测的 Dice 系数相比,输入对的相似性要低得多。

我发现本教程对理解 Bloom 过滤器非常有帮助。

这种方法的实现有一定的灵活性;另请参阅这篇 2010 年的论文(也在问题末尾链接),了解它与其他方法和各种参数的关系如何表现。

在阅读您的问题的中途,我意识到 Levenshtein Distance 可以很好地解决您的问题。很高兴看到您有关于该主题的论文的链接,让我看看我是否可以对 Levenshtein 解决方案的外观有所了解。

Levenshtein 距离在许多行业中用于实体解析,它的有用之处在于它是两个序列之间差异的度量。在字符串比较的情况下,它只是序列字符。

这可以通过允许您提供一个数字来帮助解决您的问题,该数字可以衡量另一个字段的文本的相似程度。

以下是使用 Levenshtein 与您提供的数据的基本方法的示例:

在此处输入图像描述

这提供了一个不错的解决方案,距离 8 提供了某种关系指示,并且非常符合 PII。然而,它仍然不是很有用,让我们看看如果我们做一些文字魔术,只取名字的第一个首字母,而全名在中间去掉任何东西会发生什么:

在此处输入图像描述

如您所见,Levenshtein 距离为 0 可以很好地表示一种关系。通常,数据提供者会将名字和姓氏的一堆 Levenshtein 排列与 1、2 或所有字符组合在一起,只是为了提供一些关于实体如何相关的维度,同时仍然保持数据中的匿名性。

如果可行,我将链接相关记录(例如,Dave、David 等)并将它们替换为序列号(1、2、3 等)或用于表示所有相关记录的字符串的加盐 哈希(例如,大卫而不是戴夫)。

我认为第三方不需要知道真实姓名是什么,否则您不妨将其提供给他们。

编辑:您需要定义并证明第三方需要能够执行的操作类型。例如,使用首字母后跟数字(例如,BOA-1、BOA-2 等)来消除美国银行与本杰明·奥赛罗·艾姆斯的歧义有什么问题?如果这太暴露了,你可以把一些字母或名字装箱;例如,[AE] -> 1, [FJ] -> 2 等等,所以 BOA 会变成 1OA,或者 ["Bank", "Barry", "Bruce", etc.] -> 1 所以美国银行又是1OA。

有关更多信息,请参阅k-匿名

一种选择(取决于您的数据集大小)是仅提供编辑距离(或您正在使用的其他相似性度量)作为附加数据集。

例如:

  1. 在数据集中生成一组唯一名称
  2. 对于每个名称,计算彼此名称的编辑距离
  3. 为每个名称生成一个 ID 或不可逆哈希
  4. 用此 ID 替换原始数据集中的名称
  5. 提供 ID 号之间的编辑距离矩阵作为新数据集

尽管仍然可以做很多事情来对来自这些数据的数据进行去匿名化。

例如,如果已知“蒂姆”是男孩最流行的名字,那么与已知的蒂姆在人群中的百分比密切匹配的 ID 频率计数可能会泄露这一点。然后,您可以从那里查找编辑距离为 1 的名称,并得出结论,这些 ID 可能指的是“Tom”或“Jim”(当与其他信息结合时)。