File size: 2,590 Bytes
6eed659
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env python3
"""Chiffre EXACTEMENT ce que coûte l'absence de virgules (et d'apostrophes) dans nos sorties.
Méthode : comparer nos hypothèses aux références TELLES QUELLES, puis aux références PRIVÉES
de virgules. L'écart = le coût réel du déficit de ponctuation. Décide si ça vaut un effort.
Aucun GPU, aucune soumission.
"""
import json, os, re
import jiwer

AUD = "/root/devhard_audio"


def comb(refs, hyps):
    pr = [(r, h) for r, h in zip(refs, hyps) if r.strip()]
    a = [x for x, _ in pr]; b = [y for _, y in pr]
    w = jiwer.wer(a, b); c = jiwer.cer(a, b)
    return w, c, 0.5 * w + 0.5 * c


def main():
    # hypothèses = notre meilleur décodage devhard-lin, rejouées depuis le cache d'analyse
    hyp_file = "/root/devhard_allhyps.json"
    if not os.path.exists(hyp_file):
        print("pas de cache d'hypotheses"); return
    D = json.load(open(hyp_file, encoding="utf-8"))
    rows = [json.loads(l) for l in open("/root/devhard/devhard_linsna.jsonl", encoding="utf-8")]

    # trouver une clef d'hypothèses exploitable
    if isinstance(D, dict):
        keys = list(D.keys())
        print("cles disponibles dans devhard_allhyps.json :", keys[:8])
    for lg in ("lin", "sna"):
        sub = [r for r in rows if r["lang"] == lg]
        refs = [r["text"] for r in sub]
        ids = [r["id"] for r in sub]
        # récupérer les hypothèses correspondantes
        hyps = None
        if isinstance(D, dict):
            for k in D:
                v = D[k]
                if isinstance(v, dict) and all(i in v for i in ids[:5]):
                    hyps = [v.get(i, "") for i in ids]; print("  -> hypotheses via '%s'" % k); break
                if isinstance(v, list) and len(v) == len(rows):
                    pass
        if hyps is None:
            print("[%s] pas d'hypotheses appariables -> on mesure seulement les REFS" % lg)
            nc = sum(t.count(",") for t in refs)
            na = sum(t.count("'") for t in refs)
            print("    refs : %d virgules, %d apostrophes sur %d phrases" % (nc, na, len(refs)))
            continue
        base = comb(refs, hyps)
        nocom = comb([t.replace(",", "") for t in refs], [h.replace(",", "") for h in hyps])
        print("\n[%s] %d clips" % (lg, len(refs)))
        print("  tel quel                : WER %.4f CER %.4f combine %.4f" % base)
        print("  refs+hyps SANS virgules : WER %.4f CER %.4f combine %.4f" % nocom)
        print("  => COUT du deficit de virgules = %+.4f sur le combine %s" % (base[2] - nocom[2], lg))


if __name__ == "__main__":
    main()