Gizli bir veri kümesindeki isimleri isimsiz hale getirmek için nasıl dönüştürebilirim, fakat isimlerin bazı özelliklerini koruyabilir miyim?


42

Motivasyon

Kişisel olarak tanımlanabilir bilgiler içeren veri setleri (PII) ile çalışıyorum ve bazen veri setinin bir bölümünü PII'yi ifşa etmeyecek ve işverenime borç vermeyecek şekilde üçüncü şahıslarla paylaşmaya ihtiyacım var. Buradaki olağan yaklaşımımız, verileri tamamen veya bazı durumlarda çözünürlüğünü azaltmak için tutmaktır; örneğin, tam bir sokak adresinin karşılık gelen ilçe veya nüfus sayımı yoluyla değiştirilmesi.

Bu, belirli bir analiz ve işleme türünün, üçüncü bir tarafın göreve daha uygun kaynaklara ve uzmanlığa sahip olmasına rağmen, kurum içinde yapılması gerektiği anlamına gelir. Kaynak veriler açıklanmadığından, bu analiz ve işleme gitme şeklimiz şeffaflıktan yoksundur. Sonuç olarak, herhangi bir üçüncü tarafın QA / QC yapma, parametreleri ayarlama veya ayrıntılandırma yapma yeteneği çok sınırlı olabilir.

Gizli Verileri Anonimleştirme

Bir görev, hataları ve tutarsızlıkları göz önünde bulundurarak, kullanıcı tarafından sunulan verilerde bireyleri adlarıyla tanımlamayı içerir. Özel bir birey bir yerde "Dave" ve diğerinde "David" olarak kaydedilebilir, ticari varlıklar birçok farklı kısaltmaya sahip olabilir ve her zaman bazı yazım hataları vardır. Aynı olmayan adlara sahip iki kaydın aynı kişiyi ne zaman temsil ettiğini belirleyen ve ortak bir kimlik atayan çeşitli kriterleri temel alan komut dosyaları geliştirdim.

Bu noktada, veri kümesini adlarını gizleyerek ve bu kişisel kimlik numarası ile değiştirerek anonim hale getirebiliriz. Ancak bu, alıcının örneğin maçın gücü hakkında neredeyse hiçbir bilgiye sahip olmadığı anlamına gelir. Kimliği açığa vurmadan olabildiğince fazla bilgi aktarabiliriz.

Ne çalışmıyor

Örneğin, düzenleme mesafesini korurken dizeleri şifrelemek harika olurdu. Bu yolla, üçüncü taraflar kendi QA / QC'lerinin bir kısmını yapabilir veya PII'ye hiç erişmeden (veya potansiyel olarak tersine mühendislik uygulayamadan) kendi başlarına daha fazla işlem yapmayı seçebilirler. Belki de dizeleri kurum içi düzenleme mesafesi <= 2 ile eşleştiririz ve alıcı bu düzenleme toleransını <= 1 düzenleme sıkılaştırmasının etkilerine bakmak ister.

Ancak buna aşina olduğum tek yöntem, bunu şifreleme olarak bile sayılmayan ROT13 (daha genel olarak herhangi bir vardiya şifresi ); Bu isimleri baş aşağı yazmak ve "kağıdı ters çevirmeyeceğine söz ver." demek gibi.

Başka bir kötü çözüm, her şeyi kısaltmak olacaktır. "Ellen Roberts" ve "ER" olur. Bu kötü bir çözümdür, çünkü bazı durumlarda ilkler, halka açık verilerle bağlantılı olarak, bir kişinin kimliğini ortaya çıkaracaktır ve diğer durumlarda çok belirsizdir; "Benjamin Othello Ames" ve "Bank of America" ​​aynı adlara sahip olacaklar, ancak adları başka türlü değil. Yani istediğimiz şeylerden hiçbirini yapmıyor.

Yetkili olmayan bir alternatif, adın belirli niteliklerini izlemek için ek alanlar sunmaktır, örneğin:

