Tutte le sfide
Media 0 risolte 0% di accettazione

Fusioni Byte Pair Encoding (BPE)

Impara fusioni di sottoparole come i tokenizzatori GPT: fondi ripetutamente la coppia di simboli vicini più frequente.

Cosa imparerai

  • Contare le coppie di simboli adiacenti
  • Unire più volte la coppia più frequente
  • Capire come si costruiscono i tokenizzatori in stile GPT

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.

  1. Dividi ogni parola di words in caratteri. Le parole ripetute contano più volte.
  2. Conta ogni coppia di simboli vicini in tutte le parole.
  3. Scegli la coppia più frequente. In caso di pareggio, scegli la coppia minore confrontando (primo simbolo, secondo simbolo) come stringhe.
  4. Sostituisci ogni occorrenza di quella coppia, da sinistra a destra, con il simbolo fuso e annota il simbolo fuso.
  5. Ripeti num_merges volte, 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

Esempio 1
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"].

Esempio 2
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.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.