Türkçe kişisel veri tespiti ve maskeleme

turkish-pii-detection, Türkçe metinde kişisel verileri (PII) bulup etiketlerle değiştiren, 270M parametreli açık bir model. Ona metni ve neyin maskeleneceğini söyleyen kısa bir Türkçe talimatı veriyorsunuz, o da metni yeniden yazıp döndürüyor. CPU'da çalışacak kadar küçük, bu yüzden metnin makinenizden çıkması gerekmiyor.

Boyut
270M parametre
Temel model
cagrigungor/pii-guard-turkish-270m, Gemma 3 270M üzerine ince ayar
Etiket şeması
53 etiket
Benchmark
1.000 satırda 0.944 tam eşleşme
CPU hızı
kısa bir cümle için yaklaşık 600 ms
Sürüm
v02, tarihinde yayımlandı
Lisans
Gemma Terms of Use

Türkçe kişisel veri maskeleme nasıl çalışır

Model bir talimat ve bir metin okur, metni istenen alanlar etiketlerle değiştirilmiş olarak geri yazar: ad için [AD], T.C. kimlik numarası için [TCKN], telefon numarası için [TEL], e-posta için [EMAIL] gibi. Aynı ağırlıklar üç tür politikayı da karşılar.

Girdi
müşteri Ayşe Yılmaz tc 12345678901 tel 0532 111 22 33 e-posta demo@example.com.
Çıktılar tarihinde v02 ağırlıklarıyla CPU'da kaydedildi (PyTorch 2.8.0, Transformers 4.56.1). Kişi ve numaralar uydurmadır.
Politika Talimat Çıktı
Her şeyi maskele Metindeki tüm kişisel verileri uygun etiketlerle maskele. müşteri [AD] tc [TCKN] tel [TEL] e-posta [EMAIL].
Yalnızca telefon numaraları Metindeki yalnızca telefon numaralarını maskele; diğer tüm bilgileri olduğu gibi koru. müşteri Ayşe Yılmaz tc 12345678901 tel [TEL] e-posta demo@example.com.
İsimler dışında her şey Metindeki kişi isimleri hariç tüm kişisel verileri uygun etiketlerle maskele. Kişi isimlerini olduğu gibi koru. müşteri Ayşe Yılmaz tc [TCKN] tel [TEL] e-posta [EMAIL].

Tipik kullanım, destek mesajlarını, uygulama loglarını ya da belge parçalarını bir LLM'e, bir log deposuna ya da bir tedarikçiye gitmeden önce temizlemektir. Model yalnızca metin döndürür. Karakter konumuna ya da token etiketine ihtiyacınız varsa span tabanlı bir varlık ismi tanıma (NER) modeli kullanın.

Python ile hızlı başlangıç

PyTorch ve Transformers'ı kurun, ardından şunu CPU'da çalıştırın.

python -m pip install torch==2.8.0 transformers==4.56.1
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

MODEL_ID = "halilneed/turkish-pii-detection"
REVISION = "28644718923ae38b0105c9f3d2be57312ad0ced3"  # v02

tokenizer = AutoTokenizer.from_pretrained(MODEL_ID, revision=REVISION)
model = AutoModelForCausalLM.from_pretrained(
    MODEL_ID, revision=REVISION, torch_dtype=torch.float32
).to("cpu").eval()
end_turn = tokenizer.convert_tokens_to_ids("<end_of_turn>")

def mask_turkish_pii(text, instruction):
    prompt = (
        f"{tokenizer.bos_token}<start_of_turn>user\n{instruction}\n\n"
        f"Metin: {text}<end_of_turn>\n<start_of_turn>model\n"
    )
    inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False)
    with torch.inference_mode():
        sequence = model.generate(
            **inputs, max_new_tokens=512, do_sample=False,
            eos_token_id=end_turn, pad_token_id=tokenizer.eos_token_id,
        )
    generated = sequence[0, inputs["input_ids"].shape[1]:]
    return tokenizer.decode(generated, skip_special_tokens=True).strip()

text = "müşteri Ayşe Yılmaz tc 12345678901 tel 0532 111 22 33 e-posta demo@example.com."
print(mask_turkish_pii(text, "Metindeki tüm kişisel verileri uygun etiketlerle maskele."))
# müşteri [AD] tc [TCKN] tel [TEL] e-posta [EMAIL].

Prompt biçimini gösterildiği gibi koruyun. BOS token'ıyla başlar ve Gemma'nın tur işaretlerini kullanır; tokenizer çağrısında add_special_tokens=False verilir ki BOS iki kez eklenmesin. Talimat da metin de Türkçedir.

REVISION, v02 ağırlıklarına sabitler. main dalını izlemek için bu satırı çıkarın; ilk sürüm için revision="v01" verin. GPU'da .to("cpu") yerine torch.bfloat16 ve device_map="auto" ile yükleyin, girdileri de .to(model.device) ile modelin cihazına taşıyın.