+-----+----+-------------------+-----------+--------+
| 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    |
+-----+----+-------------------+-----------+--------+

Ben buna "inelegant" diyorum çünkü hangi özelliklerin ilginç olabileceğini tahmin etmeyi gerektiriyor ve nispeten kaba. İsimler kaldırılırsa, 2. ve 3. sıralar arasındaki maçın gücü veya 2. ve 4. sıralar arasındaki mesafenin (yani, eşleşmeye ne kadar yakın oldukları) makul bir şekilde sonuçlanamaz.

Sonuç

Amaç, dizeleri orijinal dizgiyi gizlerken mümkün olduğu kadar orijinal dizginin yararlı özelliklerinin korunacağı şekilde dönüştürmektir. Şifrenin çözülmesi imkansız olmalı veya veri kümesinin boyutu ne olursa olsun etkili bir şekilde imkansız olacak kadar pratik olmamalıdır. Özellikle, rastgele dizeler arasındaki düzenleme mesafesini koruyan bir yöntem çok yararlı olacaktır.

İlgili olabilecek birkaç kağıt buldum, ama biraz kafamın üstünde:

Yanıtlar:


19

OP'de bahsettiğim referanslardan biri, "Bloom filtrelerini kullanarak gizlilik koruma rekoru kırma " ( doi: 10.1186 / 1472-6947-9-41 ) bölümünde açıklanan, oldukça güçlü görünen potansiyel bir çözüme yol açtı.

Tanımlayıcılarda hatalara izin veren şifrelenmiş tanımlayıcılarla gizliliği korumak için yeni bir protokol geliştirilmiştir. Protokol, q-gram tanımlayıcılardaki Bloom filtrelerine dayanıyor.

Makale, burada elimden gelenin en iyisini yapacağım yöntemi özetleyeceğim.

Bir Bloom filtresi, her biri aynı girdi değerinde hesaplanan sabit bir bağımsız karma fonksiyonlar grubunun sonuçlarını depolayan sabit uzunlukta bir dizidir. Her karma işlevinin çıktısı, filtredeki olası dizinler arasından bir dizin değeri olmalıdır; yani, 0 indeksli bir 10 bit diziniz varsa, karma fonksiyonları 0 ila 9 arasındaki değerlere geri dönmelidir (veya haritalanmalı).

Filtre, her bitin 0 olarak ayarlanmasıyla başlar. Girdi değerini, karma işlevler kümesinden her işlevle birleştirdikten sonra, herhangi bir karma işlev tarafından döndürülen bir dizin değerine karşılık gelen her bit, 1 olarak ayarlanır. bir karma işlevinden daha fazla olduğunda, bu dizindeki bit yalnızca bir kez ayarlanır. Bloom filtresinin sabit kümeler üzerindeki karma kümesinin üst üste binmesi olduğunu düşünebilirsiniz.

Yukarıda bağlantılı makalede açıklanan protokol, dizeleri n-gram olarak ikiye böler ki bu durumda karakter kümeleri vardır. Örnek olarak, "hello"aşağıdaki 2 gramlık seti verebilir:

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

Ön ve arka kısımların boşluklarla doldurulması, n-gram yapılırken genellikle isteğe bağlı görünmektedir; Bu yöntemi öneren makalede verilen örnekler bu tür dolgu kullanır.

Her bir n-gram bir Bloom filtresi üretmek için ayrılabilir ve bu Bloom filtresi kümesi, dizeye yönelik Bloom filtresini üretmek için kendi üzerine bindirilebilir (bit yönünde VEYA çalıştırma).

Filtre, karma işlevlerinden veya n-gramdan çok daha fazla bit içeriyorsa, rastgele dizelerin tamamen aynı filtreyi üretmesi nispeten düşüktür. Bununla birlikte, n-gramın iki dizesi ortak olarak ne kadar çoksa, filtreleri o kadar fazla bitecektir. Daha sonra herhangi iki filtreyi A, BZar katsayıları ile karşılaştırabilirsiniz:

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

