one-hot 编码 - 使用
1 课程概览
本课演示如何加载已保存的词汇映射器(word_index 模型),对指定词汇进行 one-hot 编码。通过加载模型、查看词汇索引对应关系、创建零列表、修改对应位置为 1,完成 one-hot 编码的使用流程。同时指出词汇不在映射器中会报错的问题。
2 核心概念与定义
- 词汇映射器加载:使用
joblib.load()加载之前保存的word_index模型,保证词汇索引固定不变。
3 模型与算法详解
one-hot 编码使用流程
- 加载模型:
joblib.load()加载词汇映射器 - 查看 word_index:打印词汇与索引的对应关系
- 选择目标词汇:指定要进行 one-hot 编码的词
- 创建零列表:长度等于 word_index 字典的长度
- 获取索引:从 word_index 中获取目标词的索引
- 修改值:将对应位置(索引 - 1)改为 1
- 打印结果:输出该词的 one-hot 编码
索引固定性
- 保存模型后,无论加载多少次,词汇索引固定不变
- 例如:"成龙"始终是索引 5,"微微"始终是索引 6
词汇不在映射器中的处理
- 若目标词汇不在 word_index 中,会报
KeyError错误 - 需确保使用的词汇在训练时已包含在词汇映射器中
4 数学原理与推导
one-hot 编码生成
给定已保存的词汇映射器 $W = {w_1: 1, w_2: 2, ..., w_n: n}$,对词汇 $w_i$:
$$\text{one-hot}(w_i) = [0, 0, ..., \underbrace{1}_{第\ (i-1)\ 位}, ..., 0]$$
列表长度为 $n$(词汇映射器中键值对数量)。
5 代码示例
import joblib
# 定义函数:使用 one-hot 编码
def dm02_use_one_hot():
# 1. 加载训练好的词汇映射器
word_index = joblib.load("model/word_index.model")
# 2. 打印词汇和索引的对应关系
print("词汇映射器:", word_index)
# 示例输出:{'快乐': 1, 'AI': 2, '学习': 3, '我': 4, '爱': 5, '使': 6, ',': 7}
# 3. 选择要进行 one-hot 编码的词汇
token = "学习"
# 4. 创建长度等于 word_index 字典长度的零列表
zero_list = [0] * len(word_index)
# 5. 获取指定词汇在 word_index 中的索引
# 索引从1开始,列表从0开始,需减1
index = word_index[token] - 1
# 6. 修改对应位置的值为1
zero_list[index] = 1
# 7. 打印结果
print(f"{token} 的 one-hot 编码:{zero_list}")
# 示例输出:学习 的 one-hot 编码:[0, 0, 1, 0, 0, 0, 0]
# 测试
if __name__ == "__main__":
dm02_use_one_hot()
错误处理示例
# 词汇不在映射器中会报错
token = "不存在的词"
index = word_index[token] # KeyError: '不存在的词'
6 重难点与易错提醒
- ❗重点:加载模型后,词汇索引固定不变,无论运行多少次结果一致。
- ⚠️易错:词汇不在 word_index 中会报
KeyError错误,需确保词汇在训练时已包含。 - ⚠️易错:索引从 1 开始,列表从 0 开始,修改位置时需
index - 1。 - 💡深入理解:使用流程与获取流程的区别——获取时需创建并保存词汇映射器,使用时直接加载即可。
7 课堂问答精选
Q1:为什么加载模型后词汇索引不变?
A:因为词汇映射器已保存为模型文件,每次加载的都是同一个模型,词汇与索引的对应关系固定不变。例如"成龙"始终是索引 5,"微微"始终是索引 6。
Q2:如果词汇不在 word_index 中会怎样?
A:会报 KeyError 错误,因为该词汇在训练词汇映射器时未被包含。需确保使用的词汇在训练时已存在。
Q3:one-hot 编码使用与获取的区别是什么?
A:获取时需要创建词汇映射器并保存模型(dm01),使用时只需加载已保存的模型(dm02),然后对指定词汇生成 one-hot 编码。
8 本课小结
- 使用流程:加载模型 → 查看 word_index → 选择词汇 → 创建零列表 → 获取索引 → 修改为 1 → 打印结果。
- 加载模型后词汇索引固定不变。
- 词汇不在映射器中会报
KeyError错误。 - 索引从 1 开始,列表位置需减 1。
9 延伸思考
- 如何处理词汇不在映射器中的情况(OOV, Out-of-Vocabulary)?
- 简单版 one-hot 编码实现方式是什么?(下节课介绍)