WordEmbedding 获取词向量
1 课程概览
本课演示使用 PyTorch 的 nn.Embedding 获取词向量,并通过 TensorBoard 进行可视化。以两句话为例,进行分词、合并去重、构建词汇表、获取词向量,最终实现词向量的可视化展示。
2 核心概念与定义
- nn.Embedding:PyTorch 中的词嵌入层,将词汇索引映射为稠密词向量。
- Tokenizer(分词器):Keras 提供的文本分词工具,用于构建词汇表和转换文本。
- TensorBoard:TensorFlow/PyTorch 的可视化工具,用于展示词向量的 PCA 主成分分析图。
- PCA(Principal Component Analysis,主成分分析):降维可视化方法,将高维词向量投影到低维空间。
3 模型与算法详解
案例需求
对两句话进行分词、词向量化和可视化:
- "传智教育是一家上市公司,旗下有黑马程序员品牌"
- "我爱自然语言处理"
处理流程
- 分词:对两句话进行切词
- 合并去重:将两句话的词合并并去重,得到 20 个单词
- 构建词汇表:使用 Tokenizer 构建词到索引的映射
- 获取词向量:使用 nn.Embedding 将索引转为词向量
- 可视化:使用 TensorBoard 展示词向量
词向量形状
- 词汇量:20 个词
- 嵌入维度:8 维
- 词向量矩阵形状:$20 \times 8$
TensorBoard 可视化效果
- 展示 20 个词的 PCA 主成分分析图
- 点击某个词(如"黑马"),显示近邻点
- 显示每个近邻点与目标词的距离
4 数学原理与推导
nn.Embedding 权重矩阵
$$W \in \mathbb{R}^{V \times d} = \mathbb{R}^{20 \times 8}$$
其中 $V=20$ 为词汇量,$d=8$ 为嵌入维度。
词向量获取
给定词索引 $i$,其词向量为:
$$\text{WordVector}(w_i) = W[i, :] \in \mathbb{R}^{8}$$
PCA 降维
将 8 维词向量降维到 2D 或 3D 进行可视化:
$$\text{PCA}: \mathbb{R}^{8} \rightarrow \mathbb{R}^{2}$$
5 代码示例
import torch
import torch.nn as nn
from torch.utils.tensorboard import SummaryWriter
from tensorflow.keras.preprocessing.text import Tokenizer
# 1. 准备两句话
sentence1 = "传智教育 是 一家 上市公司 旗下 有 黑马 程序员 品牌"
sentence2 = "我 爱 自然语言 处理"
# 2. 分词并合并去重
tokens1 = sentence1.split()
tokens2 = sentence2.split()
all_tokens = tokens1 + tokens2 # 合并
# 3. 构建词汇表
my_tokenizer = Tokenizer()
my_tokenizer.fit_on_texts(all_tokens)
my_token_list = list(my_tokenizer.word_index.keys())
print("词汇表:", my_token_list) # 20个词
# 4. 创建词嵌入层
# 20个词,每个用8维向量表示
embed = nn.Embedding(
num_embeddings=len(my_token_list) + 1, # +1 因为索引从1开始
embedding_dim=8
)
print("权重矩阵形状:", embed.weight.data.shape) # [21, 8]
# 5. 获取词向量
word_vectors = embed.weight.data
print("词向量矩阵:", word_vectors)
# 6. TensorBoard 可视化
# 6.1 创建写入器
my_summary = SummaryWriter(log_dir="./runs")
# 6.2 添加词向量到 TensorBoard
my_summary.add_embedding(
embed.weight.data, # 词向量矩阵
metadata=my_token_list # 词列表(用于标注)
)
# 6.3 关闭写入器
my_summary.close()
# 7. 查看每个单词的词向量
for index in range(len(my_token_list)):
# 7.1 获取当前单词的词向量
word_vector = embed(torch.tensor(index))
print(f"词向量: {word_vector}")
# 7.2 获取当前索引对应的单词
word = my_token_list[index]
print(f"单词: {word}")
运行 TensorBoard
# 启动 TensorBoard
tensorboard --logdir=./runs
# 在浏览器访问 http://localhost:6006
6 重难点与易错提醒
- ❗重点:使用
nn.Embedding获取词向量是核心操作,需掌握。 - ❗重点:词向量矩阵形状为 $V \times d$(词汇量 × 嵌入维度)。
- ⚠️易错:Tokenizer 的
word_index索引从 1 开始,需注意 +1 处理。 - 💡深入理解:TensorBoard 可视化使用 PCA 降维,将高维词向量投影到 2D/3D。
- 💡深入理解:词向量可视化部分为了解内容,但获取词向量的代码需掌握。
7 课堂问答精选
Q1:如何使用 nn.Embedding 获取词向量?
A:创建 nn.Embedding(num_embeddings=V, embedding_dim=d),其中 V 为词汇量,d 为嵌入维度。通过 embed.weight.data 获取词向量矩阵,形状为 $V \times d$。
Q2:TensorBoard 可视化的效果是什么?
A:展示词向量的 PCA 主成分分析图,每个点代表一个词。点击某个词会显示其近邻点及距离,用于分析词与词之间的相似度。
Q3:两句话合并去重后有多少个词?
A:两句话合并去重后共 20 个词。第一个句子和第二个句子可以有重复词(如"我"),但去重后保留一个。
8 本课小结
- 使用
nn.Embedding(num_embeddings, embedding_dim)创建词嵌入层。 - 词向量矩阵形状:$V \times d$(如 $20 \times 8$)。
- Tokenizer 构建词汇表,
word_index索引从 1 开始。 - TensorBoard 可视化:PCA 降维展示词向量,查看近邻点。
- 获取词向量代码需掌握,可视化部分为了解内容。
9 延伸思考
- 如何通过 TensorBoard 分析词与词之间的语义关系?
- 词向量的维度(dim)如何选择?