File size: 2,669 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
62
63
64
#!/usr/bin/env python3
"""Compare tous les candidats CSV (depuis la découverte multilingue) au meilleur confirmé.
Sortie : stats par fichier, matrice de similarité (lignes identiques), distance au best 0.6739,
drapeaux d'hallucination, détection de quasi-doublons. Aide à choisir quoi soumettre."""
import csv, os, glob, statistics
from collections import Counter
from difflib import SequenceMatcher

REF = "/root/sub_autodetect_beam.csv"   # meilleur confirmé = 0.6739
LABEL = {
    "sub_s51_autodetect.csv": "51 autodetect greedy (0.6691 connu)",
    "sub_autodetect_beam.csv": "51 autodetect beam5 (0.6739 CONFIRME=REF)",
    "sub_autodetect_beam_whole.csv": "51 autodetect beam5 + WHOLE-CLIP (nouveau)",
    "sub_v3nyn_beam.csv": "51 + Runyankole->v3 beam5",
    "sub_v3nyn_beam_norm.csv": "v3nyn + normalisation NFC",
    "sub_mmslid.csv": "LID mms-lid-4017 + 51",
    "sub_v3salt_beam.csv": "v3-salt SPECIALISTE beam5",
    "sub_v3salt_beam_whole.csv": "v3-salt SPECIALISTE + WHOLE-CLIP (final)",
}


def load(p):
    return {r["ID"]: (r.get("Target") or "").strip() for r in csv.DictReader(open(p, encoding="utf-8"))}


def halluc(t):
    w = t.split()
    if len(w) >= 6 and Counter(w).most_common(1)[0][1] / len(w) > 0.5:
        return True
    return False


files = [f for f in LABEL if os.path.exists("/root/" + f)]
ref = load(REF)
ids = list(ref.keys())
data = {f: load("/root/" + f) for f in files}

print("=" * 90)
print(f"{'FICHIER':<34}{'lignes':>7}{'vides':>6}{'mots/clip':>10}{'halluc':>7}{'=REF%':>7}{'sim.REF':>8}")
print("-" * 90)
for f in files:
    d = data[f]
    wl = [len(v.split()) for v in d.values()]
    nl = len(d); ne = sum(1 for v in d.values() if not v); nh = sum(1 for v in d.values() if halluc(v))
    same = sum(1 for i in ids if d.get(i, "") == ref.get(i, ""))
    diff_ids = [i for i in ids if d.get(i, "") != ref.get(i, "")]
    sim = statistics.mean(SequenceMatcher(None, ref.get(i, ""), d.get(i, "")).ratio() for i in diff_ids) if diff_ids else 1.0
    tag = " <<REF" if f == os.path.basename(REF) else ""
    print(f"{f:<34}{nl:>7}{ne:>6}{statistics.mean(wl):>10.1f}{nh:>7}{100*same//nl:>7}{sim:>8.2f}{tag}")
    print(f"    -> {LABEL[f]}")

print("\n" + "=" * 90)
print("MATRICE % lignes identiques (proximité entre candidats — >99% = quasi-doublon)")
print("-" * 90)
short = {f: f.replace("sub_", "").replace(".csv", "")[:14] for f in files}
hdr = "".join(f"{short[f]:>16}" for f in files)
print(f"{'':<16}{hdr}")
for a in files:
    row = ""
    for b in files:
        s = sum(1 for i in ids if data[a].get(i, "") == data[b].get(i, ""))
        row += f"{100*s//len(ids):>16}"
    print(f"{short[a]:<16}{row}")