CoolFace
Modelpublic

saturday-labs/turkish-pii-guard-0.8b

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
1likes120downloads
Model Card

Turkish PII Guard 0.8B

Türkçe metindeki kişisel verileri tespit edip yerinde maskeleyen model. Girdiyi alır, talimatın kapsadığı kişisel veriyi köşeli parantezli etiketle değiştirir, metnin geri kalanına dokunmaz.

Bu repo kullanıma hazır tam modeldir — LoRA adaptörü taban modele merge edilmiştir, ayrıca taban model indirmeye gerek yoktur.

Talimat : Metindeki tüm kişisel ve hassas bilgileri uygun etiketlerle maskele.
Girdi   : Ahmet Yıldız 0542 321 45 67 numarasından aradı, ibanı TR12 0001 2000 0034 5678 9012 34
Çıktı   : [AD] [TEL] numarasından aradı, ibanı [IBAN]

Kullanım alanları: LLM'e veri göndermeden önceki maskeleme katmanı, log temizleme, KVKK/GDPR uyum hattı, veri paylaşımı öncesi anonimleştirme.


Sonuçlar

Eğitim verisinden bağımsız, elle kurulmuş benchmark üzerinde satır düzeyi tam eşleşme — çıktının beklenen metinle karakter karakter aynı olması; tek etiket hatası satırın tamamını yanlış sayar.

şema-nötr (903 satır)   0,922

Şema-nötr, [YAS] [CINSIYET] [UYRUK] maskelemesi gerektiren 97 satır hariç tutularak hesaplanır — o üç etiket bu şemada bulunmaz.

Benchmark halka açık ve yeniden üretilebilir:


Kullanım

Talimatı ve metni yazmanız yeterli. Modelin kendi sistem promptu chat template'e gömülü; sistem mesajı vermezseniz otomatik eklenir.

python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

MODEL = "melikegks/turkish-pii-guard-0.8b"
tok = AutoTokenizer.from_pretrained(MODEL)
tok = getattr(tok, "tokenizer", tok)
mdl = AutoModelForCausalLM.from_pretrained(
    MODEL, dtype=torch.bfloat16, device_map="auto").eval()

def maskele(talimat, metin, max_new=768):
    p = tok.apply_chat_template(
        [{"role": "user", "content": f"{talimat}\n\n{metin}"}],
        tokenize=False, add_generation_prompt=True, enable_thinking=False)
    enc = tok(p, return_tensors="pt", add_special_tokens=False).to(mdl.device)
    stop = [tok.eos_token_id, tok.convert_tokens_to_ids("<|im_end|>")]
    with torch.inference_mode():
        g = mdl.generate(**enc, max_new_tokens=max_new, do_sample=False,
                         eos_token_id=stop, pad_token_id=tok.pad_token_id)
    o = tok.decode(g[0, enc["input_ids"].shape[1]:], skip_special_tokens=True).strip()
    return o.split("</think>", 1)[-1].strip() if "</think>" in o else o


print(maskele("Metindeki tüm kişisel bilgileri maskele.",
              "müşteri Ayşe Yılmaz tc 12345678901 tel 0532 111 22 33"))
# → müşteri [AD] tc [TCKN] tel [TEL]

do_sample=False kullanın. Maskeleme belirlenimci bir görevdir.

Kendi sistem promptunuzu verirseniz gömülü olan yerine o kullanılır — ama model bu promptla eğitildi, değiştirmek kaliteyi düşürür.

Kapsam talimatları

Talimat çıktıyı doğrudan değiştirir — aynı metin farklı politikalarla farklı maskelenir:

python
metin = "Ali Kaya 0532 111 22 33 numarasından aradı, ibanı TR33 0006 1005 1978 6457 8413 26"

maskele("Metindeki tüm kişisel bilgileri maskele.", metin)
# → [AD] [TEL] numarasından aradı, ibanı [IBAN]

maskele("Yalnızca IBAN bilgisini maskele. Adı ve telefonu değiştirme.", metin)
# → Ali Kaya 0532 111 22 33 numarasından aradı, ibanı [IBAN]

maskele("IBAN'ı açık bırak. Diğer kişisel bilgileri maskele.", metin)
# → [AD] [TEL] numarasından aradı, ibanı TR33 0006 1005 1978 6457 8413 26

maskele("Bu metinde hiçbir şeyi maskeleme.", metin)
# → Ali Kaya 0532 111 22 33 numarasından aradı, ibanı TR33 0006 1005 1978 6457 8413 26

Desteklenen politika biçimleri:

