tokenizers.Tokenizer(model)
Tokenizer函数构造一个分词器对象。分词方式主要有word-level、subword-level、char-level三种,其中,subword-level分词方式又有四种不同实现的方法:BPE、Unigram、WordPiece、SentencePiece。
参数model表示分词器使用的分词方式,接受一个Model对象,这里主要实现了word-level的分词方式以及subword-level的分词方式。Tokenizer类主要的方法有:
1、from_file(path):从指定文件加载Tokenizer对象。
2、from_pretrained(identifier, revision = ‘main’, auth_token = None):从Hugging Face Hub官网上加载一个已存在的Tokenizer对象。参数identifier就是加载的对象模型。
3、from_str(json):从json格式的字符串来加载Tokenizer对象。
4、from_buffer(buffer):从缓冲区来加载Tokenizer对象。
5、encode(sequence, pair = None, is_pretokenized = False, add_special_tokens = True):对于给定的一个分句进行编码,返回一个Encoding对象。参数pair表示第二个分句。参数is_pretokenized表示是否已经预分词化,如果为True,则输入的sequence和pair都应该为一个列表。
6、encode_batch(input, is_pretokenized = False, add_special_tokens = True):对多个分句进行编码,返回一个Encoding对象。
7、decode(ids, skip_special_tokens = True):表示对一个id序列进行解码,将id映射为字符串。参数skip_special_tokens表示是否跳过特殊的字符串。这些特殊的字符串是由add_special_tokens函数来创建的。
8、decode_batch(sequences, skip_special_tokens = True):表示对多个id序列进行解码。
9、add_tokens(tokens):添加新的分词,这些分词会添加到词汇表中。
10、add_special_tokens(tokens):添加特殊的分词到词汇表中,与add_tokens函数不同的是,这些特殊的分词可以在解码时被忽略。
11、enable_padding(direction = ‘right’, pad_id = 0, pad_type_id = 0, pad_token = ‘[PAD]’, length = None, pad_to_multiple_of = None):设置在进行encode_batch操作时,当各个分句的长度不一样时应用填充。
12、enable_truncation(max_length, stride = 0, strategy = ‘longest_first’, direction = ‘right’ ):设置在进行encode_batch操作时,当各个分句的长度不一样时对分句进行截取。
13、no_padding( ):禁用填充。
14、no_truncation( ):禁用截取。
15、save(path, pretty = True):保存tokenizer模型(一个json文件)到指定路径,参数pretty表示用一行还是多行来表示json文件,默认为多行。
16、train(files, trainer = None):用指定文件列表里面的数据来训练分词器。
17、id_to_token(id):将单个id转换成单个字符。
18、token_to_id(token):将单个字符转换成单个id。
1、tokenizer模型的加载
# 第一种加载方式
# 从json文件中加载tokenizer对象
tokenizer0 = tokenizers.Tokenizer.from_file("./tokenizer4/vocab.json")
# 从hugging face 官网中在线加载tokenzier对象
tokenizer1 = tokenizers.Tokenizer.from_pretrained("distilbert-base-uncased")
# 根据json文件的内容字符串来加载tokenizer对象
with open("./tokenizer4/vocab.json", "r", encoding="utf8") as file:
json_dict = json.load(file)
json_string = json.dumps(json_dict)
tokenizer2 = tokenizers.Tokenizer.from_str(json_string)
# 第二种加载方式
tokenizer = tokenizers.Tokenizer()
tokenizer.model = models.BPE().from_file(vocab="./tokenizer4/vocab.json", merges="./tokenizer4/merges.txt")
2、tokenizer模型的训练
# 中文分词方式,除了BPE,还有WordPiece、Unigram两种
tokenizer = tokenizers.Tokenizer(models.BPE())
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
tokenizer.decoder = decoders.BPEDecoder()
trainer = trainers.BpeTrainer()
tokenizer.train(["ch_demo_sm.txt"], trainer)
# 英文分词方式,word-level分词方式
tokenizer = tokenizers.Tokenizer(models.WordLevel())
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
trainer = trainers.WordLevelTrainer(special_tokens=["[PAD]"])
tokenizer.train(["en_demo_sm.txt"], trainer)
# 英文分词方式,subword-level分词方式
# 这里使用wordpiece分词方法
tokenizer = tokenizers.Tokenizer(models.WordPiece())
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
trainer = trainers.WordPieceTrainer(special_tokens=["[PAD]"])
tokenizer.train(["en_demo_sm.txt"], trainer)
3、tokenizer模型的保存
# 使用tokenizer.save函数保存,会生成一个vocab.json文件
tokenizer.save("./tokenizer4/vocab.json")
# 使用tokenizer.model.save保存,会生成一个vocab.json和一个merges.txt文件
# 注意这个vocab.json和上面的vocab.json文件内容不一样。
tokenizer.model.save("./tokenizer4")
4、使用tokenizer模型进行encode和decode操作
# 编码一个句子
encoding0 = tokenizer.encode("any attempt to leave surprises me.")
# 编码一个有两个分句的句子
encoding1 = tokenizer.encode("any attempt to leave surprises me.", pair="arrival of John dead surprised me.")
# 参数is_pretokenized=True时,参数sequence应为一个列表
encoding2 = tokenizer.encode(["any attempt to leave surprises me."],
is_pretokenized=True)
# 编码多个句子
encodings0 = tokenizer.encode_batch(["any attempt to leave surprises me.",
"the arrival of John dead surprised me."])
# 编码多个有两个分词的句子
encodings1 = tokenizer.encode_batch([("any attempt to leave surprises me.", "John's arrival dead surprised me."),
("John's attempt to leave surprised me.", "the arrival of John dead surprised me.")])
# 参数is_pretokenized=True时,参数sequence应为一个列表
encodings2 = tokenizer.encode_batch([["any attempt to leave surprises me."],
["the arrival of John dead surprised me."]],
is_pretokenized=True)
# 对一个ids进行解码
decode_string = tokenizer.decode(encoding1.ids, skip_special_tokens=False)
# 对多个ids进行解码
decode_strings = tokenizer.decode_batch([encodings1[0].ids, encodings1[1].ids])
# 将单词变成id
token_id = tokenizer.token_to_id("me")
# 将id变成单词
token = tokenizer.id_to_token(62)