Motivación
Trabajo con conjuntos de datos que contienen información de identificación personal (PII) y, a veces, necesito compartir parte de un conjunto de datos con terceros, de manera que no exponga la PII y exponga a mi empleador a responsabilidad. Nuestro enfoque habitual aquí es retener datos por completo o, en algunos casos, reducir su resolución; por ejemplo, reemplazando una dirección de calle exacta con el condado o sección censal correspondiente.
Esto significa que ciertos tipos de análisis y procesamiento deben realizarse internamente, incluso cuando un tercero tenga recursos y experiencia más adecuados para la tarea. Dado que los datos de origen no se divulgan, la forma en que hacemos este análisis y procesamiento carece de transparencia. Como resultado, la capacidad de un tercero para realizar QA / QC, ajustar parámetros o realizar mejoras puede ser muy limitada.
Anonimizar datos confidenciales
Una tarea consiste en identificar a las personas por sus nombres, en los datos enviados por el usuario, teniendo en cuenta los errores y las inconsistencias. Un individuo privado puede ser registrado en un lugar como "Dave" y en otro como "David", las entidades comerciales pueden tener muchas abreviaturas diferentes, y siempre hay algunos errores tipográficos. He desarrollado guiones basados en una serie de criterios que determinan cuándo dos registros con nombres no idénticos representan al mismo individuo y les asigna una identificación común.
En este punto, podemos hacer que el conjunto de datos sea anónimo reteniendo los nombres y reemplazándolos con este número de identificación personal. Pero esto significa que el destinatario casi no tiene información sobre, por ejemplo, la fuerza del partido. Preferiríamos poder transmitir la mayor cantidad de información posible sin divulgar la identidad.
Lo que no funciona
Por ejemplo, sería genial poder cifrar cadenas mientras se conserva la distancia de edición. De esta forma, los terceros podrían hacer algunos de sus propios controles de calidad / control de calidad, o elegir realizar un procesamiento adicional por su cuenta, sin tener que acceder (o poder realizar ingeniería inversa) a la PII. Quizás hagamos coincidir las cadenas internamente con la distancia de edición <= 2, y el destinatario quiere ver las implicaciones de ajustar esa tolerancia para editar la distancia <= 1.
Pero el único método con el que estoy familiarizado es ROT13 (más generalmente, cualquier cifrado de turno ), que apenas cuenta como cifrado; es como escribir los nombres al revés y decir: "¿Prometes que no voltearás el papel?"
Otra mala solución sería abreviar todo. "Ellen Roberts" se convierte en "ER" y así sucesivamente. Esta es una solución pobre porque en algunos casos las iniciales, en asociación con datos públicos, revelarán la identidad de una persona, y en otros casos es demasiado ambigua; "Benjamin Othello Ames" y "Bank of America" tendrán las mismas iniciales, pero sus nombres son diferentes. Entonces no hace ninguna de las cosas que queremos.
Una alternativa poco elegante es introducir campos adicionales para rastrear ciertos atributos del nombre, por ejemplo:
+-----+----+-------------------+-----------+--------+
| 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 |
+-----+----+-------------------+-----------+--------+
Llamo a esto "poco elegante" porque requiere anticipar qué cualidades pueden ser interesantes y es relativamente burdo. Si se eliminan los nombres, no hay mucho que pueda concluir razonablemente sobre la fuerza de la coincidencia entre las filas 2 y 3, o sobre la distancia entre las filas 2 y 4 (es decir, qué tan cerca están de la coincidencia).
Conclusión
El objetivo es transformar las cadenas de tal manera que se conserven tantas cualidades útiles de la cadena original como sea posible mientras se oculta la cadena original. El descifrado debería ser imposible, o tan poco práctico como para ser efectivamente imposible, sin importar el tamaño del conjunto de datos. En particular, un método que preserva la distancia de edición entre cadenas arbitrarias sería muy útil.
Encontré un par de artículos que podrían ser relevantes, pero están un poco pasados por alto: