1import torch, json, re
2from transformers import AutoTokenizer, AutoModelForSequenceClassification
3
4MODEL_ID = "gnafhan/indobert-ai4pep-gabungan-v2"
5tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
6model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID)
7model.eval()
8
9with open("label_map.json") as f:
10 label_map = json.load(f)
11
12BULAN_ID = {1:"Januari",2:"Februari",3:"Maret",4:"April",5:"Mei",6:"Juni",
13 7:"Juli",8:"Agustus",9:"September",10:"Oktober",11:"November",12:"Desember"}
14
15def extract_symptom_flags(text):
16 t = text.lower()
17 flags = []
18 d = []
19 if any(k in t for k in ['nyeri belakang mata','nyeri retro','retroorbital']): d.append('nyeri retro-orbital')
20 if any(k in t for k in ['petechiae','petekie','bintik merah','tourniquet']): d.append('petechiae/perdarahan kulit')
21 if any(k in t for k in ['trombosit','platelet','at:','at =']): d.append('pemeriksaan trombosit')
22 if any(k in t for k in ['mimisan','gusi berdarah','epistaksis']): d.append('perdarahan mukosa')
23 if any(k in t for k in ['nyeri sendi','nyeri otot','myalgia','pegal-pegal']): d.append('nyeri sendi/otot')
24 if d: flags.append(f'Sinyal dengue: {", ".join(d)}.')
25 c = []
26 if any(k in t for k in ['ruam','rash','bercak merah','makulopapul','eksantem']): c.append('ruam makulopapular')
27 if any(k in t for k in ['koplik','bercak putih mulut']): c.append('koplik spots')
28 if any(k in t for k in ['konjungtivitis','mata merah','conjunctivitis']): c.append('konjungtivitis')
29 if any(k in t for k in ['belum imunisasi','tidak imunisasi','belum vaksin']): c.append('riwayat imunisasi tidak lengkap')
30 if c: flags.append(f'Sinyal campak: {", ".join(c)}.')
31 cv = []
32 if any(k in t for k in ['anosmia','tidak bisa mencium','hilang penciuman','ageusia']): cv.append('anosmia/ageusia')
33 if any(k in t for k in ['kontak covid','riwayat kontak','pcr positif','antigen positif','swab positif']): cv.append('kontak/konfirmasi covid')
34 if any(k in t for k in ['saturasi','spo2','sesak nafas','sesak napas']): cv.append('gejala respirasi/saturasi')
35 if cv: flags.append(f'Sinyal covid: {", ".join(cv)}.')
36 return ' '.join(flags)
37
38def prediksi(anamnesa, usia, jenis_kelamin, bulan, top_k=3):
39 bulan_nama = BULAN_ID.get(bulan, str(bulan))
40 flags = extract_symptom_flags(anamnesa)
41 if flags:
42 teks = f"{flags} Usia: {usia} tahun. Jenis kelamin: {jenis_kelamin}. Bulan kunjungan: {bulan_nama}. Anamnesa: {anamnesa}"
43 else:
44 teks = f"Usia: {usia} tahun. Jenis kelamin: {jenis_kelamin}. Bulan kunjungan: {bulan_nama}. Anamnesa: {anamnesa}"
45
46 enc = tokenizer(teks, return_tensors="pt", max_length=192, truncation=True, padding="max_length")
47 with torch.no_grad():
48 probs = torch.softmax(model(**enc).logits, dim=-1)[0]
49
50 top = torch.topk(probs, top_k)
51 for idx, prob in zip(top.indices, top.values):
52 print(f" {label_map[str(idx.item())]}: {prob.item()*100:.1f}%")
53
54prediksi("Demam 3 hari, nyeri kepala, nyeri belakang mata, mual", 25, "Laki-laki", 2)