GitHub deposunda adım adım bir eğitim ve yerel bir demo var. Tarayıcı demosu, kuantize edilmiş bir ONNX sürümünü sizin cihazınızda çalıştırır. İlk açılışta yaklaşık 472 MB indirir ve çıktısı Python modelinden farklı olabilir. Benchmark skorları bu sürüm için yeniden ölçülmedi.

Benchmark sonuçları

Değerlendirmeyi cagrigungor/turkish-pii-masking-benchmark üzerinde yapıyorum: 1.000 sentetik Türkçe örnekten oluşan, herkese açık bir değerlendirme seti. Metrik, satır bazında tam eşleşme: çıktının tamamı beklenen metne birebir eşit olmalı, yani tek bir yanlış etiket satırı düşürür. Bu sette turkish-pii-detection v02, 1.000 satırın tamamında 0.944, model seçiminde kullanılmayan 531 satırda 0.945 tam eşleşme alıyor.

Turkish PII Masking Benchmark üzerinde tam eşleşme
Dilimv01v02
1.000 satırın tamamı0.8800.944
Şemadan bağımsız satırlar (903)0.9000.951
Seçimde kullanılmayan satırlar (531)0.8850.945
Her şeyi maskele0.8510.917
Yalnızca belirtilen alanları maskele0.8950.940
Belirtilen alanlar dışında her şeyi maskele0.8930.967
İstenen alan metinde yok0.9601.000
Kişisel veri içermeyen tuzak metinler0.8650.950
Uzun metin0.6560.844
Büyük harfli metin0.7750.838
Türkçe ek almış kişisel veri0.7580.803
Aynı metinde birden çok kişi0.6000.750
Yazıyla yazılmış sayılar0.9461.000
Çok alanlı kayıtlar0.9680.980

Benchmark eğitim verisi olarak kullanılmadı; üretilen satırlardan benchmark ile çakışanlar ayıklandı. v02'yi geliştirirken benchmark'tan gelen toplu geri bildirime baktım (dilim bazında skorlar ve bir kez de etiket grubu bazında doğruluk). Bu yüzden benchmark'ı id'ye göre ikiye böldüm. Son ağırlıkların karışım oranı bir yarıda (469 satır) seçildi, diğer yarı (531 satır) bu seçimde kullanılmadı. O yarıda skor 0.885'ten 0.945'e çıktı.

v01 sütunu aynı betikle yeniden ölçüldü. v01'in model kartı tüm satırlarda 0.882, şemadan bağımsız satırlarda 0.902 bildirmişti. İkisi de iki satır daha yüksek; fark, toplu (batched) bfloat16 çıkarımdan kaynaklanıyor.

Karşılaştırma için, iki büyük model aynı benchmark'ta kendi kartlarında skor bildiriyor: cagrigungor/pii-guard-turkish-0.8b tüm satırlarda 0.876, saturday-labs/turkish-pii-guard-0.8b (eski adıyla melikegks/turkish-pii-guard-0.8b) şemadan bağımsız satırlarda 0.922. Bunları kendim yeniden çalıştırmadım.

Tam eşleşme, modelleri karşılaştırmak için katı bir skordur. Varlık bazında duyarlılık (recall) değildir ve gerçek belgelerin %94'ünün paylaşılmaya hazır olduğu anlamına gelmez.

Nasıl eğitildi

v01 (), Gemma 3 270M tabanlı cagrigungor/pii-guard-turkish-270m üzerinde sürdürülen bir ince ayardır. Başlangıç modelinin zayıf olduğu dilimlere ağırlık veren (büyük harfli metin, uzun kayıtlar, yazıyla yazılmış sayılar, aynı metinde birden çok kişi) 24.000 sentetik bankacılık ve ERP tarzı mesaj ürettim ve bir epoch eğittim. Benchmark skoru 0.740'tan 0.882'ye çıktı, ama iki dilim kötüleşti: ek almış kişisel veriler ve hiç kişisel veri içermeyen tuzak metinler.

v02 () bu ikisine odaklandı.

  1. Yeni bir sentetik veri üreteci. 53 etiket; elle yazılmış yaklaşık 1.500 şablon (bankacılık, insan kaynakları, sağlık, telekom, e-ticaret, araçlar, BT logları, uzun e-postalar ve çağrı dökümleri); Türkçe ünlü uyumuna uyan bir ek motoru; büyük harf ve ASCII varyantları; yazıyla yazılmış sayılar ve yaklaşık 600 farklı talimat. Toplam 40.000 örnek.
  2. Öğretmen hizalaması. v01 aynı etiket kümesiyle geçerli bir maskeleme ürettiği her yerde etiket sınırları v01'inkilerle hizalandı. Sağlık, aile ve biyometri gibi anlamsal etiketlerde v01 ile çelişen 7.136 örnek çıkarıldı, geriye 32.864 örnek kaldı.
  3. v01'den sürdürülen tam ince ayar. Bir epoch, öğrenme oranı 2e-5, etkin batch boyutu 32, kayıp yalnızca çıktı token'larında.
  4. Ağırlık enterpolasyonu. İnce ayarlı model tek başına benchmark'ta 0.844'e düştü, çünkü üretecin dağılımına kaymıştı. Ağırlıklarını v01 ile 50/50 ortalamak (WiSE-FT olarak bilinen yöntem) 0.944 verdi: hem v01'den (0.880) hem de ince ayarlı modelin tek başına skorundan yüksek.

