Characters and texts

Codifica dei caratteri in input

Immaginando di avere il modello n-gram , che sulla base di un set di sillabe in input, predice il carattere successivo Es.: per n = 2 bigram, 3 trigram etc. etc...
Come codifichiamo questi caratteri per darli in input alla rete?

i caratteri possibili sono 27 (alfabeto + carattere di inizio e fine parola).
Creiamo due dict per mappare i caratteri ai numeri interi.

# words è un elenco di varie parole (nomi femminili) che comprendono tutti i caratteri 
# dell'alfabeto (https://raw.githubusercontent.com/karpathy/makemore/master/names.txt)
# words = ['emma', 'olivia', 'ava', ... ]
chars = sorted(list(set(''.join(words)))) # i 26 caratteri del'alfabeto

# mettiamo i caratteri in un dict, enumerandoli.. mappando carattere e posizione
stoi = { s:i + 1 for i, s in enumerate(chars)}

# aggiungo caratteri speciali dell'inizio e fine riga
stoi['.'] = 0

# creiamo anche il dict con mapping inverso, da numeri a char
itos = {i:s for s, i in stoi.items()}

Training set

il Training set della rete (es.: bigram) è un insieme di caratteri creati a partire dalle parole in words.
Es.: dalla prima parola otteniamo ['.e', 'em', 'mm' 'ma', 'a.']
Il primo carattere di ogni elemento è il nostro input (xs), il secondo è l'output desiderato (ys) (carattere da prevedere)
Questi caratteri dentro xs e ys vengono però codificati nei corrispondenti numeri della mappatura fatta sopra.
Es.: 'm' è inserito dentro xs e ys con il numero 13

xs = [] #input
ys = [] #output

# for w in words[:1]:
for w in words:
  chs = ['.'] + list(w) + ['.']
  for ch1, ch2 in zip(chs, chs[1:]):
    ix1 = stoi[ch1] #indice del carattere attuale
    ix2 = stoi[ch2] #indice del carattere successivo
    # print(ch1, ch2)
    xs.append(ix1)
    ys.append(ix2)

xs = torch.tensor(xs)
ys = torch.tensor(ys)
num = xs.nelement()

avremo così i tensori xs e ys, di 228146 elementi ciascuno.