Problema
I tokenizzatori in stile GPT usano il Byte Pair Encoding: parti da singoli caratteri e fondi ripetutamente la coppia di vicini più frequente in un nuovo simbolo.
- Dividi ogni parola di
wordsin caratteri. Le parole ripetute contano più volte. - Conta ogni coppia di simboli vicini in tutte le parole.
- Scegli la coppia più frequente. In caso di pareggio, scegli la coppia minore confrontando (primo simbolo, secondo simbolo) come stringhe.
- Sostituisci ogni occorrenza di quella coppia, da sinistra a destra, con il simbolo fuso e annota il simbolo fuso.
- Ripeti
num_mergesvolte, oppure fermati prima se nessuna parola ha più due simboli.
Implementa bpe_merges(words, num_merges).
Input
words: Le parole di addestramento (lettere minuscole).
num_merges: Quante fusioni imparare.
Output
Restituisci i simboli fusi nell'ordine in cui sono stati imparati.
Vincoli
1 ≤ numero di parole ≤ 1.000, 1 ≤ lunghezza di ogni parola ≤ 30
0 ≤ num_merges ≤ 200
Esempi
Input:
words = ["low", "lower", "lowest"]
num_merges = 2
Output atteso:
expected = ["lo", "low"]
Input:
std::vector<std::string> words = {"low", "lower", "lowest"};
long long num_merges = 2;
Output atteso:
std::vector<std::string> expected = {"lo", "low"};
Input:
string[] words = new string[] {"low", "lower", "lowest"};
long num_merges = 2;
Output atteso:
string[] expected = new string[] {"lo", "low"};
Spiegazione
Coppie: "l o" e "o w" compaiono 3 volte ciascuna; il pareggio va a "l o" ("l" < "o"), che dà "lo". Poi "lo w" compare 3 volte e dà "low". Risultato: ["lo", "low"].
Input:
words = ["aaa"]
num_merges = 3
Output atteso:
expected = ["aa", "aaa"]
Input:
std::vector<std::string> words = {"aaa"};
long long num_merges = 3;
Output atteso:
std::vector<std::string> expected = {"aa", "aaa"};
Input:
string[] words = new string[] {"aaa"};
long num_merges = 3;
Output atteso:
string[] expected = new string[] {"aa", "aaa"};
Spiegazione
"aaa" contiene la coppia "a a" due volte. Fusa da sinistra a destra dà "aa" + "a". Poi "aa a" si fonde in "aaa" e la parola ha un solo simbolo, quindi la terza fusione non ha nulla da fare. Risultato: ["aa", "aaa"].
Riferimenti
Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.