""" compare_results.py – So sánh kết quả PhoBERT vs GPT OSS 20B -------------------------------------------------------------- Dùng: python scripts/compare_results.py \ --phobert_dir outputs/phobert \ --gpt_dir outputs/gpt20b """ import argparse import json import os def load_results(directory: str) -> dict: path = os.path.join(directory, "test_results.json") if not os.path.exists(path): return {} with open(path, "r", encoding="utf-8") as f: return json.load(f) def fmt(val, pct=True): if isinstance(val, float): return f"{val*100:.2f}%" if pct else f"{val:.4f}" return str(val) def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--phobert_dir", default="outputs/phobert") parser.add_argument("--gpt_dir", default="outputs/gpt20b") args = parser.parse_args() pb = load_results(args.phobert_dir) gpt = load_results(args.gpt_dir) if not pb and not gpt: print("Chưa có kết quả nào. Hãy chạy train trước.") return metrics = ["accuracy", "f1_binary", "f1_macro", "precision", "recall"] labels = ["Accuracy", "F1 Binary", "F1 Macro", "Precision", "Recall"] col_w = 16 header = f"{'Metric':<16} {'PhoBERT':>{col_w}} {'GPT-OSS-20B':>{col_w}} {'Δ (GPT - PB)':>{col_w}}" print("\n" + "=" * len(header)) print(" SO SÁNH KẾT QUẢ: PhoBERT vs GPT OSS 20B") print("=" * len(header)) print(header) print("-" * len(header)) for m, lbl in zip(metrics, labels): pb_val = pb.get(m) gpt_val = gpt.get(m) if pb_val is None and gpt_val is None: continue pb_str = fmt(pb_val) if pb_val is not None else "—" gpt_str = fmt(gpt_val) if gpt_val is not None else "—" if pb_val is not None and gpt_val is not None: delta = gpt_val - pb_val sign = "+" if delta >= 0 else "" d_str = f"{sign}{delta*100:.2f}%" else: d_str = "—" print(f"{lbl:<16} {pb_str:>{col_w}} {gpt_str:>{col_w}} {d_str:>{col_w}}") print("=" * len(header)) # Model info print(f"\nPhoBERT model : {pb.get('model', '—')}") print(f"GPT OSS model : {gpt.get('model', '—')}") # Split sizes split = pb.get("split_sizes") or gpt.get("split_sizes") or {} if split: total = sum(split.values()) print(f"\nDataset splits: train={split.get('train')} " f"val={split.get('val')} test={split.get('test')} " f"(total={total})") # Classification reports if pb.get("classification_report"): print("\n── PhoBERT Classification Report ────────────────────────") print(pb["classification_report"]) if gpt.get("classification_report"): print("── GPT OSS 20B Classification Report ────────────────────") print(gpt["classification_report"]) if __name__ == "__main__": main()