训练BpeTokenizer时触发TypeError:BpeTrainer无法转换为Sequence
解决BPE Tokenizer训练时的TypeError问题
错误原因
你遇到的TypeError: argument 'files': 'BpeTrainer' object cannot be converted to 'Sequence',核心问题是**tokenizer.train()的参数顺序完全搞反了**。tokenizers库中Tokenizer.train()方法的第一个参数应该是文件路径序列,第二个参数才是训练器(BpeTrainer)对象。
另外代码里还有两个小问题:
inital_alphabet拼写错误,正确写法是initial_alphabet- 特殊符号用了HTML转义(
<s>),这会导致训练出的token是<s>而不是预期的<s>,需要直接写原始符号
修正后的代码
修正后的BPE_token类
import os from tokenizers.models import BPE from tokenizers import Tokenizer from tokenizers.decoders import ByteLevel as ByteLevelDecoder from tokenizers.normalizers import NFKC, Sequence from tokenizers.pre_tokenizers import ByteLevel from tokenizers.trainers import BpeTrainer class BPE_token(object): def __init__(self): self.tokenizer = Tokenizer(BPE()) self.tokenizer.normalizer = Sequence([ NFKC() ]) self.tokenizer.pre_tokenizer = ByteLevel() self.tokenizer.decoder = ByteLevelDecoder() def bpe_train(self, paths): # 修正拼写错误:inital_alphabet -> initial_alphabet # 修正特殊符号的写法,去掉HTML转义 trainer = BpeTrainer( vocab_size=50000, show_progress=True, initial_alphabet=ByteLevel.alphabet(), special_tokens=[ "<s>", "<pad>", "</s>", "<unk>", "<mask>" ] ) # 修正参数顺序:先传paths,再传trainer self.tokenizer.train(paths, trainer) def save_tokenizer(self, location, prefix=None): if not os.path.exists(location): os.makedirs(location) self.tokenizer.model.save(location, prefix) # 额外补充:保存完整的tokenizer配置(可选,但推荐) self.tokenizer.save(os.path.join(location, "tokenizer.json"))
修正后的调用代码
from tokenise import BPE_token from pathlib import Path import os # 遍历text文件夹下所有txt文件 paths = [str(x) for x in Path("./text/").glob("**/*.txt")] tokenizer = BPE_token() # 训练tokenizer tokenizer.bpe_train(paths) # 保存结果 save_path = 'tokenized_data' tokenizer.save_tokenizer(save_path)
额外说明
- 补充的
self.tokenizer.save()可以保存完整的tokenizer配置(包括归一化、预分词器等设置),后续加载时直接用Tokenizer.from_file()就能还原整个tokenizer,比只保存模型更方便。 - 如果你的文本文件编码有问题,可能需要在读取时指定编码,但当前代码是让
tokenizers库直接读取文件,它会自动处理常见编码。
内容的提问来源于stack exchange,提问作者Brian Hode
相关产品推荐
相关产品推荐