PolitikaÖrnek talimat
Tam maskeleme"Metindeki tüm kişisel bilgileri maskele."
Beyaz liste"Yalnızca IBAN ve telefon numarasını maskele."
Kara liste"Ad soyad hariç her şeyi maskele."
Kategori"Sadece finansal bilgileri maskele."
Rol"Log temizleme hattında çalışıyorsun. Tüm PII'yi gizle."
Hibrit"Maaşı gizle, ad soyad ve telefona dokunma."
Kapsam dışı"Bu metinde hiçbir şeyi maskeleme."

Etiketler — 50

KategoriEtiketler
Kimlik[AD] [TCKN] [DOGUM_TARIHI] [DOGUM_YERI] [ANNE_ADI] [ANNE_KIZLIK] [BABA_ADI] [PASAPORT_NO] [EHLIYET_NO] [SGK_NO] [IMZA]
Finansal[IBAN] [HESAP_NO] [KART] [KART_SKT] [CVV] [MAAS] [VERGI_NO] [MUSTERI_NO] [KREDI_NOTU] [POLICE_NO] [SOZLESME_NO] [KRIPTO_CUZDAN]
İletişim[TEL] [EMAIL] [ADRES] [KONUM]
Özel nitelikli (KVKK md. 6)[SAGLIK] [DIN] [ETNIK_KOKEN] [SENDIKA] [BIYOMETRIK] [CEZA_KAYDI] [KAN_GRUBU] [ENGEL_DURUMU]
Kimlik doğrulama[SIFRE] [PIN] [KULLANICI_ADI]
Cihaz ve ağ[IP_ADRES] [MAC_ADRES] [IMEI] [CIHAZ_ID]
Araç[PLAKA] [SASI_NO] [MOTOR_NO] [RUHSAT_NO]
İstihdam ve diğer[SICIL_NO] [ISYERI] [AILE] [REFERANS]

Türkçeye özgü davranış

Tetikleyici kelime span'e girmez, ek span'in dışında kalır.

telefonum 0532 111 22 33 dır   →   telefonum [TEL] dır

Kesme işaretli ekler korunur. Ünlü uyumu, ünsüz sertleşmesi ve kaynaştırma harfi değerin son sesine göre uygulanır.

Ahmet'e · Ayşe'ye · Tunç'un · [TEL]'den · [AD]'ın

Sözle yazılmış değerler de maskelenir.

kart güvenlik kodum yedi sıfır bir   →   kart güvenlik kodum [CVV]

Biçime değil bağlama bakar. 16 haneli her sayı kart, 11 haneli her sayı TCKN değildir.

sipariş numarası 1234567890123456 kaydı   →   (değişmez)
işyeri kira bedeli 72.100,22 TL           →   (değişmez)

Eğitim

taban model      Qwen/Qwen3.5-0.8B
yöntem           LoRA r=32 α=64, bf16
eğitilebilir     21.645.312 parametre (%2,47)
veri             667.901 örnek, tamamen sentetik
adım             5.000 · efektif batch 64 · max_length 1024
LR               1e-4 cosine → 0
donanım          A100 80GB, ~4 saat

Veri 50 etiketli ve tamamen sentetiktir; gerçek kişilere ait kayıt içermez. Düz metin ve yapısal biçimler bir arada: paragraf, e-posta, dilekçe, transkript, SMS, mesajlaşma, CRM notu, form, sağlık kaydı, JSON, XML, YAML, CSV, log, OCR çıktısı.


Sınırlar

Sentetik veri. Eğitim ve değerlendirme verisi üretilmiştir; gerçek kişi verisi içermez. Gerçek kurumsal metindeki performans ölçülmemiştir. Kritik bir hatta almadan önce kendi verinizle örneklem alarak doğrulayın.

Şema dışı etiket üretebilir. Üretimde 50 etiketlik bir whitelist katmanı önerilir; şema dışı etiket içeren çıktı reddedilip insan incelemesine gönderilmelidir. Geçersiz etiketi metne geri çevirmeyin — maskelenmiş veriyi açığa çıkarır.

Prompt biçimi eğitimle aynı olmalıdır. Chat template'i kullanın; ham dize kurmayın.

Yalnızca Türkçe. Başka dillerde test edilmemiştir.

Karar destek aracı değildir. KVKK/GDPR sorumluluğu kullanandadır; kritik akışlarda insan denetimi gerekir.


Alıntı

bibtex
@misc{turkish-pii-guard-2026,
  title  = {Turkish PII Guard: Instruction-conditional PII masking for Turkish},
  author = {Melike Göksu Tanrıverdi},
  year   = {2026},
  url    = {https://huggingface.co/melikegks/turkish-pii-guard-0.8b}
}

Lisans

Apache 2.0. Taban model Qwen/Qwen3.5-0.8B kendi lisansına tabidir.