File size: 3,080 Bytes
af55aed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
"""
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()