ArielJoe commited on
Commit
5b02fa7
Β·
1 Parent(s): b52c628

fix: improve detector accuracy based on QA findings

Browse files

- profanity: add leet substitutions 9β†’g and 8β†’b to catch newer evasion variants
- responsible: add 10 injection patterns for roleplay, hypothetical framing,
and indirect requests (both Indonesian and English)
- ner: exclude known idioms (Ibu Kota, Ibu Pertiwi, Bapak Bangsa) from
person entity rule via negative lookahead; fix PT/CV rule to only consume
capitalized words, preventing greedy match into surrounding sentence
- pii: tighten address pattern so Desa/Kelurahan/Kecamatan only trigger when
followed by additional address components (RT/RW/Kab/Kec), reducing
false positives in narrative text

src/ner/ner_model.py CHANGED
@@ -237,15 +237,18 @@ _RULES: list[tuple[re.Pattern[str], str, float]] = [
237
  ), "ORGANISASI", 0.94),
238
 
239
  # Badan usaha Indonesia (PT, CV, UD, Firma, Koperasi, dll.)
 
 
240
  (re.compile(
241
- r'\b(PT\.?\s+|CV\.?\s+|UD\.?\s+|Firma\s+|Koperasi\s+|Perum\s+|Persero\s+)'
242
- r'(?:[A-Z][A-Za-z0-9&.,\s-]{1,60})',
243
  re.UNICODE,
244
  ), "ORGANISASI", 0.92),
245
 
246
  # Perusahaan terbuka (Tbk/Persero/Perum sebagai suffix)
247
  (re.compile(
248
- r'\b[A-Z][A-Za-z0-9\s]{2,50}\s+(?:Tbk\.?|Persero|Perum)\b',
 
249
  re.UNICODE,
250
  ), "ORGANISASI", 0.88),
251
 
@@ -337,8 +340,10 @@ _RULES: list[tuple[re.Pattern[str], str, float]] = [
337
  ), "LOKASI", 0.90),
338
 
339
  # Gelar + nama orang: "Prof. Budi Raharjo", "Ibu Sari"
 
340
  (re.compile(
341
  r'\b(?:Bapak|Ibu|Pak|Bu|Dr\.?|Prof\.?|Professor|Mr\.?|Mrs\.?|Ms\.?|Miss|Ir\.?|Drs\.?|Hj\.?|H\.?)\s+'
 
342
  r'(?:[A-Z][a-z]+(?:\s+[A-Z][a-z]+){0,4})',
343
  re.UNICODE,
344
  ), "ORANG", 0.85),
 
237
  ), "ORGANISASI", 0.94),
238
 
239
  # Badan usaha Indonesia (PT, CV, UD, Firma, Koperasi, dll.)
240
+ # Setiap kata dalam nama perusahaan harus diawali huruf kapital agar tidak
241
+ # menyedot kata-kata biasa setelah nama perusahaan (mis. "adalah sebuah ...").
242
  (re.compile(
243
+ r'\b(?:PT\.?\s+|CV\.?\s+|UD\.?\s+|Firma\s+|Koperasi\s+|Perum\s+|Persero\s+)'
244
+ r'(?:[A-Z][A-Za-z0-9&.,\'-]*(?:\s+[A-Z][A-Za-z0-9&.,\'-]*){0,7})',
245
  re.UNICODE,
246
  ), "ORGANISASI", 0.92),
247
 
248
  # Perusahaan terbuka (Tbk/Persero/Perum sebagai suffix)
249
  (re.compile(
250
+ r'\b(?:[A-Z][A-Za-z0-9&.,\'-]*(?:\s+[A-Z][A-Za-z0-9&.,\'-]*){0,7})'
251
+ r'\s+(?:Tbk\.?|Persero|Perum)\b',
252
  re.UNICODE,
253
  ), "ORGANISASI", 0.88),
254
 
 
340
  ), "LOKASI", 0.90),
341
 
342
  # Gelar + nama orang: "Prof. Budi Raharjo", "Ibu Sari"
