【学习笔记】为什么需要 encoding?

目录

1. Token 是什么?

2. encoding是什么?与tokenization什么关系?

3.为什么必须用 encoding?

4. 具体场景示例

5. 常用编码器

6. 如果不使用编码会怎样?

7. 代码对比:有 vs 无

总结

在自然语言处理(NLP)中,encoding(编码) 是将文本转换为模型能够理解的数字表示(即 Token)的关键步骤。


1. Token 是什么?

  • Token 是文本的最小语义单元,可能是单词、子词(subword)或字符。

    • 例如:"unhappy" 可能被拆分为 ["un", "happy"](子词分词)。

  • 不同的模型使用不同的分词规则(如 GPT 使用 BPE 算法,BERT 使用 WordPiece),因此需要对应的编码器。


2. 与Tokenization什么关系?

  • 核心区别

概念定义输入 → 输出示例
Tokenization(分词)将原始文本拆分为离散的语义单元(Token)的过程。文本 → Token 列表"ChatGPT is powerful!" → ["Chat", "G", "PT", " is", " powerful", "!"]
Encoding(编码)将 Token 转换为模型可理解的数字形式(如 ID 或向量),可能包含分词和后续处理。文本 → 数字序列(或向量序列)"ChatGPT" → [15496, 11, 1917] → 进一步映射为向量 [[0.3, -0.7, ...], ...]

  • 关系详解

(1) Tokenization 是 Encoding 的子集

  • Tokenization 仅负责拆分文本:确定如何将文本切割为 Token(如按空格、子词规则等)。

  • Encoding 包含更广:除了分词,还可能包括:

    1. 为 Token 分配唯一 ID(如 "Chat" → 15496)。

    2. 添加特殊 Token(如 BERT 的 [CLS][SEP])。

    3. 生成模型输入格式(如 attention mask、positional encoding)。

(2) 不同框架的术语差异

  • 在部分工具库中

    • tokenization 可能仅指分词步骤

    • encoding 指分词 + 转换为 ID 的全流程。

    • 示例(Hugging Face Transformers 库)

      from transformers import AutoTokenizer
      
      tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
      text = "Hello, world!"
      
      # Tokenization(纯分词)
      tokens = tokenizer.tokenize(text)  # ["hello", ",", "world", "!"]
      
      # Encoding(分词 + 转 ID + 添加特殊 Token)
      encoded_input = tokenizer.encode(text)  # [101, 7592, 1010, 2088, 999, 102]
  • 场景对比

场景 1:仅使用 Tokenization

  • 目的:分析文本结构或统计词频。

  • 示例

    import nltk
    text = "I love NLP!"
    tokens = nltk.word_tokenize(text)  # ["I", "love", "NLP", "!"]

场景 2:使用 Encoding

  • 目的:为模型准备输入。

  • 示例(OpenAI tiktoken 库)

    import tiktoken
    
    # 初始化编码器(隐含分词规则)
    encoding = tiktoken.get_encoding("cl100k_base")  # GPT-4 的分词方式
    
    # 一步完成:文本 → Token ID 序列
    text = "Hello, world!"
    token_ids = encoding.encode(text)  # [15496, 11, 1917]

  • 总结

    • 严格定义

      • Tokenization = 文本 → Token 列表。

      • Encoding = 文本 → 数字序列(通常包含分词 + 转 ID + 其他处理)。

    • 实际应用

      • 若仅需分词,用 tokenizer.tokenize()

      • 若需模型输入,用 tokenizer.encode() 或 encoding.encode()

3.为什么必须用 encoding

① 模型输入的要求
  • NLP 模型(如 GPT、BERT)只能处理数字化的输入,而不是原始文本。

  • encoding.encode(x) 的作用:将文本转换为模型接受的 Token ID 序列

    text = "Hello, world!"
    tokens = encoding.encode(text)  # 输出例如 [15496, 11, 1917]
② 准确计算 Token 数量
  • 直接统计字符或单词不准确

    • 字符数"Hello" 有 5 个字符,但可能只是一个 Token。

    • 单词数"don't" 是 1 个单词,但可能被拆分为 ["don", "'t"] 两个 Token。

  • 使用 encoding 能严格匹配模型的分词规则,确保后续处理(如模型输入长度限制)的准确性。

③ 跨语言和特殊符号处理
  • 语言差异:中文、日文等非空格分隔语言需要专用分词。

  • 特殊符号:表情符号 🔥、编程代码(如:print()) 等需要特殊处理。


4. 具体场景示例

案例:GPT 模型的 Token 限制
  • OpenAI 的 GPT-4 单次请求限制为 8,192 Tokens

  • 如果直接按空格分词:

    text = "ChatGPT is amazing!"
    word_count = len(text.split())  # 输出 3(错误,实际 Token 数可能是 4)
  • 使用 encoding 计算:

    token_count = len(encoding.encode(text))  # 输出 4(正确)
    • 避免因 Token 超限导致 API 调用失败


5. 常用编码器

  • OpenAI 的 tiktoken

    import tiktoken
    encoding = tiktoken.get_encoding("cl100k_base")  # GPT-4 的编码方式
  • Hugging Face 的 tokenizers

    from transformers import GPT2Tokenizer
    tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
    tokens = tokenizer.encode("Hello, world!")

6. 如果不使用编码会怎样?

  • 错误 1:Token 数统计不匹配模型实际输入,导致请求被拒绝。

  • 错误 2:文本被错误拆分,模型生成结果不可控(如截断关键信息)。

  • 错误 3:成本估算错误(API 按 Token 计费,1,000 Token ≈ $0.002)。


7. 代码对比:有 vs 无 <encoding>

❌ 错误方法:按空格统计单词
df["n_words"] = df.text.apply(lambda x: len(x.split()))
  • 问题:无法处理子词、标点、跨语言文本。

✅ 正确方法:使用 encoding 统计 Token
encoding = tiktoken.get_encoding("cl100k_base")  # GPT-4 的编码方式
df["n_tokens"] = df.text.apply(lambda x: len(encoding.encode(x)))
  • 结果:严格符合模型的分词规则,精准控制输入长度。


总结

  • encoding 是文本与模型之间的桥梁,确保文本以模型能理解的方式被处理。

  • 直接依赖字符或单词统计会引入错误,尤其是在处理复杂文本或跨语言场景时。

  • 始终使用与目标模型匹配的编码器(如 tiktoken 对应 OpenAI 模型)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值