Як я можу перетворити імена в конфіденційний набір даних, щоб зробити його анонімним, але зберегти деякі характеристики імен?


42

Мотивація

Я працюю з наборами даних, які містять особисту інформацію (PII), і іноді потрібно ділитися частиною набору даних з третіми сторонами, таким чином, що не піддають PII і не піддають мого роботодавця відповідальності. Наш звичайний підхід тут полягає в тому, щоб цілком утримувати дані або в деяких випадках зменшувати її дозвіл; наприклад, заміни точної адреси вулиці відповідною округою чи переписом.

Це означає, що певні типи аналізу та обробки повинні проводитись власними силами, навіть коли третя сторона має ресурси та досвід, більш відповідний цьому завдання. Оскільки вихідні дані не розкриваються, шлях, яким ми займаємось цим аналізом та обробкою, не має прозорості. Як результат, будь-яка можливість будь-якої сторони виконувати QA / QC, коригувати параметри або вносити уточнення може бути дуже обмеженою.

Анонімізація конфіденційних даних

Одне завдання передбачає ідентифікацію осіб за їхніми іменами у поданих користувачем даних, враховуючи помилки та невідповідності. Приватна особа може бути записана в одному місці як "Дейв", а в іншому як "Девід", комерційні організації можуть мати багато різних абревіатур, і завжди є певні помилки. Я розробив сценарії на основі ряду критеріїв, які визначають, коли два записи з неідентичними іменами представляють одну і ту ж особу, і присвоюють їм загальний ідентифікатор.

На даний момент ми можемо зробити набір даних анонімним, позбавивши імена та замінивши їх цим персональним ідентифікаційним номером. Але це означає, що одержувач майже не має інформації про, наприклад, силу матчу. Ми хотіли б мати можливість передавати якомога більше інформації, не розкриваючи особу.

Що не працює

Наприклад, було б чудово шифрувати рядки, зберігаючи відстань редагування. Таким чином, треті сторони можуть зробити якісь свої QA / QC або вирішити самостійно проводити подальшу обробку, не отримуючи жодного доступу (або не маючи можливості потенційно реверсувати) PII. Можливо, ми співставляємо рядки в будинку з відстанью редагування <= 2, і одержувач хоче переглянути наслідки посилення цього допуску до відстані редагування <= 1.

Але єдиний я знайомий з цим методом - це ROT13 (загалом, будь-який шифр зсуву ), який навряд чи навіть вважається шифруванням; це як написати імена догори ногами і сказати: "Обіцяй, що не перевернеш папір?"

Ще одним поганим рішенням було б скоротити все. "Еллен Робертс" стає "ЕР" тощо. Це невдале рішення, оскільки в деяких випадках ініціали, спільно з публічними даними, розкриють особистість людини, а в інших випадках - занадто неоднозначно; "Бенджамін Отелло Еймс" і "Банк Америки" матимуть однакові ініціали, але імена їх інакше не відрізняються. Отже, це не робить жодного з тих, що ми хочемо.

Неелегантною альтернативою є введення додаткових полів для відстеження певних атрибутів імені, наприклад:

+-----+----+-------------------+-----------+--------+
| 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 (тобто, наскільки вони близькі до відповідності).

Висновок

Мета полягає в тому, щоб перетворити рядки таким чином, щоб якомога більше корисних якостей початкового рядка було збережено максимально, затушуючи початковий рядок. Дешифрування має бути неможливим або настільки непрактичним, що фактично неможливо, незалежно від розміру набору даних. Зокрема, метод, який зберігає відстань редагування між довільними рядками, був би дуже корисним.

Я знайшов пару паперів, які можуть бути актуальними, але вони трохи над головою:

Відповіді:


19

Одне з посилань, про яке я згадував в ОП, призвело до потенційного рішення, яке здається досить потужним, описаного в " Зв'язку записів, що зберігає конфіденційність, за допомогою фільтрів Bloom" ( doi: 10.1186 / 1472-6947-9-41 ):

Розроблений новий протокол для збереження конфіденційності запису з зашифрованими ідентифікаторами, що дозволяє помилитися в ідентифікаторах. Протокол заснований на фільтрах Bloom на q-грамах ідентифікаторів.

У статті детально йдеться про метод, який я підсумую тут якнайкраще.

Фільтр Bloom - це серія бітів фіксованої довжини, що зберігає результати фіксованого набору незалежних хеш-функцій, кожен з яких обчислюється на одному вхідному значенні. Вихід кожної хеш-функції повинен бути значенням індексу серед можливих індексів у фільтрі; тобто, якщо у вас є 0-індексований ряд з 10 біт, хеш-функції повинні повертати (або відображати на них) значення від 0 до 9.

Фільтр починається з кожного біта, встановленого на 0. Після хешування вхідного значення кожної функції з набору хеш-функцій, кожен біт, що відповідає значенню індексу, поверненому будь-якою хеш-функцією, встановлюється на 1. Якщо той самий індекс повертається більше ніж одна хеш-функція, біт у цьому індексі встановлюється лише один раз. Ви можете вважати фільтр Bloom суперпозицією набору хешей на фіксований діапазон біт.

Протокол, описаний у вищезв'язаній статті, розділяє рядки на n-грами, які в даному випадку є наборами символів. Як приклад, "hello"можна навести наступний набір з 2 грамів:

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

Прокладка спереду та ззаду з пробілами здається, як правило, необов'язковою при конструюванні n-грамів; у прикладах, наведених у роботі, що пропонує цей метод, використовують такі набивки.

Кожен n-грам може бути хеширован, щоб отримати фільтр Bloom, і цей набір фільтрів Bloom може бути накладений на себе (порозрядне чи операція), щоб створити фільтр Bloom для рядка.

Якщо фільтр містить набагато більше бітів, ніж є хеш-функції або n-грам, довільні рядки порівняно навряд чи можуть створити абсолютно той самий фільтр. Однак, чим більше n-грам мають два рядки, тим більше бітів у кінцевому рахунку поділять їх. Потім можна порівняти будь-які два фільтри A, Bза їх коефіцієнтом кістки:

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

Де hкількість бітів, встановлених 1 в обох фільтрах, a- це кількість бітів, встановлених на 1 лише у фільтрі A, і bкількість бітів, встановлених на 1 лише у фільтрі B. Якщо рядки точно однакові, коефіцієнт кістки буде дорівнює 1; чим більше вони відрізняються, тим ближче буде коефіцієнт 0.

Оскільки хеш-функції відображають невизначене число унікальних входів на невелику кількість можливих бітових індексів, різні входи можуть виробляти один і той же фільтр, тому коефіцієнт вказує лише на ймовірність того, що рядки однакові або схожі. Кількість різних хеш-функцій та кількість бітів у фільтрі є важливими параметрами для визначення ймовірності помилкових позитивних результатів - пар входів, які набагато менше подібні, ніж прогнозує коефіцієнт Dice.

Я знайшов цей підручник дуже корисним для розуміння фільтра Bloom.