Burada h, her iki filtre 1'e ayarlanır bit sayısını, a1 olarak ayarlanmış bit sayısıdır sadece filtre A ve b1 olarak ayarlanmış bit sayısıdır sadece şeritleri aynı ise filtre B. Zar katsayısı 1 olacaktır; ne kadar farklılarsa, katsayı o kadar yakın olacaktır 0.

Karma işlevleri, az sayıda olası bit dizinine belirsiz sayıda benzersiz giriş eşlediğinden, farklı girdiler aynı filtreyi üretebilir; bu nedenle katsayı, yalnızca dizelerin aynı veya benzer olma olasılığını gösterir . Farklı karma fonksiyonların sayısı ve filtredeki bitlerin sayısı, yanlış pozitiflerin olasılığını belirlemek için önemli parametrelerdir - bu yöntem tarafından üretilen Zar katsayısına göre çok daha az olan girdi çiftleri.

Bloom filtresini anlamak için bu öğreticiyi çok faydalı buldum .

Bu yöntemin uygulanmasında bazı esneklikler var; Ayrıca diğer sorulara ve çeşitli parametrelere göre ne kadar performans gösterdiğine dair bazı göstergeler için bu 2010 makalesine (sorunun sonunda da bakınız) bakınız .


Bunu kabul edilen cevap olarak işaretledim, çünkü önerilen yaklaşımlardan, benim özel kullanım durumum için en umut verici olanı.
Hava