343
+ # Negative lookahead mencegah false positive pada idiom: "Ibu Kota", "Ibu Pertiwi", "Bapak Bangsa"
344
  (re.compile(
345
  r'\b(?:Bapak|Ibu|Pak|Bu|Dr\.?|Prof\.?|Professor|Mr\.?|Mrs\.?|Ms\.?|Miss|Ir\.?|Drs\.?|Hj\.?|H\.?)\s+'
346
+ r'(?!(?:Kota|Pertiwi|Bangsa|Pembangunan|Rumah|Susuan|Angkat|Tiri)\b)'
347
  r'(?:[A-Z][a-z]+(?:\s+[A-Z][a-z]+){0,4})',
348
  re.UNICODE,
349
  ), "ORANG", 0.85),
src/pii/pii_detector.py CHANGED
@@ -444,10 +444,21 @@ _RECOGNIZERS: list[_Recognizer] = [
444
  label="ALAMAT",
445
  pattern=re.compile(
446
  r'(?i)'
447
- r'(?:Jl\.?|Jalan|Gg\.?|Gang|Dusun|Desa|Kel\.?|Kelurahan|'
448
- r'Kec\.?|Kecamatan|RT|RW)\s+'
 
449
  r'[A-Za-z0-9.,/\s]{5,80}'
450
- r'(?:No\.?\s*\d+[A-Za-z]?)?',
 
 
 
 
 
 
 
 
 
 
451
  ),
452
  confidence=0.72,
453
  ),
 
444
  label="ALAMAT",
445
  pattern=re.compile(
446
  r'(?i)'
447
+ r'(?:'
448
+ # Prefiks jalan β€” sinyal kuat, cukup satu komponen
449
+ r'(?:Jl\.?|Jalan|Gg\.?|Gang|Dusun)\s+'
450
  r'[A-Za-z0-9.,/\s]{5,80}'
451
+ r'(?:No\.?\s*\d+[A-Za-z]?)?'
452
+ r'|'
453
+ # Satuan administratif β€” hanya flag jika diikuti komponen alamat lanjutan
454
+ r'(?:Desa|Kel\.?|Kelurahan|Kec\.?|Kecamatan)\s+'
455
+ r'[A-Za-z0-9\s]{2,30}'
456
+ r'(?:,\s*(?:Kec\.?|Kecamatan|Kab\.?|Kabupaten|Kota|RT|RW|No\.?)'
457
+ r'\s+[A-Za-z0-9\s]{1,30})+'
458
+ r'|'
459
+ # Notasi RT/RW dengan angka β€” sangat spesifik untuk alamat
460
+ r'RT\s+\d{1,3}(?:\s*/\s*RW\s+\d{1,3})?'
461
+ r')',
462
  ),
463
  confidence=0.72,
464
  ),
src/profanity/profanity_checker.py CHANGED
@@ -62,6 +62,7 @@ except ImportError:
62
  _LEET: dict[str, str] = {
63
  "4": "a", "3": "e", "1": "i", "0": "o",
64
  "@": "a", "$": "s", "5": "s", "7": "t",
 
65
  }
66
  _LEET_TABLE = str.maketrans(_LEET)
67
  _WORDFREQ_MIN = 1e-8
 
62
  _LEET: dict[str, str] = {
63
  "4": "a", "3": "e", "1": "i", "0": "o",
64
  "@": "a", "$": "s", "5": "s", "7": "t",
65
+ "9": "g", "8": "b",
66
  }
67
  _LEET_TABLE = str.maketrans(_LEET)
68
  _WORDFREQ_MIN = 1e-8
