Problem
Tokenizer im Stil von GPT verwenden Byte Pair Encoding: Beginne mit einzelnen Zeichen und verschmelze wiederholt das häufigste Nachbarpaar zu einem neuen Symbol.
- Zerlege jedes Wort in
wordsin Zeichen. Wiederholte Wörter zählen mehrfach. - Zähle jedes Paar benachbarter Symbole über alle Wörter.
- Wähle das häufigste Paar. Bei Gleichstand das Paar, das beim Vergleich von (erstes Symbol, zweites Symbol) als Zeichenketten am kleinsten ist.
- Ersetze jedes Vorkommen dieses Paars, von links nach rechts, durch das verschmolzene Symbol und notiere das verschmolzene Symbol.
- Wiederhole das
num_merges-mal oder höre früher auf, wenn kein Wort mehr zwei Symbole hat.
Implementiere bpe_merges(words, num_merges).
Eingabe
words: Die Trainingswörter (Kleinbuchstaben).
num_merges: Wie viele Merges gelernt werden sollen.
Ausgabe
Gib die verschmolzenen Symbole in der Reihenfolge zurück, in der sie gelernt wurden.
Einschränkungen
1 ≤ Anzahl der Wörter ≤ 1.000, 1 ≤ Länge jedes Worts ≤ 30
0 ≤ num_merges ≤ 200
Beispiele
Eingabe:
words = ["low", "lower", "lowest"]
num_merges = 2
Erwartete Ausgabe:
expected = ["lo", "low"]
Eingabe:
std::vector<std::string> words = {"low", "lower", "lowest"};
long long num_merges = 2;
Erwartete Ausgabe:
std::vector<std::string> expected = {"lo", "low"};
Eingabe:
string[] words = new string[] {"low", "lower", "lowest"};
long num_merges = 2;
Erwartete Ausgabe:
string[] expected = new string[] {"lo", "low"};
Erläuterung
Paare: "l o" und "o w" kommen je 3-mal vor; bei Gleichstand gewinnt "l o" ("l" < "o") und ergibt "lo". Jetzt kommt "lo w" 3-mal vor und ergibt "low". Ergebnis: ["lo", "low"].
Eingabe:
words = ["aaa"]
num_merges = 3
Erwartete Ausgabe:
expected = ["aa", "aaa"]
Eingabe:
std::vector<std::string> words = {"aaa"};
long long num_merges = 3;
Erwartete Ausgabe:
std::vector<std::string> expected = {"aa", "aaa"};
Eingabe:
string[] words = new string[] {"aaa"};
long num_merges = 3;
Erwartete Ausgabe:
string[] expected = new string[] {"aa", "aaa"};
Erläuterung
"aaa" enthält das Paar "a a" zweimal. Von links nach rechts verschmolzen ergibt das "aa" + "a". Dann verschmilzt "aa a" zu "aaa", und das Wort besteht nur noch aus einem Symbol, also hat der dritte Merge nichts zu tun. Ergebnis: ["aa", "aaa"].
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.