不依赖第三方库实现Word Embedding,本质是手动完成词向量训练全流程:文本预处理、构建词汇表、生成Skip-gram上下文样本、定义前向传播(Sigmoid+点积)与反向更新逻辑,并用纯Python实现负采样与梯度更新。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

不依赖第三方库实现 Word Embedding,本质是手动完成词向量的训练流程:从文本预处理、构建词汇表、生成上下文样本,到定义并更新词向量。核心在于理解 Skip-gram 或 CBOW 的前向传播与梯度更新逻辑。下面以 Skip-gram + 负采样(Negative Sampling)为例,用纯 Python(仅用 math、random、collections)实现一个可运行的轻量级词嵌入模型。
1. 文本预处理与词汇表构建
目标是将原始句子转为整数索引序列,并筛选高频词、过滤低频词和停用词(可选)。
- 分词:按空格或简单标点切分,转小写,去掉空字符串
- 统计词频:用
Counter统计所有词出现次数 - 构建词表:保留出现次数 ≥
min_count的词,按频次降序排列;为UNK(未知词)预留索引 0 - 建立映射:
word2idx(词→索引)、idx2word(索引→词)
2. 生成 Skip-gram 训练样本
对每个中心词,提取其窗口内(如 ±2)的上下文词作为正样本;负样本从词频分布中按概率采样(常用一元分布的 3/4 次方做平滑)。
- 遍历句子中每个词(跳过首尾窗口边界),以该词为中心,收集左右
window_size内的词作为正样本 - 对每个正样本,随机采样
n_neg个负样本:先预计算每个词的采样概率(freq^(3/4)归一化),再用轮盘赌法或别名采样(简易版可用random.choices配合权重) - 每条样本格式为:
(center_idx, context_idx, label),其中label=1为正,label=0为负
3. 初始化与前向传播(Sigmoid + 点积)
维护两组向量:输入层 W(vocabulary_size × embedding_dim),输出层 W'(vocabulary_size × embedding_dim)。Skip-gram 中,中心词查 W 得向量 v_c,上下文词查 W' 得 v_w,预测得分 = v_c ⋅ v_w,再经 Sigmoid 得概率。
立即学习“Python免费学习笔记(深入)”;
- 初始化
W和W':用小随机数(如uniform(-0.5/dim, 0.5/dim))避免对称性 - Sigmoid 函数需手写:
def sigmoid(x): return 1 / (1 + math.exp(-max(-50, min(50, x)))(防溢出) - 前向输出:
score = sum(v_c[i] * v_w[i] for i in range(dim))→prob = sigmoid(score)
4. 手动反向传播与参数更新
使用二元交叉熵损失:L = −[y·log(p) + (1−y)·log(1−p)]。对正样本(y=1),梯度为 (p−1);对负样本(y=0),梯度为 p。据此更新两个向量:
- 令
g = prob - label(即误差信号) - 更新中心词向量:
W[center_idx][i] -= lr * g * W_prime[context_idx][i] - 更新上下文词向量:
W_prime[context_idx][i] -= lr * g * W[center_idx][i] - 学习率
lr建议初始设为 0.025,并随训练步数线性衰减
整个过程不调用 NumPy 或 PyTorch,全部用原生 Python 列表与循环实现。虽然效率较低(适合小语料、教学演示),但能清晰暴露词向量如何通过局部共现被“拉近”,以及负采样如何缓解 softmax 归一化的计算瓶颈。关键不是代码多短,而是每一步都对应着 NLP 表征学习的本质动机。


















