动机
我使用的数据集包含个人身份信息(PII),有时需要与第三方共享数据集的一部分,以免暴露PII并使我的雇主承担责任。我们通常的做法是完全保留数据,或者在某些情况下降低其分辨率。例如,将确切的街道地址替换为相应的县或人口普查区。
这意味着即使第三方拥有更适合该任务的资源和专业知识,某些类型的分析和处理也必须在内部完成。由于未公开源数据,因此我们进行此分析和处理的方式缺乏透明度。结果,任何第三方执行QA / QC,调整参数或进行细化的能力可能都非常有限。
匿名机密数据
一项任务涉及在用户提交的数据中通过姓名识别个人,同时考虑到错误和不一致之处。私人可能在一个地方被记录为“戴夫”,而在另一地方被记录为“大卫”,商业实体可以具有许多不同的缩写,并且总是有一些错别字。我已经基于许多标准开发了脚本,这些标准确定两条具有不同名称的记录何时代表同一个人,并为其分配一个通用ID。
此时,我们可以通过保留名称并将其替换为该个人ID号来使数据集匿名。但这意味着接收者几乎没有关于例如比赛强度的信息。我们希望能够传递尽可能多的信息而不会泄露身份。
什么不起作用
例如,在保留编辑距离的同时能够加密字符串将是很棒的。这样,第三方可以执行自己的一些QA / QC,或选择自己进行进一步的处理,而无需访问(或可能进行反向工程)PII。也许我们在内部将编辑距离<= 2的字符串匹配起来,接收者想看看收紧该公差以编辑距离<= 1的含义。
但是我所熟悉的唯一做到这一点的方法是ROT13(更一般地说,是任何移位密码),它几乎不算作加密。就像颠倒地写下名字,然后说:“保证您不会把纸翻过来吗?”
另一个不好的解决办法是简化所有内容。“艾伦·罗伯茨”变成“ ER”,依此类推。这是一个较差的解决方案,因为在某些情况下,姓名缩写与公共数据结合会透露一个人的身份,而在另一些情况下,则太含糊了;“本杰明·奥赛罗·埃姆斯”和“美国银行”将使用相同的首字母缩写,但名称不同。因此,它无法满足我们的任何需求。
另一个不错的选择是引入其他字段来跟踪名称的某些属性,例如:
+-----+----+-------------------+-----------+--------+
| 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之间的距离(即,它们与匹配的距离有多近),您将无法做出合理的结论。
结论
目的是对字符串进行转换,以在保留原始字符串的同时尽可能保留原始字符串的许多有用质量。无论数据集的大小如何,解密都应该是不可能的,或者实际上是不可能的。特别地,保留任意字符串之间的编辑距离的方法将非常有用。
我发现了几篇可能相关的论文,但它们让我有些头疼: