мотивация
Я работаю с наборами данных, которые содержат информацию, позволяющую установить личность (PII), и иногда мне приходится делиться частью набора данных с третьими сторонами таким образом, чтобы не подвергать PII и не подвергать моего работодателя ответственности. Наш обычный подход - полностью скрыть данные или, в некоторых случаях, уменьшить их разрешение; например, замена точного адреса улицы соответствующим округом или районом переписи.
Это означает, что определенные виды анализа и обработки должны выполняться внутри компании, даже если у третьей стороны есть ресурсы и опыт, более подходящие для этой задачи. Поскольку исходные данные не разглашаются, в процессе анализа и обработки отсутствует прозрачность. В результате, способность любой третьей стороны выполнять QA / QC, корректировать параметры или вносить уточнения может быть очень ограниченной.
Анонимизация конфиденциальных данных
Одна из задач заключается в идентификации лиц по их именам в данных, предоставленных пользователями, с учетом ошибок и несоответствий. Частное лицо может быть записано в одном месте как «Дейв», а в другом - как «Дэвид», коммерческие организации могут иметь много разных сокращений, и всегда есть некоторые опечатки. Я разработал сценарии на основе ряда критериев, которые определяют, когда две записи с неидентичными именами представляют одного и того же человека, и присваивают им общий идентификатор.
На этом этапе мы можем сделать набор данных анонимным, удерживая имена и заменяя их этим личным идентификационным номером. Но это означает, что получатель почти не имеет информации, например, о силе матча. Мы бы предпочли иметь возможность передавать как можно больше информации без разглашения личности.
Что не работает
Например, было бы здорово иметь возможность шифровать строки, сохраняя при этом расстояние редактирования. Таким образом, третьи стороны могут выполнить некоторые из своих собственных 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 (т. Е. Насколько близко они совпадают).
Вывод
Цель состоит в том, чтобы преобразовать строки таким образом, чтобы при сохранении исходной строки было сохранено как можно больше полезных качеств исходной строки. Расшифровка должна быть невозможной или настолько непрактичной, что фактически невозможна, независимо от размера набора данных. В частности, метод, который сохраняет расстояние редактирования между произвольными строками, был бы очень полезен.
Я нашел пару документов, которые могут быть актуальны, но они немного над моей головой:
источник
На полпути, прочитав ваш вопрос, я понял, что расстояние Левенштейна может стать хорошим решением вашей проблемы. Приятно видеть, что у вас есть ссылка на статью по этой теме. Позвольте мне посмотреть, смогу ли я пролить свет на то, как будет выглядеть решение Левенштейна.
Расстояние Левенштейна используется во многих отраслях для разрешения сущностей, что делает его полезным, поскольку оно является мерой различия между двумя последовательностями. В случае сравнения строк это просто последовательности символов.
Это может помочь решить вашу проблему, позволив вам указать одно число, показывающее, насколько похож текст другого поля.
Вот пример основного способа использования Левенштейна с данными, которые вы предоставили:
Это обеспечивает правильное решение, расстояние 8 обеспечивает некоторую индикацию отношения, и оно очень PII-совместимо. Тем не менее, это все еще не супер полезно, давайте посмотрим, что произойдет, если мы сделаем некоторую текстовую магию, чтобы взять только первый инициал имени и полное имя, выбрасывая что-либо в середине:
Как видите, расстояние Левенштейна, равное 0, довольно показательно для отношений. Обычно поставщики данных объединяют множество перестановок Левенштейна имени и фамилии с 1, 2 или всеми символами, просто чтобы придать некоторую размерность тому, как связаны сущности, при этом сохраняя анонимность в данных.
источник
Если возможно, я бы связал связанные записи (например, Дейв, Дэвид и т. Д.) И заменил их порядковым номером (1,2,3 и т. Д.) Или соленым хешем строки, которая используется для представления всех связанных записей ( например, Дэвид вместо Дейва).
Я предполагаю, что третьи стороны не должны иметь никакого представления о том, каково настоящее имя, иначе вы могли бы также дать его им.
редактировать : вам нужно определить и обосновать, какие операции должна выполнять третья сторона. Например, что не так с использованием инициалов, за которыми следует число (например, BOA-1, BOA-2 и т. Д.) Для устранения неоднозначности Bank of America с Бенджамином Отелло Эймсом? Если это слишком показательно, вы можете скопировать некоторые буквы или имена; например, [AE] -> 1, [FJ] -> 2 и т. д., поэтому BOA станет 1OA, или [«Банк», «Барри», «Брюс» и т. д.] -> 1, так что Bank of America снова 1OA.
Для получения дополнительной информации см. K-анонимность .
источник
Один из вариантов (в зависимости от размера набора данных) состоит в том, чтобы просто указать расстояния редактирования (или другие меры сходства, которые вы используете) в качестве дополнительного набора данных.
Например:
Хотя многое еще можно сделать, чтобы деанонимизировать данные этих событий.
Например, если известно, что «Тим» является самым популярным именем для мальчика, подсчет частот идентификаторов, которые близко соответствуют известному проценту Тимов по всему населению, может дать это. Оттуда вы можете искать имена с расстоянием редактирования 1 и заключить, что эти идентификаторы могут ссылаться на «Том» или «Джим» (в сочетании с другой информацией).
источник
Я не совсем уверен, но, возможно, хеширование с учетом локальных условий является хорошим решением. Он хэширует входные данные (в вашем случае - имена), поэтому оригинальные строки будут сохранены. С другой стороны, основная идея LSH - максимизировать вероятность хеширования для подобных элементов. Есть много разных LSH-реализаций. Я попробовал Nilsimsa-hash для сравнения текстов в твиттере, и это сработало довольно хорошо. Но я не уверен, насколько хорошо это будет работать в случае коротких строк (имен) - этот вопрос требует тестирования. Я попробовал ваши примеры, и вот результат (имя A, имя B, «расстояние» - максимум 120):
Как видите, CHRISTOPH BAUER и CJ BAUER оказались ближайшей парой. Но разница не значительна. И просто для примера - хэш-представление этих имен:
источник
Вот подход, который я не видел упомянутым: разделить процесс на два этапа: первый этап сфокусирован на кодировании имен, чтобы альтернативные версии с одинаковыми именами кодировались одинаково (или почти одинаково), а второй этап был сосредоточен на создании их анонимно.
Для первого шага вы можете использовать один из фонетических алгоритмов (Soundex и варианты) , применяемый к имени, фамилии и инициалам в различных порядках. (Смотрите также эту статью ). Именно на этом шаге вы разрешаете сходства и различия в именах, чтобы сбалансировать ложные срабатывания и ложные отрицания.
На втором шаге вы можете выбрать любой хеширующий или криптографический метод, который вам нравится, не заботясь о том, как этот метод влияет на сопоставление имен. Это дает вам свободу использовать метод, который обладает лучшими характеристиками как по производительности, надежности и анонимности.
источник