Motivasi
Saya bekerja dengan kumpulan data yang berisi informasi pengenal pribadi (PII) dan kadang-kadang perlu berbagi bagian dari dataset dengan pihak ketiga, dengan cara yang tidak mengekspos PII dan membuat majikan saya bertanggung jawab. Pendekatan kami yang biasa di sini adalah menahan data sepenuhnya, atau dalam beberapa kasus mengurangi resolusinya; misalnya, mengganti alamat jalan yang tepat dengan daerah atau sensus yang sesuai.
Ini berarti bahwa beberapa jenis analisis dan pemrosesan harus dilakukan sendiri, bahkan ketika pihak ketiga memiliki sumber daya dan keahlian yang lebih sesuai dengan tugas tersebut. Karena sumber data tidak diungkapkan, cara kami melakukan analisis dan pemrosesan ini kurang transparan. Akibatnya, kemampuan pihak ketiga mana pun untuk melakukan QA / QC, menyesuaikan parameter atau membuat penyempurnaan mungkin sangat terbatas.
Menganonimkan Data Rahasia
Satu tugas melibatkan mengidentifikasi individu dengan nama mereka, dalam data yang dikirimkan pengguna, sambil memperhitungkan kesalahan dan inkonsistensi akun. Seorang individu pribadi dapat direkam di satu tempat sebagai "Dave" dan di tempat lain sebagai "David," entitas komersial dapat memiliki banyak singkatan yang berbeda, dan selalu ada beberapa kesalahan ketik. Saya telah mengembangkan skrip berdasarkan sejumlah kriteria yang menentukan kapan dua catatan dengan nama yang tidak identik mewakili individu yang sama, dan menetapkannya sebagai ID umum.
Pada titik ini kita dapat membuat dataset anonim dengan menahan nama dan menggantinya dengan nomor ID pribadi ini. Tetapi ini berarti penerima hampir tidak memiliki informasi tentang misalnya kekuatan pertandingan. Kami lebih suka untuk dapat memberikan informasi sebanyak mungkin tanpa mengungkapkan identitas.
Apa yang Tidak Bekerja
Misalnya, akan sangat bagus untuk dapat mengenkripsi string sambil menjaga jarak sunting. Dengan cara ini, pihak ketiga dapat melakukan beberapa QA / QC mereka sendiri, atau memilih untuk melakukan pemrosesan lebih lanjut sendiri, tanpa pernah mengakses (atau secara potensial dapat merekayasa balik) PII. Mungkin kami mencocokkan string di rumah dengan jarak edit <= 2, dan penerima ingin melihat implikasi pengetatan toleransi untuk mengedit jarak <= 1.
Tetapi satu-satunya metode yang saya kenal yang melakukan ini adalah ROT13 (lebih umum, shift cipher ), yang bahkan tidak dianggap sebagai enkripsi; itu seperti menulis nama-nama terbalik dan berkata, "Berjanjilah kamu tidak akan membalik kertas itu?"
Solusi buruk lainnya adalah menyingkat semuanya. "Ellen Roberts" menjadi "ER" dan sebagainya. Ini adalah solusi yang buruk karena dalam beberapa kasus inisial, terkait dengan data publik, akan mengungkapkan identitas seseorang, dan dalam kasus lain itu terlalu ambigu; "Benjamin Othello Ames" dan "Bank of America" akan memiliki inisial yang sama, tetapi nama mereka berbeda. Jadi itu tidak melakukan salah satu hal yang kita inginkan.
Alternatif yang tidak berlaku adalah dengan memperkenalkan bidang tambahan untuk melacak atribut tertentu dari nama, misalnya:
+-----+----+-------------------+-----------+--------+
| 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 |
+-----+----+-------------------+-----------+--------+
Saya menyebutnya "tidak elok" karena memerlukan antisipasi kualitas mana yang mungkin menarik dan relatif kasar. Jika nama dihapus, tidak banyak yang dapat Anda simpulkan tentang kekuatan kecocokan antara baris 2 & 3, atau tentang jarak antara baris 2 & 4 (yaitu, seberapa dekat mereka dengan pencocokan).
Kesimpulan
Tujuannya adalah untuk mengubah string sedemikian rupa sehingga sebanyak mungkin kualitas yang berguna dari string asli dipertahankan sambil mengaburkan string asli. Dekripsi seharusnya tidak mungkin, atau tidak praktis untuk secara efektif tidak mungkin, tidak peduli ukuran set data. Secara khusus, metode yang menjaga jarak sunting antara string arbitrer akan sangat berguna.
Saya telah menemukan beberapa makalah yang mungkin relevan, tetapi mereka sedikit di atas kepala saya:
sumber
Di tengah membaca pertanyaan Anda, saya menyadari Levenshtein Distance bisa menjadi solusi yang bagus untuk masalah Anda. Adalah baik untuk melihat bahwa Anda memiliki tautan ke makalah tentang topik ini, biarkan saya melihat apakah saya dapat menjelaskan seperti apa solusi Levenshtein nantinya.
Jarak Levenshtein digunakan di banyak industri untuk resolusi entitas, yang membuatnya berguna adalah bahwa itu adalah ukuran perbedaan antara dua urutan. Dalam kasus perbandingan string itu hanya urutan karakter.
Ini bisa membantu menyelesaikan masalah Anda dengan memungkinkan Anda memberikan satu nomor yang memberikan ukuran seberapa mirip teks dari bidang lain.
Berikut adalah contoh cara dasar menggunakan Levenshtein dengan data yang Anda berikan:
Ini memberikan solusi ok, jarak 8 memberikan beberapa indikasi hubungan, dan sangat sesuai PII. Namun, itu masih tidak terlalu berguna, mari kita lihat apa yang terjadi jika kita melakukan beberapa keajaiban teks untuk mengambil hanya inisial pertama dari nama depan dan nama belakang lengkap menjatuhkan apa pun di tengah:
Seperti yang Anda lihat, jarak Levenshtein 0 cukup mengindikasikan hubungan. Umumnya penyedia data akan menggabungkan sekelompok permutasi Levenshtein dari nama depan dan belakang dengan 1, 2, atau semua karakter hanya untuk memberikan beberapa dimensi tentang bagaimana entitas terkait sementara tetap mempertahankan anonimitas dalam data.
sumber
Jika memungkinkan, saya akan menautkan catatan terkait (misalnya, Dave, David, dll.) Dan menggantinya dengan nomor urut (1,2,3, dll.) Atau hash asin dari string yang digunakan untuk mewakili semua catatan terkait ( misalnya, David bukannya Dave).
Saya berasumsi bahwa pihak ketiga tidak perlu tahu apa nama sebenarnya, jika tidak, Anda bisa memberikannya kepada mereka.
sunting : Anda perlu mendefinisikan dan membenarkan operasi seperti apa yang perlu dilakukan pihak ketiga. Misalnya, apa yang salah dengan menggunakan inisial diikuti oleh angka (misalnya, BOA-1, BOA-2, dll.) Untuk mengacaukan Bank of America dari Benjamin Othello Ames? Jika itu terlalu terbuka, Anda bisa membuang beberapa huruf atau nama; misal, [AE] -> 1, [FJ] -> 2, dll. jadi BOA akan menjadi 1OA, atau ["Bank", "Barry", "Bruce", dll] -> 1 sehingga Bank of America kembali 1OA.
Untuk informasi lebih lanjut lihat k-anonimitas .
sumber
Satu opsi (tergantung pada ukuran dataset Anda) adalah hanya memberikan jarak sunting (atau ukuran kesamaan lainnya yang Anda gunakan) sebagai dataset tambahan.
Misalnya:
Meskipun masih banyak yang bisa dilakukan untuk mendanonimkan data dari data ini.
Misalnya jika "Tim" dikenal sebagai nama yang paling populer untuk anak laki-laki, penghitungan frekuensi ID yang cocok dengan persentase Tim yang diketahui di seluruh populasi mungkin memberikan itu. Dari sana Anda kemudian dapat mencari nama dengan jarak sunting 1, dan menyimpulkan bahwa ID tersebut mungkin merujuk ke "Tom" atau "Jim" (bila digabungkan dengan info lainnya).
sumber
Saya tidak yakin, tapi mungkin hashing yang sensitif terhadap lokalitas adalah solusi yang baik. Itu hashing dari input data (dalam kasus Anda - nama), sehingga string asli akan dipertahankan. Di sisi lain, ide utama LSH adalah untuk memaksimalkan kemungkinan hash untuk item serupa. Ada banyak implementasi LSH yang berbeda. Saya mencoba hash Nilsimsa untuk membandingkan teks tweet, dan itu bekerja dengan cukup baik. Tapi saya tidak yakin, seberapa baik itu akan bekerja jika string pendek (nama) - masalah ini memerlukan pengujian. Saya mencoba contoh Anda, dan inilah hasilnya (nama A, nama B, "jarak" - maksimum 120):
Seperti yang Anda lihat, CHRISTOPH BAUER dan CJ BAUER muncul menjadi pasangan terdekat. Tetapi perbedaannya tidak signifikan. Dan hanya sebagai contoh - representasi hash dari nama-nama ini:
sumber
Berikut ini pendekatan yang saya tidak lihat disebutkan: pisahkan proses menjadi dua langkah: langkah pertama difokuskan pada pengkodean nama sehingga versi alternatif dari nama yang sama dikodekan sama (atau hampir sama), dan langkah kedua berfokus pada pembuatan mereka anonim.
Untuk langkah pertama, Anda dapat menggunakan salah satu Algoritma Fonetik (Soundex dan varian) , diterapkan pada nama depan, nama belakang, dan inisial dalam berbagai pesanan. (Lihat artikel ini juga). Itu dalam langkah ini di mana Anda menyelesaikan persamaan vs perbedaan dalam nama untuk menyeimbangkan positif palsu dari negatif palsu.
Untuk langkah kedua, Anda dapat memilih metode hashing atau kriptografi apa pun yang Anda suka, tanpa memperhatikan bagaimana metode itu memengaruhi pencocokan nama. Ini memberi Anda kebebasan untuk menggunakan metode yang memiliki karakteristik terbaik untuk kinerja, ketahanan, dan anonimitas.
sumber