Spaces:
Running
Running
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 +8 -3
- src/pii/pii_detector.py +14 -3
- src/profanity/profanity_checker.py +1 -0
- src/responsible/responsible_checker.py +13 -0
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-]{
|
| 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
|
|
|
|
| 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'(?:
|
| 448 |
-
|
|
|
|
| 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 |
|