当前位置:   article > 正文

Python CBOW代码实战,CBOW代码超简单讲解和步骤拆解,Word2vec代码构建思路,CBOW代码实例_pythoncbow实战

pythoncbow实战

1.CBOW模型简介

        CBOW模型是一种用于自然语言处理的算法模型,全称为Continuous Bag-of-Words模型。它是一种词向量表示模型,用于将文本中的单词转换为密集向量表示,并捕捉单词之间的语义关系。

        CBOW模型的基本思想是通过上下文中的单词来预测目标单词。它通过将上下文单词的词向量求和,然后进行线性变换和非线性变换得到目标单词的表示。在这个过程中,模型会不断调整单词的词向量,使得它们能够更好地表达单词的语义信息。

        CBOW模型的训练过程基于大量的文本数据,通过最大化目标单词的概率来学习词向量的表示。在训练过程中,模型会根据上下文单词的词向量和目标单词的实际输出计算误差,然后通过反向传播算法来更新词向量的参数,使得误差不断减小。

        CBOW模型具有较快的训练速度和较小的模型大小,在很多自然语言处理任务中表现良好。它可以用于词义相似度计算、文本分类、语言模型等多个领域。通过学习到的词向量表示,CBOW模型能够将单词转换为连续的向量空间,从而丰富了单词的语义信息,提高了文本处理的效果。

        

2.CBOW代码实战

2.1定义一个句子列表,后面会用这些句子来训练 CBOW 和 Skip-Gram 模型 

  1. # 定义一个句子列表,后面会用这些句子来训练 CBOW 和 Skip-Gram 模型
  2. sentences = ["Kage is Teacher", "Mazong is Boss", "Niuzong is Boss",
  3. "Xiaobing is Student", "Xiaoxue is Student",]
  4. # 将所有句子连接在一起,然后用空格分隔成多个单词
  5. words = ' '.join(sentences).split()
  6. # 构建词汇表,去除重复的词
  7. word_list = list(set(words))
  8. # 创建一个字典,将每个词映射到一个唯一的索引
  9. word_to_idx = {word: idx for idx, word in enumerate(word_list)}
  10. # 创建一个字典,将每个索引映射到对应的词
  11. idx_to_word = {idx: word for idx, word in enumerate(word_list)}
  12. voc_size = len(word_list) # 计算词汇表的大小
  13. print(" 词汇表:", word_list) # 输出词汇表
  14. print(" 词汇到索引的字典:", word_to_idx) # 输出词汇到索引的字典
  15. print(" 索引到词汇的字典:", idx_to_word) # 输出索引到词汇的字典
  16. print(" 词汇表大小:", voc_size) # 输出词汇表大小

2.2 生成 CBOW 训练数据 

  1. # 生成 CBOW 训练数据
  2. def create_cbow_dataset(sentences, window_size=2):
  3. data = []# 初始化数据
  4. for sentence in sentences:
  5. sentence = sentence.split() # 将句子分割成单词列表
  6. for idx, word in enumerate(sentence): # 遍历单词及其索引
  7. # 获取上下文词汇,将当前单词前后各 window_size 个单词作为周围词
  8. context_words = sentence[max(idx - window_size, 0):idx] \
  9. + sentence[idx + 1:min(idx + window_size + 1, len(sentence))]
  10. # 将当前单词与上下文词汇作为一组训练数据
  11. data.append((word, context_words))
  12. return data
  13. # 使用函数创建 CBOW 训练数据
  14. cbow_data = create_cbow_dataset(sentences)
  15. # 打印未编码的 CBOW 数据样例(前三个)
  16. print("CBOW 数据样例(未编码):", cbow_data[:3])

2.3 定义 One-Hot 编码函数 

  1. # 定义 One-Hot 编码函数
  2. import torch # 导入 torch 库
  3. def one_hot_encoding(word, word_to_idx):
  4. tensor = torch.zeros(len(word_to_idx)) # 创建一个长度与词汇表相同的全 0 张量
  5. tensor[word_to_idx[word]] = 1 # 将对应词的索引设为 1
  6. return tensor # 返回生成的 One-Hot 向量
  7. # 展示 One-Hot 编码前后的数据
  8. word_example = "Teacher"
  9. print("One-Hot 编码前的单词:", word_example)
  10. print("One-Hot 编码后的向量:", one_hot_encoding(word_example, word_to_idx))

2.4 定义 CBOW 模型 

  1. # 定义 CBOW 模型
  2. import torch.nn as nn # 导入 neural network
  3. class CBOW(nn.Module):
  4. def __init__(self, voc_size, embedding_size):
  5. super(CBOW, self).__init__()
  6. # 从词汇表大小到嵌入大小的线性层(权重矩阵)
  7. self.input_to_hidden = nn.Linear(voc_size,
  8. embedding_size, bias=False)
  9. # 从嵌入大小到词汇表大小的线性层(权重矩阵)
  10. self.hidden_to_output = nn.Linear(embedding_size,
  11. voc_size, bias=False)
  12. def forward(self, X): # X: [num_context_words, voc_size]
  13. # 生成嵌入:[num_context_words, embedding_size]
  14. embeddings = self.input_to_hidden(X)
  15. # 计算隐藏层,求嵌入的均值:[embedding_size]
  16. hidden_layer = torch.mean(embeddings, dim=0)
  17. # 生成输出层:[1, voc_size]
  18. output_layer = self.hidden_to_output(hidden_layer.unsqueeze(0))
  19. return output_layer
  20. embedding_size = 2 # 设定嵌入层的大小,这里选择 2 是为了方便展示
  21. cbow_model = CBOW(voc_size,embedding_size) # 实例化 CBOW 模型
  22. print("CBOW 模型:", cbow_model)

