如何在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
相关产品推荐
相关产品推荐