v01'in hikâyesini Medium'da Türkçe yazdım: Daha büyük model eğitmedim, zayıf dilimleri eğittim.

Sınırlar

  • Değerlendirmenin tamamı sentetik veri üzerinde. Modele güvenmeden önce kendi metinlerinizde ölçün.
  • En zayıf dilimler: birden çok kişi içeren metinler (0.750), “Cem Aslan’ın” örneğindeki gibi Türkçe ek almış kişisel veriler (0.803) ve büyük harfli metinler (0.838).
  • Bağlamı olmayan kısa parçalar maskelenmeden kalabilir. Tek başına “vergi numarası 4810271935” geçip gidebilir. Aynı numara bir müşteriden söz eden bir cümlenin içinde maskelenir.
  • Kişisel veriyi kaçırabilir, dokunmaması gereken metni değiştirebilir ya da şema dışında bir etiket üretebilir. Çıktıyı kontrol edin; boş ya da yarıda kesilmiş çıktıyı hata sayın.
  • Maskeleme anonimleştirme ile aynı şey değildir. Modeli kullanmak bir süreci KVKK'ya (6698 sayılı Kişisel Verilerin Korunması Kanunu) ya da GDPR'a uygun hale getirmez.
  • Ağırlıklar Gemma Terms of Use kapsamındadır. GitHub deposundaki kod MIT lisanslıdır.

Ölçülen hız: Intel i5-12400F üzerinde fp32, sekiz thread ve batch boyutu bir ile cümle başına (ortalama 50 karakter) yaklaşık 600 ms ve 1.6 GB RAM.

Bu modelle Türkçe kişisel veri tespiti üzerine sorular

Bu bir Türkçe NER modeli mi?

Hayır. Maskelenmiş metin üretir; token etiketi ya da karakter konumu döndürmez. Konum bilgisine ihtiyacınız varsa token sınıflandırma (token classification) modeli kullanın.

Metni bir API'ye göndermeden çalıştırabilir miyim?

Evet. Ağırlıkları bir kez indirip modeli Transformers ile yerelde, CPU'da ya da GPU'da çalıştırabilirsiniz. Tarayıcı demosu da sizin cihazınızda çalışır.

Hangi kişisel verileri kapsıyor?

Şemada 53 etiket var. Ad soyad, T.C. kimlik numarası (TCKN), telefon numarası, e-posta adresi, IBAN ve işyeri gibi verilerin yanında sağlık ve biyometrik veri gibi özel nitelikli kişisel verileri de kapsar.

KVKK sınıflandırıcısından farkı ne?

Bu model metni yeniden yazar. Türkçe KVKK sınıflandırıcısı ise yalnızca metinde hangi kişisel veri kategorilerinin bulunduğunu söyler; bu da maskeleme politikasını seçerken işe yarar.

Hangi sürümü indireceğim?

main dalı v02'yi verir. İlk sürüm için revision="v01" verin; tekrarlanabilir sonuç istiyorsanız bir commit hash'ine sabitleyin.

Maskeleme verilerimi KVKK'ya uygun hale getirir mi?

Hayır. Maskelenmiş çıktı kendiliğinden anonim olmaz. Uyum, modele değil verinin nasıl işlendiğine bağlıdır. Neyin maskelenip neyin içeride tutulacağına nasıl karar verileceğini Kişisel veri ve yapay zekâ rehberi anlatıyor.

Türkçe kişisel veri maskeleme modeli

turkish-pii-detection, Türkçe metindeki kişisel verileri verilen talimata göre etiketlerle değiştiren, 270M parametreli açık bir modeldir. Tüm kişisel verileri, yalnızca seçtiğiniz alanları ya da belirttiğiniz alanlar dışındaki her şeyi maskeleyebilir. GPU gerektirmeyecek kadar küçüktür: işlemcide (CPU) çalışır ve metin makinenizden çıkmaz.

Çıktı olarak yalnızca maskelenmiş metni verir; karakter konumu, token etiketi ya da KVKK kategorisi döndürmez. v02, 1.000 sentetik örnekten oluşan herkese açık benchmark’ta 0.944 tam eşleşme skoruna ulaştı (v01: 0.880). Model seçiminde kullanılmayan 531 örnekte skor 0.945’tir. En zayıf olduğu dilim çok kişili metinlerdir (0.750).

Ağırlıklar ve model kartı Hugging Face’te, Python kullanım örnekleri GitHub’dadır. Tarayıcı demosunda kendi metninizi deneyebilirsiniz; model cihazınızda çalışır. Üretime almadan önce modelin başarımını kendi verinizde ölçün ve çıktıyı doğrulayın.