You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Byte-level BPE tokenizer中融入Bigram、Trigram等n-gram?

如何在ByteLevelBPETokenizer中融入Bigram/Trigram等N-gram

你当前用ByteLevelBPETokenizer训练的分词器,生成的token多为单字或拆分后的小单元,想要得到由2-3个token组合成的长token,可以通过以下几种方式实现:

1. 给训练语料注入N-gram,引导BPE合并高频组合

ByteLevelBPE本身的核心逻辑就是迭代合并语料中最频繁的子词对(本质就是生成bigram),但如果想针对性地强化2-3词组合的生成,可以先把这些组合提前加入训练语料,人为提高它们的出现频率,让BPE优先合并这类组合。

示例代码如下:

from tokenizers import ByteLevelBPETokenizer, normalizers
from nltk.util import ngrams
import nltk
nltk.download('punkt')

# 生成带N-gram的增强语料
def augment_corpus_with_ngrams(corpus, n):
    augmented = []
    for text in corpus:
        # 先按单词拆分文本
        word_tokens = nltk.word_tokenize(text)
        # 生成N-gram并转为字符串
        ngram_strings = [' '.join(gram) for gram in ngrams(word_tokens, n)]
        # 原始文本+生成的N-gram都加入训练集
        augmented.append(text)
        augmented.extend(ngram_strings)
    return augmented

# 假设Data是你的原始文本语料
# 分别加入bigram和trigram
augmented_data = augment_corpus_with_ngrams(Data, n=2)
augmented_data += augment_corpus_with_ngrams(Data, n=3)

# 训练分词器
tokenizer = ByteLevelBPETokenizer()
tokenizer.normalizer = normalizers.BertNormalizer(lowercase=False)
tokenizer.train_from_iterator(
    augmented_data,
    vocab_size=50264,
    min_frequency=2,
    special_tokens=["<s>", "<pad>", "</s>", "<unk>"]
)

2. 调整BPE训练参数,优化长token生成

  • min_frequency:降低这个值,可以让更多低频的子词对被合并(包括一些2-3词组合),但注意不要调得过低,否则会引入大量无意义的稀有组合,导致词汇表冗余。
  • vocab_size:增大词汇量上限,能给BPE更多空间去合并子词对,生成更多长token。如果当前的50264不够,可以适当调高,比如设置为65536。

3. 验证与调整

训练完成后,一定要拿样本文本测试分词效果,确保生成的长token是有实际语义的组合(比如"machine learning"这类常用短语),而不是随机拼接的无意义序列。如果出现过多无效长token,可以调高min_frequency或者减少注入的N-gram数量。

内容的提问来源于stack exchange,提问作者Eghbal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:42:29