File size: 1,402 Bytes
ab7c6e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""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))