This commit is contained in:
livindra 2026-06-15 05:14:13 +07:00
parent a642eef7c4
commit 8d00213055
4 changed files with 27 additions and 39 deletions

View File

@ -202,9 +202,9 @@ class ForwardChaining:
'message': 'Gejala yang dipilih masih belum cukup untuk menentukan PMK.' 'message': 'Gejala yang dipilih masih belum cukup untuk menentukan PMK.'
} }
# Urutkan hasil dari yang paling cocok # Urutkan hasil dari yang paling cocok dan ambil yang teratas saja
hasil_urut = sorted(hasil_inferensi.items(), key=lambda x: (x[1][0], x[1][1]), reverse=True) hasil_urut = sorted(hasil_inferensi.items(), key=lambda x: (x[1][0], x[1][1]), reverse=True)
# Pemetaan tingkat keparahan # Pemetaan tingkat keparahan
severity_map = { severity_map = {
'P01': 'oral', 'P01': 'oral',
@ -212,48 +212,36 @@ class ForwardChaining:
'P03': 'laktasi', 'P03': 'laktasi',
'P04': 'akut umum' 'P04': 'akut umum'
} }
diagnosis = []
for kode_penyakit, (score, _matched_count) in hasil_urut:
penyakit = self.kb.penyakit[kode_penyakit]
relevant_aliases = DISEASE_ALIAS_MAP.get(kode_penyakit, {kode_penyakit})
evidence_rules = [rule for rule in self.matched_rules if rule['hasil'] in relevant_aliases]
if not evidence_rules: # Ambil hanya diagnosis teratas (top-1)
all_evidence = list(self.disease_evidence.get(kode_penyakit, [])) top_kode = hasil_urut[0][0]
all_evidence.sort(key=lambda r: (r.get('coverage', 0.0), r.get('matched_count', 0)), reverse=True) top_score = hasil_urut[0][1][0]
evidence_rules = all_evidence[:3]
diagnosis.append({ penyakit = self.kb.penyakit[top_kode]
'kode': kode_penyakit, relevant_aliases = DISEASE_ALIAS_MAP.get(top_kode, {top_kode})
'severity': severity_map.get(kode_penyakit, 'unknown'), evidence_rules = [rule for rule in self.matched_rules if rule['hasil'] in relevant_aliases]
'nama': penyakit['nama'],
'deskripsi': penyakit['deskripsi'], if not evidence_rules:
'solusi': penyakit['solusi'], all_evidence = list(self.disease_evidence.get(top_kode, []))
'score': score, all_evidence.sort(key=lambda r: (r.get('coverage', 0.0), r.get('matched_count', 0)), reverse=True)
'gejala_teramati': [g for g in self.fakta if g in self.kb.gejala], evidence_rules = all_evidence[:3]
'bukti_aturan': evidence_rules,
'jumlah_bukti': len(evidence_rules), diag = {
'semua_diagnosis': diagnosis # Will be populated after all diagnosis generated 'kode': top_kode,
}) 'severity': severity_map.get(top_kode, 'unknown'),
'nama': penyakit.get('nama', ''),
filtered_diagnosis = diagnosis[:5] 'deskripsi': penyakit.get('deskripsi', ''),
'solusi': penyakit.get('solusi', []),
'score': top_score,
'persentase': round(float(top_score) * 100.0, 2),
'gejala_teramati': [g for g in self.fakta if g in self.kb.gejala],
'bukti_aturan': evidence_rules,
'jumlah_bukti': len(evidence_rules)
}
# Isi daftar hasil untuk ditampilkan ke pengguna
for diag in filtered_diagnosis:
diag['persentase'] = round(float(diag['score']) * 100.0, 2)
diag['semua_diagnosis'] = [
{
'nama': d['nama'],
'severity': d['severity'],
'score': d['score']
}
for d in diagnosis
]
return { return {
'status': 'terdiagnosis', 'status': 'terdiagnosis',
'diagnosis': filtered_diagnosis, 'diagnosis': [diag],
'gejala_teramati': [self.kb.gejala.get(g, g) for g in sorted(self.fakta)] 'gejala_teramati': [self.kb.gejala.get(g, g) for g in sorted(self.fakta)]
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.