while len(vocab) < vocab_size:
max_freq = max(pair_freqs.values())
most_freq_pairs = [pair for pair, freq in pair_freqs.items() if freq == max_freq]
best_pair = max(most_freq_pairs) # 频率相同时选择字典序最大的
new_token = best_pair[0] + best_pair[1]
vocab[cur_id] = new_token
affected_tokens_freqs = [
for token_seq, freq in token_freqs.items()
if best_pair in token_seq_to_pairs[token_seq]
for token_seq, freq in affected_tokens_freqs:
# 4a. 从pair_freqs中移除旧token对的贡献
for i in range(len(token_seq) - 1):
old_pair = (token_seq[i], token_seq[i+1])
pair_freqs[old_pair] -= freq
if pair_freqs[old_pair] <= 0:
# 4b. 构建新的token序列(将所有best_pair替换为new_token)
while i < len(token_seq):
if i < len(token_seq) - 1 and (token_seq[i], token_seq[i+1]) == best_pair:
new_token_seq.append(new_token)
new_token_seq.append(token_seq[i])
new_token_seq = tuple(new_token_seq)
# 4c. 将新token序列产生的对频率添加到pair_freqs
for i in range(len(new_token_seq) - 1):
new_pair = (new_token_seq[i], new_token_seq[i+1])
pair_freqs[new_pair] += freq
# 4d. 更新token_freqs和token_seq_to_pairs
del token_freqs[token_seq]
token_freqs[new_token_seq] = freq
del token_seq_to_pairs[token_seq]
for i in range(len(new_token_seq) - 1):
new_pairs_set.add((new_token_seq[i], new_token_seq[i+1]))
token_seq_to_pairs[new_token_seq] = new_pairs_set