Đề bài
Các tokenizer kiểu GPT dùng Byte Pair Encoding: bắt đầu từ từng ký tự và liên tục gộp cặp ký hiệu liền kề phổ biến nhất thành một ký hiệu mới.
- Tách mỗi từ trong
wordsthành các ký tự. Từ lặp lại được tính nhiều lần. - Đếm mọi cặp ký hiệu liền kề trên tất cả các từ.
- Chọn cặp xuất hiện nhiều nhất. Nếu bằng nhau, chọn cặp nhỏ nhất khi so sánh (ký hiệu đầu, ký hiệu sau) như chuỗi.
- Thay mọi lần xuất hiện của cặp đó, từ trái sang phải, bằng ký hiệu đã gộp, và ghi lại ký hiệu đã gộp.
- Lặp lại
num_mergeslần, hoặc dừng sớm khi không còn từ nào có từ hai ký hiệu trở lên.
Hãy cài đặt bpe_merges(words, num_merges).
Đầu vào
words: Các từ huấn luyện (chữ thường).
num_merges: Số lần gộp cần học.
Đầu ra
Trả về các ký hiệu đã gộp theo thứ tự được học.
Ràng buộc
1 ≤ số từ ≤ 1.000, 1 ≤ độ dài mỗi từ ≤ 30
0 ≤ num_merges ≤ 200
Ví dụ
Đầu vào:
words = ["low", "lower", "lowest"]
num_merges = 2
Kết quả mong đợi:
expected = ["lo", "low"]
Đầu vào:
std::vector<std::string> words = {"low", "lower", "lowest"};
long long num_merges = 2;
Kết quả mong đợi:
std::vector<std::string> expected = {"lo", "low"};
Đầu vào:
string[] words = new string[] {"low", "lower", "lowest"};
long num_merges = 2;
Kết quả mong đợi:
string[] expected = new string[] {"lo", "low"};
Giải thích
Các cặp: "l o" và "o w" đều xuất hiện 3 lần; khi hòa, chọn "l o" ("l" < "o"), được "lo". Giờ "lo w" xuất hiện 3 lần, được "low". Kết quả: ["lo", "low"].
Đầu vào:
words = ["aaa"]
num_merges = 3
Kết quả mong đợi:
expected = ["aa", "aaa"]
Đầu vào:
std::vector<std::string> words = {"aaa"};
long long num_merges = 3;
Kết quả mong đợi:
std::vector<std::string> expected = {"aa", "aaa"};
Đầu vào:
string[] words = new string[] {"aaa"};
long num_merges = 3;
Kết quả mong đợi:
string[] expected = new string[] {"aa", "aaa"};
Giải thích
"aaa" có cặp "a a" hai lần. Gộp từ trái sang phải được "aa" + "a". Sau đó "aa a" gộp thành "aaa", từ chỉ còn một ký hiệu, nên lần gộp thứ ba không có gì để làm. Kết quả: ["aa", "aaa"].
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.