Токенизаторы в стиле GPT используют Byte Pair Encoding: начните с отдельных символов и многократно объединяйте самую частую пару соседей в новый символ.
- Разбейте каждое слово из
wordsна символы. Повторяющиеся слова учитываются несколько раз. - Подсчитайте каждую пару соседних символов по всем словам.
- Выберите самую частую пару. При равенстве выберите наименьшую пару, сравнивая (первый символ, второй символ) как строки.
- Замените каждое вхождение этой пары слева направо объединённым символом и запишите объединённый символ.
- Повторите
num_mergesраз или остановитесь раньше, если ни в одном слове больше нет двух символов.
Реализуйте bpe_merges(words, num_merges).
Входные данные
words: Обучающие слова (строчные буквы).
num_merges: Сколько слияний выучить.
Выходные данные
Верните объединённые символы в порядке их изучения.
Ограничения
1 ≤ число слов ≤ 1 000, 1 ≤ длина каждого слова ≤ 30
0 ≤ num_merges ≤ 200
Примеры
Ввод:
words = ["low", "lower", "lowest"]
num_merges = 2
Ожидаемый вывод:
expected = ["lo", "low"]
Ввод:
std::vector<std::string> words = {"low", "lower", "lowest"};
long long num_merges = 2;
Ожидаемый вывод:
std::vector<std::string> expected = {"lo", "low"};
Ввод:
string[] words = new string[] {"low", "lower", "lowest"};
long num_merges = 2;
Ожидаемый вывод:
string[] expected = new string[] {"lo", "low"};
Пояснение
Пары: "l o" и "o w" встречаются по 3 раза; при равенстве побеждает "l o" ("l" < "o"), что даёт "lo". Затем "lo w" встречается 3 раза и даёт "low". Результат: ["lo", "low"].
Ввод:
words = ["aaa"]
num_merges = 3
Ожидаемый вывод:
expected = ["aa", "aaa"]
Ввод:
std::vector<std::string> words = {"aaa"};
long long num_merges = 3;
Ожидаемый вывод:
std::vector<std::string> expected = {"aa", "aaa"};
Ввод:
string[] words = new string[] {"aaa"};
long num_merges = 3;
Ожидаемый вывод:
string[] expected = new string[] {"aa", "aaa"};
Пояснение
"aaa" содержит пару "a a" дважды. Слияние слева направо даёт "aa" + "a". Затем "aa a" сливается в "aaa", и в слове остаётся один символ, поэтому третьему слиянию нечего делать. Результат: ["aa", "aaa"].
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.