Tüm bu detay ve geçmiş için teşekkür ederim. Bu yaklaşımın herhangi bir uygulamasına (örneğin Python'da) rastladınız mı?
amball

@ amball Yapmadım.
Hava

8

Sorunuzu okuduğunuzda, Levenshtein Distance'ın probleminize güzel bir çözüm olabileceğini fark ettim. Konuyla ilgili bir makaleye bir bağlantınız olduğunu görmek güzel, bir Levenshtein çözümünün nasıl göründüğüne ışık tutabilir miyim bir bakayım.

Levenshtein mesafesi, birçok endüstride varlık çözünürlüğü için kullanılır, bunu faydalı kılan, iki dizi arasındaki farkın bir ölçüsü olmasıdır. String karşılaştırması durumunda sadece karakter dizileridir.

Bu, başka bir alanın metninin ne kadar benzer olduğunu ölçen bir rakam vermenize izin vererek probleminizi çözmenize yardımcı olabilir.

Verdiğiniz verilerle Levenshtein kullanmanın temel bir yoludur:

görüntü tanımını buraya girin

Bu iyi bir çözüm sunar, 8 arasındaki mesafe bir ilişkinin bir göstergesidir ve çok PII uyumludur. Ancak, yine de süper kullanışlı değil, bir adın sadece ilk adının ilk harfini almak için bir metin büyüsü yaparsak ve tam soyadı ortada bir şey bıraktığında ne olacağını görelim:

görüntü tanımını buraya girin

Görebileceğiniz gibi 0'ın Levenshtein mesafesi, bir ilişkinin oldukça göstergesidir. Yaygın olarak veri sağlayıcılar, ilk ve soyadı için bir sürü Levenshtein permutasyonunu 1, 2 veya bütün karakterlerle birleştirerek, verilerde anonimliği muhafaza ederken varlıkların nasıl ilişkili olduğuna dair bir boyutsallık kazandırır.


1
Bağlantılı olduğum makale beni ilgilendiren şey, bu tür bir hesaplamayı her iki giriş dizesi bilgisi olmadan yapmak için bir yöntem gösterdiğini iddia etmesidir . Makalede, her bir aktör amaçlarım için yararlı olmayan bir ip bilgisine sahiptir ; Hesaplamayı iki dize bilmeden yapabilmek için bir oyuncuya ihtiyacım olacak . Bunları önceden hesaplamak sadece çok küçük veri setleri veya çok sınırlı ürünler için mümkündür; Veri setimdeki tamsayı mesafelerinin tam çarpı çarpımı ~ 10 PB depolama alacaktır.
Air

Bu yüzden dizeler arasındaki mesafeyi koruduğu için ikame şifresi (ROT13) fikrini gündeme getirdim; ancak güvenli değildir ve düzenleme mesafesini korurken dizeleri güvenli bir şekilde şifrelemenin imkansız olabileceğinden şüpheleniyorum. (Hatalı olmak isterdim!)
Air

Doğru, sadece matriksi sadece belirli bir kesim altına Levenshteinleri içerecek şekilde filtreledim, bu yüzden sadece üst üste gelme ihtimalinin yüksek olduğu yerlerde dolduruyorsunuz. Ek olarak, PII'ye gelince, veri kümelerinizdeki farklı varlıklar arasındaki ilişkiyi belirlemek için yeterli bilgi eklerseniz, müşterilerin anonimliğini korumanız pek olası değildir. Verileri anonimleştirmenin amacı, bu satırdaki PII ile ilgili düzenleyici baş ağrılarından kaçınmaktır (standartlar her zaman sıkılaştırılabilir), bu yüzden şahsen riske girmezdim.
neone4373,

7

Mümkünse, ilgili kayıtları (örn. Dave, David, vb.) Bağlar ve bunları tüm sıradaki kayıtları temsil etmek için kullanılan dizinin sıra numarası (1,2,3 vb.) Veya tuzlu bir karmasıyla değiştiririm ( örneğin, Dave yerine David).

Üçüncü şahısların asıl adın ne olduğu hakkında hiçbir fikre sahip olmaları gerektiğini düşünmüyorum, aksi takdirde onlara verebilirsiniz.

düzenleme : Üçüncü tarafın yapması gereken işlemleri nasıl tanımlamanız ve gerekçelendirmeniz gerekir. Örneğin, Bank of America’yı Benjamin Othello Ames’ten çıkarmak için bir harfin (örneğin, BOA-1, BOA-2, vb.) Ardından gelen baş harfleri kullanmasının nesi yanlış? Bu çok açıksa, bazı harfleri veya adları silebilirsiniz; örneğin, [AE] -> 1, [FJ] -> 2, vb. Böylece BOA 1OA veya ["Bank", "Barry", "Bruce", vb.] -> 1 böylece Bank of America tekrar olur. 1OA.

Daha fazla bilgi için k-anonimlik bölümüne bakınız .


K-anonimlik referansını ve çöp kutusu önerisini takdir edin - bu bana düşünecek yeni şeyler verir.
Air

6

Bir seçenek (veri kümesi boyutunuza bağlı olarak) ek veri kümesi olarak yalnızca düzenleme mesafelerini (veya kullandığınız diğer benzerlik ölçütlerini) sağlamaktır.

Örneğin:

  1. Veri kümesinde bir dizi benzersiz ad oluşturun
  2. Her isim için, diğer bir isimle olan düzenleme mesafesini hesaplayın.
  3. Her isim için bir ID veya geri dönüşü olmayan bir karma oluşturun
  4. Orijinal veri kümesindeki adları bu kimlikle değiştir
  5. Yeni veri kümesi olarak kimlik numaraları arasındaki düzenleme mesafelerinin matrisini sağlayın

Yine de, bunlardan elde edilen verileri eşitlemek için yapılabilecek çok şey var.

Örneğin, "Tim" bir oğlan için en popüler isim olarak biliniyorsa, popülasyondaki Timlerin bilinen yüzdesine yakın olan ID'lerin sıklığı saymak bunu verebilir. Oradan, 1 düzenleme mesafesine sahip adları arayabilir ve bu kimliklerin "Tom" veya "Jim" anlamına gelebileceği sonucuna varabilirsiniz (diğer bilgilerle birleştirildiğinde).


5

Tam olarak emin değilim, ama bölgeye duyarlı karma belki de iyi bir çözümdür. Girdi verilerinin hashini yapar (sizin adınıza - isimler), böylece orijinal dizgiler korunur. Diğer taraftan, LSH'nin ana fikri, benzer ürünler için hash olasılığını en üst düzeye çıkarmaktır. Birçok farklı LSH uygulaması var. Tweet metinleri karşılaştırmak için Nilsimsa hash'ı denedim ve gayet iyi çalıştı. Ancak, kısa dizeler (isimler) durumunda ne kadar işe yarayacağından emin değilim - bu sorun test gerektiriyor. Örneklerinizi denedim ve işte sonuç: (isim A, isim B, "mesafe" - maksimum 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

Gördüğünüz gibi, CHRISTOPH BAUER ve CJ BAUER en yakın çift oldular. Ancak fark önemli değildir. Ve sadece örneğin - bu isimlerin karma gösterimi:

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

3

İşte bahsetmediğim bir yaklaşım: süreci iki adıma ayırın: ilk adımı kodlamaya odaklandı, böylece aynı adı taşıyan alternatif sürümler aynı (ya da neredeyse aynı) olarak kodlandı ve ikinci adımı yapmaya odaklandı onları anonim.

İlk adım için, ilk sıraya , soyadına ve ilk harflere uygulanan Fonetik Algoritmalardan birini (Soundex ve çeşitleri) kullanabilirsiniz. (Ayrıca bu makaleye bakınız ). Bu, yanlış pozitifleri yanlış negatiflerle dengelemek için benzerliklerle isimlerdeki farklılıkları çözdüğünüz adımdır.

İkinci adımda, bu yöntemin ad eşleştirmesini nasıl etkilediğine endişe etmeden istediğiniz herhangi bir karma veya kriptografik yöntemi seçebilirsiniz. Bu size hem performans, hem sağlamlık hem de anonimlik için en iyi özelliklere sahip bir yöntem kullanma özgürlüğü verir.


Bu önerinin soruna sunulduğu gibi sorunu ele aldığını sanmıyorum. Esneklik şifreleme sonrası nerede? Orijinal verilere erişmeden analizinizi nasıl daraltabilirim?
Air

@AirThomas Üzgünüm ama iki sorunuzu anlamıyorum. "Esneklik sonrası şifreleme" ile ne demek istiyorsunuz? Sorunuzda / tanımlamanızda böyle bir şey görmedim. Ne demek "analizinizi orijinal verilere erişmeden daraltın"? "Rafinaj" hakkında hiçbir şey görmedim.
MrMeritology,

1
Motivasyon bölümünün ikinci paragrafında sorunu tanımlamaya çalıştım . Örneğin, veri modelinizi, bazı modelleme yapmak isteyen çeşitli araştırmacılara yayınlamak istediğinizi düşünün. Uygulanabilecek çok sayıda zeki ve etkili yöntem vardır ve her araştırmacı biraz farklı şekilde çalışır. Veri setinizde özel şahısların adlarını ifşa edemezsiniz. Verileri yayınlamadan önce analizin bu bölümünü gerçekleştirirseniz, herkes için metodoloji seçiminizi zorlar.
Air

Ek olarak, isimlerin özetlerini verirseniz, bunun yararı, üçüncü tarafların kesin kimliği ayırt edebilmeleri, ancak daha fazlasını yapamamasıdır. Öyleyse asıl soru, yayınlayamadığınız veriler hakkında nasıl daha fazla bilgi sağlayabilirsiniz? Örneğin, karma / şifreleme çıktısında isteğe bağlı girdiler arasındaki düzenleme mesafesini koruyan bir yöntem var mı? Bu işlevselliğe en az yaklaşan en az bir yöntem buldum (daha fazla bilgi için kendi cevabımı görün). Umarım bu işleri daha açık hale getirir.
Air
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.