RNN做中文分词
一、中文分词的本质:寻找词边界
中文与英文不同,词与词之间没有空格分隔。分词就是要在连续的字符流中找出正确的词边界。 示例:
- 原始文本:
"自然语言处理很有趣"
- 正确分词:
"自然/语言/处理/很/有趣"
- 错误分词:
"自然语言/处理/很有/趣"
(不合理)
分词的核心是判断每个字符是否是词的边界。
二、序列标注:将分词转化为标签预测
最常用的分词标注方案是 BIOES 标签体系:
- B(Begin):词的开始
- I(Inside):词的中间
- E(End):词的结束
- S(Single):单字成词
- O(Outside):通常用于命名实体识别,分词中很少用
示例:
- 文本:
"我爱北京天安门"
- 分词:
"我/爱/北京/天安门"
- 对应标签:
['S', 'S', 'B', 'E', 'B', 'I', 'E']
分词任务就变成了:给每个字符预测一个 BIOES 标签。
三、RNN 如何处理序列数据?
循环神经网络(RNN)的核心优势是处理序列中的时序依赖。在中文分词中,每个字符的标签不仅取决于自身,还与前后文相关。
1. 字符表示:从文字到向量
每个中文字符需要先转换为数字向量(Embedding):
- 例如,使用预训练词向量(如 Word2Vec)或随机初始化向量。
- 假设每个字符用 100 维向量表示:
我
→[0.1, 0.3, -0.2, ..., 0.5]
(100 个浮点数)
2. RNN 的工作流程
RNN 通过循环结构依次处理序列中的每个元素,并维护一个隐藏状态(Hidden State):
- 输入:当前字符的向量(如
我
的向量)。 - 隐藏状态:综合当前输入和之前的历史信息。
- 输出:基于隐藏状态预测当前字符的标签。
公式简化:\(h_t = \tanh(W_h \cdot h_{t-1} + W_x \cdot x_t)\)
- \(x_t\):当前字符的向量(如
t=1
时是我
的向量)。 - \(h_{t-1}\):上一时刻的隐藏状态(初始为全零向量)。
- \(h_t\):当前时刻的隐藏状态,包含了当前字符和之前所有字符的信息。
3. 双向 RNN(Bi-RNN)
普通 RNN 只能看到左侧上下文(从左到右),而中文分词需要左右两侧的信息。 Bi-RNN 通过两个 RNN 分别处理正向和反向序列,然后合并信息:
- 正向 RNN:从
"我"
到"天"
,捕捉左侧上下文。 - 反向 RNN:从
"天"
到"我"
,捕捉右侧上下文。 - 合并:将两个隐藏状态拼接或加权求和。
四、用 RNN 预测标签的完整流程
让我们通过一个具体例子,演示 RNN 如何预测分词标签:
1. 输入准备
- 文本:
"中国北京"
- 字符索引:
[2, 3, 4, 5]
(假设中=2
,国=3
,北=4
,京=5
) - 真实标签:
['B', 'E', 'B', 'E']
→ 转换为索引[0, 2, 0, 2]
(假设B=0
,I=1
,E=2
,S=3
)
2. 模型结构
- 嵌入层:将字符索引映射到向量(如 100 维)。
- Bi-LSTM 层:双向 LSTM 提取上下文特征,输出每个字符的隐藏状态(如 200 维)。
- 全连接层:将隐藏状态映射到标签空间(4 维,对应 BIOES)。
- Softmax 层:将输出转换为概率分布。
3. 前向传播过程
plaintext
输入序列:"中" "国" "北" "京"
↓ ↓ ↓ ↓
嵌入层 → Bi-LSTM → 全连接 → Softmax → 预测标签
↓ ↓ ↓ ↓ ↓
[2] [3] [4] [5] ['B', 'E', 'B', 'E']
4. 关键细节:隐藏状态的传递
-
时刻 t=1(处理 "中"):
- 正向 LSTM:接收
"中"
的向量和初始隐藏状态(全零),输出h1_fwd
。 - 反向 LSTM:接收
"京"
的向量和初始隐藏状态(全零),输出h1_bwd
。 - 合并:
h1 = [h1_fwd; h1_bwd]
(拼接两个向量)。 - 预测:
h1
通过全连接层和 Softmax,得到"中"
的标签概率分布(如P(B)=0.9, P(I)=0.05, P(E)=0.03, P(S)=0.02
),预测为B
。
- 正向 LSTM:接收
-
时刻 t=2(处理 "国"):
- 正向 LSTM:接收
"国"
的向量和h1_fwd
,输出h2_fwd
。 - 反向 LSTM:接收
"北"
的向量和初始隐藏状态,输出h2_bwd
。 - 合并:
h2 = [h2_fwd; h2_bwd]
。 - 预测:得到
"国"
的标签概率分布,预测为E
。
- 正向 LSTM:接收
以此类推,直到处理完所有字符。
五、CRF 层:解决标签依赖问题
RNN 直接预测每个字符的标签时,会忽略标签之间的约束关系(如B
后不能接B
)。条件随机场(CRF)层可以解决这个问题:
1. CRF 的作用
- 学习标签转移概率:例如,
B→E
的概率很高,而B→B
的概率极低。 - 全局最优:选择整体概率最高的标签序列,而非独立预测每个标签。
2. 标签转移矩阵
CRF 会学习一个K×K
的矩阵(K
是标签数量,如 4),其中M[i,j]
表示从标签i
转移到标签j
的得分。 示例:
plaintext
B I E S
B -10 -5 3 -8 # B→E得分高,B→B得分极低
I -2 2 5 -9
E 4 -7 -9 3
S 5 -8 -6 -9
3. 最终预测
结合 RNN 的输出和 CRF 的转移矩阵,使用维特比算法(Viterbi Algorithm)找到最优标签序列。
六、训练过程与损失函数
1. 数据准备
- 收集大量已分词的文本,转换为字符 - 标签对。
- 划分训练集、验证集和测试集。
2. 损失函数
- 无 CRF 层:使用交叉熵损失(Cross-Entropy Loss),对每个字符的标签预测独立计算损失。
- 有 CRF 层:使用 CRF 损失函数,直接优化整个标签序列的概率。
3. 优化过程
- 通过反向传播更新模型参数(嵌入层、LSTM 权重、全连接层权重、CRF 转移矩阵)。
- 使用优化器(如 Adam)最小化损失函数。
七、优缺点与实际应用
优点
- 上下文感知:能利用长距离上下文信息,对歧义分词效果好(如 “网球和拍” vs “网球 / 和 / 拍”)。
- 端到端学习:无需人工特征,自动从数据中学习分词模式。
- 适应性强:对未登录词(如新词汇 “区块链”)的处理优于基于词典的方法。
缺点
- 计算效率低:RNN 的循环结构难以并行化,训练和推理速度较慢。
- 长序列处理有限:对于超长文本,LSTM 仍可能无法捕捉远距离依赖。
实际应用
- 中文 NLP 基础工具(如 jieba 分词的深度学习版本)。
- 搜索引擎、机器翻译、聊天机器人等系统的前置处理步骤。
总结:RNN 中文分词的核心逻辑
- 序列标注:将分词问题转化为给每个字符分配 BIOES 标签的任务。
- Bi-RNN:通过双向循环神经网络捕捉字符的左右上下文信息。
- CRF 层:引入标签间的约束关系,确保预测的标签序列合法。
- 端到端训练:通过最小化损失函数,让模型自动学习分词模式。