主题
分词与词表
分词(Tokenization)是自然语言处理的首要步骤之一,它将原始文本拆分成可处理的最小语言单元(token),例如词、子词或字符。
词表(Vocabulary)则定义了模型能识别的 token 集合,是文本与向量表示之间的桥梁。
一、为什么需要分词
计算机无法直接理解自然语言中的连续字符。
例如输入句子:
我爱自然语言处理。
模型需要将其转换为离散单元,如:
txt
我 / 爱 / 自然语言处理 / 。
或在英文中:
txt
I / love / NLP / .
经过分词后,文本可映射为数字序列,方便模型计算与学习。
二、常见的分词方式
类型 | 说明 | 示例 |
---|---|---|
基于空格 | 英文常用,按空格分割 | "I love NLP" → ["I","love","NLP"] |
基于词典 | 中文常用,匹配最长词 | "南京市长江大桥" → ["南京市","长江大桥"] |
基于统计 | 根据词频与互信息学习新词 | 自动识别 "自然语言处理" |
基于子词(Subword) | 拆分为可组合的子单元,解决 OOV 问题 | "unbelievable" → "un"+"believ"+"able" |
三、常见子词算法
1. BPE(Byte Pair Encoding)
基于统计的合并规则。通过反复合并高频 token 对,生成稳定的子词表。
广泛用于 GPT、RoBERTa 等模型。
2. WordPiece
Google 提出的改进算法,用于 BERT 系列模型。
相比 BPE 更注重概率优化,使生成的子词更均衡。
3. SentencePiece
不依赖空格,直接作用于原始字节流。
支持 Unigram 与 BPE 模式,是多语言模型常用方案。
四、词表(Vocabulary)
词表定义了 token 与 ID 的映射关系:
Token | ID |
---|---|
[PAD] | 0 |
[CLS] | 1 |
我 | 2 |
爱 | 3 |
自然 | 4 |
词表的大小(vocab_size
)会影响模型性能与内存占用。
在中文中常用 20k~50k,英文常用 30k~60k。
五、实践示例(Python)
python
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
text = "我爱自然语言处理"
tokens = tokenizer.tokenize(text)
ids = tokenizer.convert_tokens_to_ids(tokens)
print(tokens)
print(ids)
输出示例:
txt
['我', '爱', '自然', '语言', '处理']
[2769, 4263, 704, 6421, 7032]
六、小结
- 分词是 NLP 的基础步骤,决定模型理解语言的粒度;
- 子词算法(如 BPE、WordPiece)有效解决 OOV 问题;
- 合理构建词表能平衡模型容量与泛化能力。