Word2Vec(理论、公式和代码)

Word2Vec是一种解决词袋模型局限性的文本表示技术,通过学习词向量捕捉词间语义关系。文章介绍了Skip-Gram模型和CBOW架构,并展示了Python中gensim库的实现及其在NLP任务中的应用。

Word2Vec是一种广泛使用的文本表示技术,可以将词汇表中的每个词转换为一个高维空间中的向量。这些词向量能够捕捉词之间的语义关系,如同义词或语境上相似的词会在向量空间中彼此接近。

提出契机

Word2Vec的提出主要是为了解决传统的词袋模型(Bag of Words)等文本表示方法中无法有效捕捉词之间语义关系的问题。词袋模型将文本表示为词频的向量,这种表示忽略了词序和词之间的语义关系。Word2Vec通过学习词的向量表示,能够捕捉到更加细致的语义信息,并在诸如文本相似性、文本聚类、情感分析等任务中取得了显著的改进。

理论与公式

Word2Vec有两种架构:连续词袋(CBOW)和Skip-Gram。CBOW预测目标词基于上下文词,而Skip-Gram正好相反,它预测上下文词基于目标词。

Skip-Gram模型

Skip-Gram模型的目标是最大化给定目标词的条件下上下文词的出现概率,即最大化下面的目标函数:

L=1T∑t=1T∑−c≤j≤c,j≠0log⁡p(wt+j∣wt)L = \frac{1}{T} \sum_{t=1}^{T} \sum_{-c \leq j \leq c, j \neq 0} \log p(w_{t+j}|w_t)L=T1t=1Tcjc,j=0logp(wt+jwt)

其中,TTT是文本中的词汇总数,ccc是上下文大小,wtw_twt是目标词,wt+jw_{t+j}wt+j是上下文词。p(wt+j∣wt)p(w_{t+j}|w_t)p(wt+jwt)通常使用softmax函数来计算:

p(wO∣wI)=exp⁡(vwO′TvwI)∑w=1Wexp⁡(vw′TvwI)p(w_O|w_I) = \frac{\exp({v'_{w_O}}^T v_{w_I})}{\sum_{w=1}^{W} \exp({v'_{w}}^T v_{w_I})}p(wOwI)=w=1Wexp(vwTvwI)exp(vwOTvwI)

这里,vwIv_{w_I}vwIvwO′v'_{w_O}vwO分别是输入词wIw_IwI和输出词wOw_OwO的向量表示,WWW是词汇表的大小。

代码实现

以下是使用Python中的gensim库来实现Word2Vec模型的示例代码。这个例子假设你已经有了一些预处理过的文本数据。

首先,确保安装了gensim

pip install gensim

接下来,是Word2Vec模型的训练代码:

from gensim.models import Word2Vec
from gensim.utils import simple_preprocess

# 假设`documents`是已经预处理过的文本数据:一个文本列表
# 使用simple_preprocess进行简单的预处理。实际应用中可能需要更复杂的预处理
processed_docs = [simple_preprocess(doc) for doc in documents]

# 训练Word2Vec模型
model = Word2Vec(sentences=processed_docs, vector_size=100, window=5, min_count=2, workers=4)

# 保存模型以便未来使用
model.save("word2vec.model")

# 使用模型
vector = model.wv['example']  # 获取单词"example"的向量表示
similar_words = model.wv.most_similar('example')  # 找到与"example"最相似的词汇

这段代码首先对文本数据进行了预处理,然后使用Word2Vec函数训练模型。vector_size参数指定向量的维度,window指定了上下文窗口大小,min_count指定了最小词频阈值(即出现次数少于该值的单词会被忽略),workers参数用于设置训练时的线程数,以加快训练速度。

在训练完成后,可以使用model.save方法将模型保存到磁盘上,以便将来使用。你可以通过访问model.wv[word]来获取任何单词的向量表示。most_similar方法可以用来查找与给定单词最相似的词汇。

值得注意的是,gensim的Word2Vec实现提供了丰富的参数来调整模型,如sg(定义使用的训练算法,0表示CBOW,1表示Skip-Gram)、hs(如果为1,则使用层次softmax进行训练,如果为0且负采样negative不为0,则使用负采样)、negative(负采样中的噪声词的数量)等。这些参数可以根据具体的任务和数据集进行调整。