Існує деяка гнучкість у здійсненні цього методу; Дивіться також цей документ у 2010 році (також пов'язаний в кінці питання) щодо деяких ознак того, наскільки він ефективний стосовно інших методів та з різними параметрами.


Позначте це як прийняту відповідь, оскільки із запропонованих підходів це найбільш перспективний для мого конкретного випадку використання.
Повітря

Дякую за всі ці деталі та передумови. Чи стикалися ви з будь-якою реалізацією (наприклад, в Python) цього підходу?
amball

@amball у мене немає.
Повітря

8

На півдорозі, прочитавши ваше запитання, я зрозумів, що відстань Левенштайн може стати гарним рішенням вашої проблеми. Добре бачити, що у вас є посилання на статтю на цю тему, дозвольте мені побачити, чи можу я пролити трохи світла на те, як виглядатиме рішення Левенштейна.

Відстань Левенштейна використовується у багатьох галузях промисловості для вирішення сутності, і це робить корисним те, що це міра різниці між двома послідовностями. У разі порівняння рядків це лише послідовності символів.

Це може допомогти вирішити вашу проблему, дозволяючи надати одне число, яке визначає, наскільки схожий текст іншого поля.

Ось приклад основного способу використання Левенштейна з наданими вами даними:

введіть тут опис зображення

Це забезпечує нормальне рішення, відстань 8 дає певні ознаки відносин, і це дуже сумісно з PII. Однак це все ще не надто корисно, давайте подивимося, що станеться, якщо ми зробимо якусь текстову магію, щоб взяти лише першу ініціативу імені та повне прізвище, пропустивши щось посередині:

введіть тут опис зображення

Як ви бачите, відстань Левенштейна в 0 дуже вказує на відносини. Зазвичай постачальники даних поєднують купу перестановок Левенштейна імен та прізвищ з 1, 2 або всіма символами лише для того, щоб надати певну розмірність того, як пов’язані сутності, зберігаючи при цьому анонімність.


1
Що мене цікавить у роботі, яку я пов’язав, це те, що вона стверджує, що вона демонструє метод для проведення такого обчислення без знання обох вхідних рядків . У статті кожен актор має знання однієї струни, що не корисно для моїх цілей; Мені знадобиться один актор, щоб мати змогу виконати обчислення без знання жодної струни. Заздалегідь обчислити їх можливо лише для дуже малих наборів даних або дуже обмежених продуктів; повний поперечний добуток цілих відстаней на моєму наборі даних зайняв би ~ 10 PB пам’яті.
Повітря

Ось чому я підніс ідею шифру заміни (ROT13), оскільки він зберігає відстань між рядками; але це не безпечно, і я підозрюю, що неможливо надійно зашифрувати рядки, зберігаючи відстань редагування. (Хочеться помилятися!)
Повітря

Правильно, я би просто відфільтрував матрицю, щоб включити лише Левенштейн нижче певного обрізу, тож ви заселяєте лише там, де висока ймовірність перекриття. Крім того, якщо мова йде про PII, я думаю, що якщо ви включите у свою набір даних достатньо інформації, щоб визначити взаємозв'язок між різними суб'єктами, то це малоймовірно, що ви зберігаєте анонімність клієнтів. Сенс анонімізації даних полягає в тому, щоб уникнути можливих регуляторних головних болів, пов'язаних з ІПС, за цією лінією (стандарти завжди можна посилити), тому особисто я б не ризикував.
neone4373

7

Якщо це можливо, я б зв'язав пов'язані записи (наприклад, Дейв, Девід тощо) і замінив їх порядковим номером (1,2,3 і т.д.) або соленим хеш-рядком, який використовується для представлення всіх пов'язаних записів ( наприклад, Девід замість Дейва).

Я припускаю, що треті сторони не повинні мати жодного уявлення про те, що таке справжнє ім'я, інакше ви можете також дати їм це.

редагувати : Вам потрібно визначити та обґрунтувати, які операції потрібно виконувати третій стороні. Наприклад, що не в тому, щоб використовувати ініціали, за якими слідує цифра (наприклад, BOA-1, BOA-2 тощо) для роз'єднання Банку Америки від Бенджаміна Отелло Емеса? Якщо це занадто показово, ви можете поповнити деякі букви або імена; наприклад, [AE] -> 1, [FJ] -> 2 і т.д. 1ОА.

Для отримання додаткової інформації див k-анонімність .


Вдячний за посиланням на k-анонімність та пропозицією бін - це дає мені щось нове подумати.
Повітря

6

Один із варіантів (залежно від розміру вашого набору даних) - просто вказати відстані редагування (або інші заходи подібності, які ви використовуєте) як додатковий набір даних.

Наприклад:

  1. Створіть набір унікальних імен у наборі даних
  2. Для кожного імені обчисліть відстань редагування один до одного імені
  3. Створіть ідентифікатор або незворотний хеш для кожного імені
  4. Замініть імена в початковому наборі даних цим ідентифікатором
  5. Надайте матрицю відстаней редагування між номерами ідентифікаторів як новий набір даних

Хоча ще багато можна зробити, щоб деанонімізувати дані з цих рівних.

Наприклад, якщо "Тім", як відомо, є найпопулярнішим іменем для хлопчика, підрахунок частоти ідентифікаторів, які тісно відповідають відомому відсотку Тімсу серед населення, може це віддати. Звідти ви можете шукати імена з відстанью редагування 1 і зробити висновок, що ці ідентифікатори можуть посилатися на "Том" або "Джим" (у поєднанні з іншою інформацією).


5

Я не зовсім впевнений, але, можливо, хеш-чутливість до місцевості є хорошим рішенням. Він робить хешування вхідних даних (у вашому випадку - імена), тому оригінальні рядки будуть збережені. З іншого боку, основна ідея LSH полягає в тому, щоб збільшити ймовірність хешей для подібних предметів. Існує дуже багато різних LSH-реалізацій. Я спробував Нілсімша-хеш для порівняння твіттів текстів, і це спрацювало непогано. Але я не впевнений, наскільки добре він буде працювати у випадку коротких рядків (імен) - це питання потребує тестування. Я спробував ваші приклади, і ось результат (ім'я А, ім'я В, "відстань" - максимум 120):

1. AMELIA BEDELIA  - CHRISTOPH BAUER - 107
2. AMELIA BEDELIA  - C J BAUER       - 82
3. AMELIA BEDELIA  - FRANZ HELLER    - 91
4. CHRISTOPH BAUER - C J BAUER       - 81
5. CHRISTOPH BAUER - FRANZ HELLER    - 98
6. C J BAUER       - FRANZ HELLER    - 83

Як бачите, CHRISTOPH BAUER та CJ BAUER виявилися найближчою парою. Але різниця не суттєва. І лише для прикладу - хеш-представлення цих імен:

AMELIA BEDELIA  6b208299602b5000c3005a048122a43a828020889042240005011c1880864502
CHRISTOPH BAUER 22226448000ab10102e2860b52062487ff0000928e0822ee106028016cc01237
C J BAUER       2282204100961060048050004400240006032400148000802000a80130402002
FRANZ HELLER    58002002400880080b49172044020008030002442631e004009195020ad01158

3

Ось підхід, про який я не бачив: розділіть процес на два етапи: перший крок зосереджений на кодуванні імен, щоб альтернативні версії з тим самим іменем кодувалися однаковими (або майже однаковими), а другий крок був зосереджений на створенні вони анонімні.

Для першого кроку ви можете використовувати один із фонетичних алгоритмів (Soundex та варіанти) , застосований до імені, прізвища та ініціалів у різних порядках. (Дивіться також цю статтю ). Саме на цьому кроці ви вирішуєте схожість та відмінності в іменах, щоб врівноважувати помилкові позитиви з помилковими негативами.

Для другого кроку ви можете вибрати будь-який хешируючий чи криптографічний метод, який вам подобається, не турбуючись про те, як цей метод впливає на відповідність імен. Це дає вам свободу використовувати метод, який має найкращі характеристики як для продуктивності, надійності, так і для анонімності.


Я не думаю, що ця пропозиція не вирішує проблему, оскільки вона представлена ​​у запитанні. Де гнучкість післяшифрування? Як уточнити ваш аналіз без доступу до оригінальних даних?
Повітря

@AirThomas Вибачте, але я не розумію ваших двох питань. Що ви маєте на увазі під "гнучкістю постшифрування"? У вашому запиті / описі я нічого не бачив. Що ви маєте на увазі "вдосконалити аналіз без доступу до вихідних даних"? Я нічого не бачив у "переробці".
MrMeritology

1
Я спробував визначити проблему у другому параграфі розділу Мотивація . Уявімо, наприклад, що ви хочете випустити свій набір даних для різних дослідників, які хочуть зайнятись моделюванням. Існує будь-яка кількість розумних та ефективних методологій, які можна було б застосувати, і кожен дослідник працює трохи інакше. Ви не можете розкривати імена приватних осіб у вашому наборі даних. Якщо ви виконаєте цю частину аналізу перед випуском даних, це змусить ваш вибір методології для всіх.
Повітря

Якщо ви додатково надаєте хеші імен, користь полягає в тому, що треті сторони можуть розрізнити точну особу, але не більше. Отже, питання полягає в тому, як ви могли б надати більше інформації про дані, які ви не можете опублікувати? Наприклад, чи існує метод, який зберігає у виведенні хешування / шифрування відстань редагування між довільними входами? Я знайшов принаймні один метод, який принаймні наближає цю функціональність (для отримання додаткової інформації дивіться власну відповідь). Я сподіваюся, що це робить більш зрозумілими.
Повітря
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.