目录
2. encoding是什么?与tokenization什么关系?
在自然语言处理(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 包含更广:除了分词,还可能包括:
-
为 Token 分配唯一 ID(如
"Chat"
→15496
)。 -
添加特殊 Token(如 BERT 的
[CLS]
、[SEP]
)。 -
生成模型输入格式(如 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 模型)。