slay-micro-models / src /tools /analyze.py
Maggio33's picture
Re-sync: warstwowy src/ (core/data/train/generate/compose/tools) + wagi + karta
ab7c6e3 verified
Raw
History Blame Contribute Delete
1.4 kB
"""Metryki do raportu: rozkład znaków, nowość (kopiuje vs komponuje), długości."""
import sys, collections, json
sys.stdout.reconfigure(encoding="utf-8")
train = open("data/jigs.abc", encoding="utf-8").read()
gen = open("data/generated.abc", encoding="utf-8").read()
# ciało generacji bez nagłówków (do metryki nowości)
def bodies(text):
return "".join(ln for ln in text.split("\n")
if ln and not ln[:2] in ("X:", "M:", "K:"))
gen_body = bodies(gen)
# 1) rozkład znaków (top 15) w treningu
freq = collections.Counter(c for c in train if c != "\n")
top = freq.most_common(15)
# 2) nowość: jaki % k-gramów generacji WYSTĘPUJE w treningu (kopiowanie)
novelty = {}
for k in (4, 6, 8):
tr = set(train[i:i+k] for i in range(len(train)-k))
gk = [gen_body[i:i+k] for i in range(len(gen_body)-k)]
seen = sum(1 for g in gk if g in tr)
novelty[k] = {"skopiowane_%": round(100*seen/len(gk), 1),
"nowe_%": round(100*(1-seen/len(gk)), 1)}
del tr
# 3) długości wygenerowanych melodii
tunes = [t for t in gen.split("\n\n") if "X:" in t]
lens = [len(t) for t in tunes]
print(json.dumps({
"korpus_znaki": len(train),
"slownik": len(set(train)),
"top_znaki": top,
"nowosc": novelty,
"wygenerowane_melodie": len(tunes),
"srednia_dlugosc_znaki": round(sum(lens)/len(lens), 1),
}, ensure_ascii=False, indent=2))