赞
踩
pip install tokenizers
# 以下不需要
pip install tensorflow
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
tokenizers.Tokenizer(model)
Tokenizer 函数构造一个分词器对象。分词方式主要有word-level、subword-level、char-level三种,其中,subword-level分词方式又有四种不同实现的方法:BPE、Unigram、WordPiece、SentencePiece。
参数 model 表示分词器使用的分词方式,接受一个Model对象,这里主要实现了 word-level 的分词方式以及 subword-level 的分词方式。Tokenizer 类主要的方法有:
# 从指定文件加载 Tokenizer 对象。 from_file(path) # 从Hugging Face Hub官网上加载一个已存在的Tokenizer对象。参数identifier 就是加载的对象模型。 from_pretrained(identifier, revision = ‘main’, auth_token = None) # 从 json 格式的字符串来加载 Tokenizer 对象。 from_str(json) # 从缓冲区来加载 Tokenizer 对象。 from_buffer(buffer) # 对于给定的一个分句进行编码,返回一个Encoding 对象。参数 pair 表示第二个分句。参数 is_pretokenized 表示是否已经预分词化,如果为 True,则输入的 sequence 和 pair 都应该为一个列表。 encode(sequence, pair = None, is_pretokenized = False, add_special_tokens = True) # 对多个分句进行编码,返回一个 Encoding 对象。 encode_batch(input, is_pretokenized = False, add_special_tokens = True) # 表示对一个 id 序列进行解码,将 id 映射为字符串。参数 skip_special_tokens 表示是否跳过特殊的字符串。这些特殊的字符串是由 add_special_tokens 函数来创建的。 decode(ids, skip_special_tokens = True) # 表示对多个 id 序列进行解码。 decode_batch(sequences, skip_special_tokens = True) # 添加新的分词,这些分词会添加到词汇表中。 add_tokens(tokens) # 添加特殊的分词到词汇表中,与 add_tokens 函数不同的是,这些特殊的分词可以在解码时被忽略。 add_special_tokens(tokens) # 设置在进行 encode_batch 操作时,当各个分句的长度不一样时应用填充。 enable_padding(direction = ‘right’, pad_id = 0, pad_type_id = 0, pad_token = ‘[PAD]’, length = None, pad_to_multiple_of = None) # 设置在进行 encode_batch 操作时,当各个分句的长度不一样时对分句进行截取。 enable_truncation(max_length, stride = 0, strategy = ‘longest_first’, direction = ‘right’) # 禁用填充。 no_padding() # 禁用截取。 no_truncation() # 保存 tokenizer 模型(一个 json 文件)到指定路径,参数 pretty 表示用一行还是多行来表示 json 文件,默认为多行。 save(path, pretty = True) # 用指定文件列表里面的数据来训练分词器。 train(files, trainer = None) # 将单个 id 转换成单个字符。 id_to_token(id) # 将单个字符转换成单个 id。 token_to_id(token)
# 第一种加载方式
# 从 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")
# 中文分词方式,除了 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)
# 使用 tokenizer.save 函数保存,会生成一个 vocab.json 文件
tokenizer.save("./tokenizer4/vocab.json")
# 使用 tokenizer.model.save 保存,会生成一个 vocab.json 和一个 merges.txt 文件
# 注意这个 vocab.json 和上面的 vocab.json 文件内容不一样。
tokenizer.model.save("./tokenizer4")
# 编码一个句子 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)
参考:
https://www.utheme.cn/aigc/28687.html
from tokenizers import Tokenizer from tokenizers.models import BPE from tokenizers.trainers import BpeTrainer from tokenizers.pre_tokenizers import Whitespace def train_tokenizer(): # 创建一个空的 BPE 模型 tokenizer = Tokenizer(BPE()) # 创建一个 Trainer,并指定一些训练参数 trainer = BpeTrainer(special_tokens=["<s>", "<pad>", "</s>", "<unk>", "<mask>"]) # 创建一个 PreTokenizer pre_tokenizer = Whitespace() # 使用 Trainer 和 PreTokenizer 训练 BPE 模型 tokenizer.pre_tokenizer = pre_tokenizer #files = ["/path/to/your/dataset.txt"] # 替换为你用来训练tokenizer的文本数据的路径 # 参考地址:https://job.yanxishe.com/blogDetail/18050 # 下载地址:https://wortschatz.uni-leipzig.de/en/download/Chinese files = ["/home/*/tokenizers/zho_news_2020_10K/zho_news_2020_10K-words.txt"] tokenizer.train(files, trainer) return tokenizer def count_tokens(text, tokenizer): # 使用 tokenizer 将文本转化为 tokens output = tokenizer.encode(text) print("count_tokens", output.tokens) print("count_tokens", output) # 输出的 tokens 的数量 return len(output.tokens) # 创建 tokenizer tokenizer = train_tokenizer() # 测试字符串的 tokens 数量 text = "这是一个测试句子。" print(count_tokens(text, tokenizer))
运行结果
参考:
https://job.yanxishe.com/blogDetail/18050
from tokenizers import Tokenizer from tokenizers.models import BPE from tokenizers.trainers import BpeTrainer from tokenizers.pre_tokenizers import Whitespace from pathlib import Path def train_tokenizer(): # 创建一个空的BPE模型 tokenizer = Tokenizer(BPE()) # 创建一个Trainer,并指定一些训练参数 trainer = BpeTrainer(special_tokens=["<s>", "<pad>", "</s>", "<unk>", "<mask>"]) # 创建一个PreTokenizer pre_tokenizer = Whitespace() # 使用Trainer和PreTokenizer训练BPE模型 tokenizer.pre_tokenizer = pre_tokenizer ##files = ["/path/to/your/dataset.txt"] # 替换为你用来训练tokenizer的文本数据的路径 ##files = ["/home/lianap/llm/datasets/test/rm-static/dataset_infos.json"] # 替换为你用来训练tokenizer的文本数据的路径 #files = ["/home/lianap/tokenizers/zho_news_2020_10K/zho_news_2020_10K-words.txt"] # 替换为你用来训练tokenizer的文本数据的路径 #tokenizer.train(files, trainer) paths = [str(x) for x in Path("./zho_news_2020_10K/").glob("**/*.txt")] #tokenizer.train(files=paths, vocab_size=52_000, min_frequency=2, special_tokens=[ # "<s>", # "<pad>", # "</s>", # "<unk>", # "<mask>", #]) tokenizer.train(files=paths, trainer=trainer) return tokenizer def count_tokens(text, tokenizer): # 使用tokenizer将文本转化为tokens output = tokenizer.encode(text) print("count_tokens", output.tokens) print("count_tokens", output) # 输出的tokens的数量 return len(output.tokens) # 创建tokenizer tokenizer = train_tokenizer() # 测试字符串的tokens数量 text = "这是一个测试句子。" #text = "测试字符串的tokens数量。" #text = "hello world" print(count_tokens(text, tokenizer))
https://zhuanlan.zhihu.com/p/591335566
https://blog.csdn.net/m0_74053536/article/details/134151336
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。