1. 大语言模型与分词基础
大语言模型(LLM)的核心在于对自然语言的理解与生成,而这一切的基础始于分词(Tokenization)。作为NLP处理流程的第一步,分词的质量直接影响后续文本表示和模型训练的效果。
在传统NLP处理流程中,文本数据需要经过以下关键步骤:
- 分词:将原始文本切分为有意义的单元
- 文本表示:将分词结果转化为数值向量
- 模型训练:将向量输入各类序列模型进行训练
分词策略的选择需要考虑语言特性。英文有天然的空格分隔,而中文则需要更复杂的切分策略。现代大模型如GPT、BERT都采用子词(subword)分词策略,这能有效平衡词表大小与语义表达能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. NLP任务与技术演进
2.1 核心NLP任务分类
2.1.1 文本分类
对整段文本进行类别判断,典型应用包括:
- 情感分析(判断评论的正负面)
- 垃圾邮件识别
- 新闻主题分类
技术实现上,这相当于对句子级别的特征向量进行分类。早期使用朴素贝叶斯、SVM等算法,现在主要使用深度学习模型。
2.1.2 序列标注
对文本中的每个词/字打标签,典型应用是命名实体识别(NER),用于识别文本中的人名、地名、组织机构名等实体。
实现流程:
- 对文本进行分词
- 对每个token进行分类标注
- 合并连续的同类标签形成完整实体
2.1.3 文本生成
根据输入内容生成新文本,应用场景包括:
- 自动写作
- 对话系统
- 摘要生成
技术实现采用自回归方式:
- 输入提示词(prompt)
- 预测下一个token
- 将预测结果追加到输入中
- 重复预测直到生成完整文本
2.2 NLP技术发展历程
2.2.1 基于规则的方法(1950s-1980s)
早期NLP完全依赖人工制定的语言规则,使用if-else条件和正则表达式处理文本。这种方法需要大量语言学知识,且难以覆盖语言的变化和例外情况。
典型问题:
- 规则冲突难以协调
- 新词、网络用语无法识别
- 需要持续维护更新规则库
2.2.2 统计方法阶段(1990s)
随着计算能力提升和语料积累,统计方法开始主导NLP领域。主要技术包括:
- N-gram语言模型
- 隐马尔可夫模型(HMM)
- 最大熵模型
以2-gram为例,其核心思想是根据前一个词预测下一个词的概率:
code复制P(w_i|w_{i-1}) = count(w_{i-1}w_i)/count(w_{i-1})
2.2.3 机器学习阶段(2000s)
机器学习算法如SVM、决策树、CRF等在NLP任务中表现出色。这一阶段的关键突破是:
- 特征工程自动化程度提高
- 模型泛化能力增强
- 准确率显著提升
文本表示主要采用词袋模型(BoW),但存在忽略词序的问题。改进方案包括:
- 引入n-gram特征
- 使用TF-IDF加权
- 添加词性等语言学特征
2.2.4 深度学习阶段(2010s至今)
深度学习彻底改变了NLP领域,主要进展包括:
- 词向量(Word2Vec、GloVe)
- 循环神经网络(RNN/LSTM/GRU)
- Transformer架构
- 预训练语言模型(BERT/GPT)
当前最先进的大语言模型都基于Transformer架构,通过海量数据预训练获得强大的语言理解和生成能力。
3. 分词策略详解
3.1 英文分词方法
3.1.1 词级分词(Word-level)
最简单的分词方式,以空格和标点为分隔符。例如:
code复制"ChatGPT is amazing!" → ["ChatGPT", "is", "amazing", "!"]
主要问题:
- 未登录词(OOV)问题严重
- 无法处理形态变化(如run/running/ran)
- 词表膨胀(需要存储所有词形)
3.1.2 字符级分词(Character-level)
以单个字符为单位:
code复制"hello" → ["h","e","l","l","o"]
优势:
- 词表极小(通常<256)
- 几乎不存在OOV问题
劣势:
- 序列过长
- 语义信息分散
- 模型训练难度大
3.1.3 子词级分词(Subword-level)
平衡方案,将词拆分为有意义的子单元。例如:
code复制"unhappiness" → ["un","happiness"]
优势对比:
| 指标 | 词级 | 字符级 | 子词级 |
|---|---|---|---|
| 词表大小 | 大 | 极小 | 中等 |
| OOV问题 | 严重 | 无 | 轻微 |
| 序列长度 | 短 | 极长 | 中等 |
| 语义保留 | 好 | 差 | 优秀 |
3.2 中文分词特点
中文没有天然分隔符,主要分词方式:
-
基于词典的方法
- 正向/逆向最大匹配
- 需要高质量词典
- 无法识别新词
-
基于统计的方法
- 计算字符共现概率
- 可识别未登录词
- 需要大量训练数据
-
混合方法
- 结合词典与统计信息
- 平衡准确率与召回率
现代中文大模型普遍采用子词分词,通过BPE等算法自动学习高频字组合,如:
code复制"自然语言处理" → ["自然","语言","处理"]
4. 主流分词算法实现
4.1 BPE算法实现
Byte Pair Encoding (BPE) 是一种数据压缩算法,后被应用于分词。核心思想是迭代合并最高频的字节对。
4.1.1 算法步骤
- 初始化:将所有字符作为基础词元
- 统计所有相邻词元对的频率
- 合并频率最高的词元对
- 重复步骤2-3直到达到目标词表大小
4.1.2 Python实现关键代码
python复制def train(self, corpus):
# 预处理:拆分为字符加结束符
processed = [[' '.join(char+'</w>' for char in sent)] for sent in corpus]
# 初始化词汇表
vocab = Counter(char for sent in processed for word in sent for char in word.split())
while len(vocab) < self.vocab_size:
# 统计相邻对频率
pairs = get_stats(processed)
if not pairs: break
# 合并最高频对
best_pair = max(pairs, key=pairs.get)
processed = merge_vocab(processed, best_pair)
# 更新词汇表
vocab = Counter(char for sent in processed for word in sent for char in word.split())
4.1.3 合并示例
假设语料中有以下词及其频率:
code复制l o w: 5
l o w e r: 2
n e w e s t: 6
w i d e s t: 3
第一次合并最高频对'e s'→'es'(共现6+3=9次),词表变为:
code复制l o w:5
l o w e r:2
n e w es t:6
w i d es t:3
4.2 WordPiece算法
WordPiece与BPE类似,但合并标准不是频率而是语言模型似然增益。
4.2.1 核心公式
合并score计算公式:
code复制score(a,b) = freq(a,b)/(freq(a)*freq(b))
选择使score最大的词元对进行合并。
4.2.2 与BPE的关键区别
- 合并标准:BPE看频率,WordPiece看似然增益
- 实现方式:WordPiece需要预训练语言模型
- 应用场景:BERT等模型使用WordPiece
4.3 Unigram语言模型分词
与BPE/WordPiece相反,Unigram从大词表开始逐步删减。
4.3.1 算法流程
- 初始化一个大词表(如所有常见词和子词)
- 计算当前词表下语料的似然
- 尝试删除每个词元,计算新似然
- 保留使似然下降最小的词表
- 重复直到达到目标词表大小
4.3.2 概率计算
假设词元独立出现,句子概率:
code复制P(s) = ∏ P(t_i)
通过EM算法优化词元概率。
5. 中文分词工具实践
5.1 jieba分词器
5.1.1 主要分词模式
-
精确模式:最常用,适合文本分析
python复制jieba.cut("我爱自然语言处理", cut_all=False) -
全模式:输出所有可能词
python复制jieba.cut("我爱自然语言处理", cut_all=True) -
搜索引擎模式:对长词再切分
python复制jieba.cut_for_search("自然语言处理很有趣")
5.1.2 自定义词典
添加新词:
python复制jieba.add_word("深度学习")
或加载词典文件:
python复制jieba.load_userdict("user_dict.txt")
词典文件格式:
code复制深度学习 10 n
机器学习 8 n
5.2 现代分词工具对比
| 工具 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| jieba | 基于词典 | 轻量、快速 | 传统NLP任务 |
| HanLP | 混合 | 功能全面 | 工业级应用 |
| SentencePiece | 子词 | 支持BPE/Unigram | 大模型预训练 |
| HuggingFace Tokenizers | 子词 | 与Transformers集成 | 预训练模型 |
6. 分词算法选择建议
-
英文文本处理:
- 预训练模型:使用配套分词器(如GPT用BPE)
- 传统任务:WordPiece或SentencePiece
-
中文文本处理:
- 大模型:子词分词(BPE变种)
- 短文本分析:jieba精确模式
- 专业领域:自定义词典+统计方法
-
多语言场景:
- 统一使用SentencePiece
- 设置合适的词表大小(通常32000-50000)
实际项目中,分词器的选择需要考虑:
- 语言特性
- 领域专业性
- 计算资源
- 与下游模型的兼容性
我在实际使用中发现,对于中文社交媒体文本,结合自定义词典的jieba分词效果优于直接使用BPE。而对于学术论文处理,SentencePiece训练的专用分词器能更好识别专业术语。