src/responsible/responsible_checker.py CHANGED
@@ -154,6 +154,19 @@ _add(r'without\s+any\s+(?:restriction|filter|ethical\s+constraint)', "INJECTI
154
  _add(r'(?:reveal|show|print|display)\s+(?:your\s+)?(?:system\s+prompt|hidden\s+instructions?|developer\s+message)', "INJECTION","HIGH",0.96,_INJ_MSG,_INJ_REC)
155
  _add(r'(?:what\s+are|tell\s+me)\s+(?:your\s+)?(?:system\s+instructions?|hidden\s+instructions?)', "INJECTION","MEDIUM",0.86,_INJ_MSG,_INJ_REC)
156
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
 
158
  # ── Pola ACADEMIC_DISHONESTY β€” kecurangan akademik ────────────────────────────
159
 
 
154
  _add(r'(?:reveal|show|print|display)\s+(?:your\s+)?(?:system\s+prompt|hidden\s+instructions?|developer\s+message)', "INJECTION","HIGH",0.96,_INJ_MSG,_INJ_REC)
155
  _add(r'(?:what\s+are|tell\s+me)\s+(?:your\s+)?(?:system\s+instructions?|hidden\s+instructions?)', "INJECTION","MEDIUM",0.86,_INJ_MSG,_INJ_REC)
156
 
157
+ # Framing roleplay/hipotetis Bahasa Indonesia
158
+ _add(r'(?:bayangkan|anggaplah?)\s+(?:kamu|anda|kau)\s+(?:adalah\s+)?(?:AI\s+(?:yang\s+)?(?:bebas|tanpa\s+(?:batasan|filter|etika|aturan))|(?:tidak\s+punya|bebas\s+dari)\s+(?:batasan|aturan|etika))', "INJECTION","HIGH",0.91,_INJ_MSG,_INJ_REC)
159
+ _add(r'(?:simulasik[ai]n|perankan|jadilah)\s+(?:kamu\s+)?(?:sebagai\s+)?AI\s+(?:yang\s+)?(?:bebas|tanpa\s+(?:batasan|filter|etika))', "INJECTION","HIGH",0.90,_INJ_MSG,_INJ_REC)
160
+ _add(r'dalam\s+(?:cerita|skenario|permainan\s+peran|roleplay)\s+ini.{0,40}(?:tidak\s+ada\s+(?:batasan|aturan|etika)|kamu\s+(?:bebas|boleh\s+segalanya))', "INJECTION","HIGH",0.89,_INJ_MSG,_INJ_REC)
161
+ _add(r'tulisk[ai]n\s+(?:langkah|cara|instruksi|petunjuk)\s+(?:yang\s+)?(?:biasanya?\s+)?(?:dilarang|tidak\s+boleh|terlarang|disensor)', "INJECTION","HIGH",0.88,_INJ_MSG,_INJ_REC)
162
+ _add(r'informasi\s+yang\s+(?:biasanya?\s+)?tidak\s+(?:bisa|boleh|mau)\s+(?:kamu|anda|AI)\s+(?:berikan|bagikan|jelaskan|sampaikan)', "INJECTION","MEDIUM",0.83,_INJ_MSG,_INJ_REC)
163
+
164
+ # Framing roleplay/hypothetical English
165
+ _add(r'imagine\s+you\s+(?:are|were|have\s+no)\s+(?:restrictions?|filters?|ethical\s+constraints?|rules?|limitations?)', "INJECTION","HIGH",0.92,_INJ_MSG,_INJ_REC)
166
+ _add(r'roleplay\s+(?:as|like)\s+an?\s+(?:AI|assistant)\s+(?:without|with\s+no)\s+(?:restriction|filter|rule|ethic|limit)', "INJECTION","HIGH",0.93,_INJ_MSG,_INJ_REC)
167
+ _add(r'in\s+this\s+(?:story|scenario|roleplay|simulation|hypothetical|game).{0,60}(?:you\s+(?:are|have)\s+no\s+(?:restriction|filter|rule|limit)|there\s+are\s+no\s+(?:rule|restriction|filter|limit))', "INJECTION","HIGH",0.89,_INJ_MSG,_INJ_REC)
168
+ _add(r'(?:give|write|provide|list)\s+(?:me\s+)?(?:the\s+)?(?:steps?|instructions?|guide|way)s?\s+(?:that\s+(?:are\s+)?)?(?:usually|normally|typically)\s+(?:forbidden|prohibited|restricted|banned|not\s+allowed)', "INJECTION","HIGH",0.88,_INJ_MSG,_INJ_REC)
169
+
170
 
171
  # ── Pola ACADEMIC_DISHONESTY β€” kecurangan akademik ────────────────────────────
172