• 【学习总结】Python transformers AutoTokenizer encode 出现的 101 和 102


    1. 代码展示:

    from transformers import AutoTokenizer, AutoModel
    
    model_name = "bert-base-chinese"
    
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModel.from_pretrained(model_name)
    
    print(len(tokenizer.vocab.keys()))
    
    sequence = "法国的首都是巴黎"
    print(tokenizer.vocab["法"])
    tokens = tokenizer.tokenize(sequence)
    print(tokens)
    
    token_ids = tokenizer.convert_tokens_to_ids(tokens)
    print(token_ids)
    
    token_ids_s2e = tokenizer.encode(sequence)
    print(token_ids_s2e)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出结果:

    21128
    3791
    ['法', '国', '的', '首', '都', '是', '巴', '黎']
    [3791, 1744, 4638, 7674, 6963, 3221, 2349, 7944]
    [101, 3791, 1744, 4638, 7674, 6963, 3221, 2349, 7944, 102]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    token_ids_s2e 中多了 101 和 102

    sequence1 = tokenizer.decode(token_ids)
    print(sequence1)
    
    sequence2 = tokenizer.decode(token_ids_s2e)
    print(sequence2)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    输出结果:

    法 国 的 首 都 是 巴 黎
    [CLS] 法 国 的 首 都 是 巴 黎 [SEP]
    
    • 1
    • 2

    101 代表 CLS,是文本的开头
    102 代表 SEP,是文本的分隔符

    2. 编解码多段文本

    sequence_batch = ["法国的首都是巴黎","美国的首都是华盛顿特区" ]
    token_ids_batch = tokenizer.encode(sequence_batch)
    print(token_ids_batch)
    sequence_batch = tokenizer.decode(token_ids_batch)
    print(sequence_batch)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    输出结果:

    [101, 3791, 1744, 4638, 7674, 6963, 3221, 2349, 7944, 102, 5401, 1744, 4638, 7674, 6963, 3221, 1290, 4670, 7561, 4294, 1277, 102]
    [CLS] 法 国 的 首 都 是 巴 黎 [SEP] 美 国 的 首 都 是 华 盛 顿 特 区 [SEP]
    
    • 1
    • 2

    3. 实际操作

    embedding_batch = tokenizer("法国的首都是巴黎","美国的首都是华盛顿特区")
    print(embedding_batch)
    
    • 1
    • 2

    输出:

    {'input_ids': [101, 3791, 1744, 4638, 7674, 6963, 3221, 2349, 7944, 102, 5401, 1744, 4638, 7674, 6963, 3221, 1290, 4670, 7561, 4294, 1277, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
    
    • 1

    优化代码

    for key, value in embedding_batch.items():
        print(f"{key}: {value}\n")
    
    • 1
    • 2

    输出:

    input_ids: [101, 3791, 1744, 4638, 7674, 6963, 3221, 2349, 7944, 102, 5401, 1744, 4638, 7674, 6963, 3221, 1290, 4670, 7561, 4294, 1277, 102]
    
    token_type_ids: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    
    attention_mask: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编码后返回结果是:

    input_ids: token_ids
    token_type_ids: token_id 归属的句子编号
    attention_mask: 指示哪些token需要被关注(注意力机制)
    
    • 1
    • 2
    • 3

    4. 查看词表

    from itertools import islice
    
    # 使用 islice 查看词表部分内容
    for key, value in islice(tokenizer.vocab.items(), 30,40):
        print(f"{key}: {value}")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    输出结果:

    : 1388: 6607
    ##禀: 17937: 7751
    ing: 10139: 4002
    ##楼: 16574
    ##部: 20013
    ##针: 20208
    ##酥: 20046
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    学习软件测试要掌握什么基本知识?
    C++ | Leetcode C++题解之第174题地下城游戏
    【愚公系列】2022年10月 使用win11系统自带远程桌面,远程控制VMware虚拟机系统
    项目完成 - 基于Django3.x版本 - 开发部署小结
    中企绕道突破封锁,防不胜防 | 百能云芯
    Python读取hbase数据库
    秋招面试复盘-深信服
    7. SAP ABAP OData 服务如何支持 $orderby (排序)操作
    supervisor管理进程用法详解
    Python Faker库造伪数据
  • 原文地址:https://blog.csdn.net/weixin_40378209/article/details/136683294