2.5 训练 cbow 模型 

  1. # 训练 cbow 类
  2. learning_rate = 0.001 # 设置学习速率
  3. epochs = 1000 # 设置训练轮次
  4. criterion = nn.CrossEntropyLoss() # 定义交叉熵损失函数
  5. import torch.optim as optim # 导入随机梯度下降优化器
  6. optimizer = optim.SGD(cbow_model.parameters(), lr=learning_rate)
  7. # 开始训练循环
  8. loss_values = [] # 用于存储每轮的平均损失值
  9. for epoch in range(epochs):
  10. loss_sum = 0 # 初始化损失值
  11. for target, context_words in cbow_data:
  12. # 将上下文词转换为 One-Hot 向量并堆叠
  13. X = torch.stack([one_hot_encoding(word, word_to_idx) for word in context_words]).float()
  14. # 将目标词转换为索引值
  15. y_true = torch.tensor([word_to_idx[target]], dtype=torch.long)
  16. y_pred = cbow_model(X) # 计算预测值
  17. loss = criterion(y_pred, y_true) # 计算损失
  18. loss_sum += loss.item() # 累积损失
  19. optimizer.zero_grad() # 清空梯度
  20. loss.backward() # 反向传播
  21. optimizer.step() # 更新参数
  22. if (epoch+1) % 100 == 0: # 输出每 100 轮的损失,并记录损失
  23. print(f"Epoch: {epoch+1}, Loss: {loss_sum/len(cbow_data)}")
  24. loss_values.append(loss_sum / len(cbow_data))
  25. # 绘制训练损失曲线
  26. import matplotlib.pyplot as plt # 导入 matplotlib
  27. # 绘制二维词向量图
  28. plt.rcParams["font.family"]=['SimHei'] # 用来设定字体样式
  29. plt.rcParams['font.sans-serif']=['SimHei'] # 用来设定无衬线字体样式
  30. plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
  31. plt.plot(range(1, epochs//100 + 1), loss_values) # 绘图
  32. plt.title(' 训练损失曲线 ') # 图题
  33. plt.xlabel(' 轮次 ') # X 轴 Label
  34. plt.ylabel(' 损失 ') # Y 轴 Label
  35. plt.show() # 显示图

 2.6 输出 cbow 习得的词嵌入

  1. # 输出 cbow 习得的词嵌入
  2. print("CBOW 词嵌入:")
  3. for word, idx in word_to_idx.items(): # 输出每个词的嵌入向量
  4. print(f"{word}: {cbow_model.input_to_hidden.weight[:,idx].detach().numpy()}")

 

2.7 向量可视化看一下

  1. fig, ax = plt.subplots()
  2. for word, idx in word_to_idx.items():
  3. # 获取每个单词的嵌入向量
  4. vec = cbow_model.input_to_hidden.weight[:,idx].detach().numpy()
  5. ax.scatter(vec[0], vec[1]) # 在图中绘制嵌入向量的点
  6. ax.annotate(word, (vec[0], vec[1]), fontsize=12) # 点旁添加单词标签
  7. plt.title(' 二维词嵌入 ') # 图题
  8. plt.xlabel(' 向量维度 1') # X 轴 Label
  9. plt.ylabel(' 向量维度 2') # Y 轴 Label
  10. plt.show() # 显示图

 

3.总结

CBOW是word2vec的一种方法。

Word2Vec是一种用于学习词向量的算法模型,它能够将单词转换为密集的向量表示,并捕捉单词之间的语义关系。Word2Vec模型由Google于2013年提出,是一种基于神经网络的词嵌入技术。

Word2Vec模型包括两种主要的训练方法:Skip-gram和CBOW。Skip-gram模型的目标是通过目标词预测上下文词,而CBOW模型的目标是通过上下文词预测目标词。这两种模型均采用神经网络结构,在大规模文本语料上进行训练,学习得到每个单词的向量表示。

Word2Vec的核心思想是通过单词在上下文中的分布来学习单词的语义信息。具体而言,相似上下文中的单词会拥有相似的词向量表示,这样就能够捕捉到单词之间的语义关系。通过将单词表示为稠密的向量,Word2Vec模型可以表示单词之间的相似度,进而应用于词义相似度计算、文本分类、语言建模等多个自然语言处理任务中。

Word2Vec模型的训练速度快、效果好,因此在自然语言处理领域得到了广泛的应用。它为计算机更好地理解和处理自然语言提供了有效的工具,被认为是自然语言处理领域的重要突破之一。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/505800
推荐阅读
相关标签
  

闽ICP备14008679号