在自然语言处理(NLP)领域,词向量(Word Embedding)是将文本转换为数值向量的核心技术。它能让计算机“理解”词语的语义关联,例如“国王”和“女王”的向量差可能与“男人”和“女人”的向量差相似。而Word2Vec作为经典的词向量训练模型,其核心思想是通过上下文预测目标词(或反之)。本文将以 --CBOW(连续词袋模型)为例,带你从代码到原理,一步步实现一个简单的词向量训练过程。
一、CBOW模型简介
CBOW(Continuous Bag-of-Words)是Word2Vec的两种核心模型之一。其核心思想是:给定目标词的上下文窗口内的所有词,预测目标词本身。例如,对于句子“We are about to study”,若上下文窗口大小为2(即目标词左右各取2个词),则当目标词是“about”时,上下文是“We, are, to, study”,模型需要根据这4个词预测出“about”。
CBOW的优势在于通过平均上下文词向量来预测目标词,计算效率高;缺点是对低频词不友好。本文将实现的CBOW模型包含词嵌入层、投影层和输出层,最终输出目标词的概率分布。
二、环境准备与数据预处理
2.1 进度条库安装
pip install torch numpy tqdm
2.2 语料库与基础设置
我们使用一段英文文本作为语料库,并定义上下文窗口大小(CONTEXT_SIZE=2,即目标词左右各取2个词):
CONTEXT_SIZE = 2 # 上下文窗口大小(左右各2个词)
raw_text = """We are about to study the idea of a computational process.
Computational processes are abstract beings that inhabit computers.
As they evolve, processes manipulate other abstract things called data.
The evolution of a process is directed by a pattern of rules
called a program. People create programs to direct processes. In effect,
we conjure the spirits of the computer with our spells.""".split() # 按空格分割成单词列表
2.3 构建词汇表与映射
为了将文本转换为模型可处理的数值,需要先构建词汇表(所有唯一词),并为每个词分配唯一索引:
vocab = set(raw_text) # 去重后的词汇表(集合)
vocab_size = len(vocab) # 词汇表大小(本文示例中为49)
# 词到索引的映射(如:"We"→0,"are"→1)
word_to_idx = {
word: i for i, word in enumerate(vocab)}
# 索引到词的反向映射(如:0→"We",1→"are")
idx_to_word = {
i: word for i, word in enumerate(vocab)}
三、生成训练数据:上下文-目标词对
CBOW的训练数据是“上下文词列表”与“目标词”的配对。例如,若目标词是raw_text[i],则上下文是[raw_text[i-2], raw_text[i-1], raw_text[i+1], raw_text[i+2]](假设窗口大小为2)。
3.1 数据生成逻辑
通过遍历语料库,跳过前CONTEXT_SIZE和后CONTEXT_SIZE个词(避免越界),生成上下文-目标词对:
data = []
fo

最低0.47元/天 解锁文章
1583

被折叠的 条评论
为什么被折叠?



