• tokenizers Tokenizer 类


    Tokenizer 类

    依赖安装

    pip install tensorflow
    pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    • 1
    • 2

    基类原型

    tokenizers.Tokenizer(model)
    
    • 1

    基类说明

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    函数使用

    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")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    实操

    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=["", "", "", "", ""])
    
        # 创建一个 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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    运行结果
    tokenizers

  • 相关阅读:
    1032 挖掘机技术哪家强
    【银河麒麟V10】【桌面】安装虚拟pdf打印机
    智能家电经营小程序商城的作用是什么
    MediaPlayer_Analyze-2-JNI
    【数据结构之单链表(超详解)】
    数据结构 —— 双向链表(超详细图解 & 接口函数实现)
    1.HTML简介
    5.7w字?GitHub标星120K的Java面试知识点总结,真就物超所值了
    【Python学习】—Python基础语法(六)
    学会这一方法,轻松实现Excel批量转PDF,快来码住
  • 原文地址:https://blog.csdn.net/cliffordl/article/details/134530912