还可以利用预训练的Word2Vec模型,这在处理小数据集或希望利用在更大语料库上学到的语义信息时非常有用。gensim提供了一些预训练模型的接口,例如可以直接加载谷歌的预训练Word2Vec模型:

from gensim.models import KeyedVectors

# 加载预训练的Word2Vec模型
model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)

# 现在可以使用这个模型来获取词向量或者计算相似度等

请确保你有足够的内存来加载预训练的模型,因为这些模型通常很大。例如,谷歌的预训练模型就有3GB大小。

通过使用Word2Vec,我们可以将词转换为向量,这些向量能够在多维空间中表达词之间的语义关系。这种技术已经被广泛应用于各种自然语言处理任务中,如文本分类、情感分析、机器翻译等,大大提高了这些任务的性能。

<think>嗯,用户这次在询问word2vec算法的伪代码,看来是对自然语言处理中的词嵌入技术感兴趣。之前用户提供了几个引用资料,但都是关于反向传播、光线投射延迟接受算法的,当前需求关联不大。用户可能是机器学习从业者或学生,正在实现词向量模型。从ta明确要求“pseudocode”来看,可能需要具体实现参考而非理论推导。考虑到word2vec有两个主要变体(Skip-gramCBOW),最好都提供核心伪代码框架。word2vec的核心确实基于神经网络反向传播,这点可以关联引用[1]提到的BP算法。不过用户更关注算法流程而非数学证明,所以伪代码应聚焦网络结构、负采样等关键步骤。准备采用带中文注释的简略伪代码,避免涉及复杂公式。要注意区分原始版本优化技巧。用户没指定使用哪种变体,所以将分别展示Skip-gramCBOW的基本流程。最后列出相关参考链接便于用户验证。</think> 以下是**Word2Vec算法**的核心伪代码框架(以Skip-gram模型为例),结合神经网络负采样优化: ```python # 输入: 语料库 corpus, 词向量维度 d, 上下文窗口大小 window, 负采样数 k 初始化输入矩阵 W_in (|V|×d) 输出矩阵 W_out (d×|V|) # |V|为词汇表大小 for epoch in range(总迭代次数): for target_word, context_word in 滑动窗口(corpus, window): # 正样本 (target_word, context_word) pos_loss = 0 # 负样本: 随机采样k个非上下文词 neg_samples = 随机采样(k, 非上下文词) # 1. 正向传播 h = W_in[target_word] # 输入词向量 (1×d) pos_score = sigmoid(dot(h, W_out[:, context_word])) neg_scores = [sigmoid(-dot(h, W_out[:, neg])) for neg in neg_samples] # 2. 计算损失 (交叉熵) pos_loss = -log(pos_score) neg_loss = -sum(log(score) for score in neg_scores) total_loss = pos_loss + neg_loss # 3. 反向传播更新权重 grad_pos = (pos_score - 1) * h # 正样本梯度 for neg in neg_samples: grad_neg = neg_scores[neg] * h # 负样本梯度 W_out[:, neg] -= lr * grad_neg # 更新负样本输出向量 W_out[:, context_word] -= lr * grad_pos # 更新正样本输出向量 W_in[target_word] -= lr * ( (pos_score-1)*W_out[:,context_word] + sum(neg_scores[i]*W_out[:,neg] for i,neg in enumerate(neg_samples)) ) ``` ### 关键步骤说明 1. **滑动窗口** 遍历语料时对每个中心词`target_word`,取其前后`window`大小内的词作为上下文`context_word` 2. **负采样优化** 对每个正样本`(target, context)`,采样`k`个非上下文词构造负样本,加速训练[^1] 3. **向量更新** - 输入矩阵 `W_in` 存储词向量(行对应词索引) - 输出矩阵 `W_out` 用于计算上下文概率 - 通过`sigmoid(dot(h, W_out[:, j]))`计算词j出现在上下文的概率 ### 变体说明 1. **CBOW (Continuous Bag-of-Words)** ```python h = average(W_in[context_words]) # 上下文词向量平均 ``` 2. **分层Softmax** 用霍夫曼树替代负采样,树节点存向量,通过路径概率计算输出[^2] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值