做汽车新闻哪个网站好,广西柳州网站建设公司,淘宝营销推广方案,seo分析师系列文章目录 提示#xff1a;这里可以添加系列文章的所有文章的目录#xff0c;目录需要自己手动添加 例如#xff1a;第一章 Python 机器学习入门之pandas的使用 提示#xff1a;写完文章后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目…系列文章目录 提示这里可以添加系列文章的所有文章的目录目录需要自己手动添加 例如第一章 Python 机器学习入门之pandas的使用 提示写完文章后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、使用SkipGram 模型1. 构建实验语料库2. 生成Skip-Gram训练数据3. 对Skip-Gram数据进行One-Hot编码4. 定义Skip-Gram模型5. 训练Skip-Gram模型6. 输出Skip-Gram词向量 二、使用CBOW 模型1. 构建实验语料库2. 生成CBOW训练数据3. CBOW数据进行One-Hot编码4. 定义CBOW模型5. 训练CBOW模型6. 输出CBOW词向量 前言
提示这里可以添加本文要记录的大概内容
例如随着人工智能的不断发展机器学习这门技术也越来越重要很多人都开启了学习机器学习本文就介绍了机器学习的基础内容。 提示以下是本篇文章正文内容下面案例可供参考
一、使用SkipGram 模型
1. 构建实验语料库
# 定义一个句子列表后面会用这些句子来训练CBOW和Skip-Gram模型
sentences [Kage is Teacher, Mazong is Boss, Niuzong is Boss,Xiaobing is Student, Xiaoxue is Student,]
# 将所有句子连接在一起然后用空格分隔成词汇
words .join(sentences).split()
# 构建词汇表去除重复的词
word_list list(set(words))
# 创建一个字典将每个词汇映射到一个唯一的索引
word_to_idx {word: idx for idx, word in enumerate(word_list)}
# 创建一个字典将每个索引映射到对应的词汇
idx_to_word {idx: word for idx, word in enumerate(word_list)}
voc_size len(word_list) # 计算词汇表的大小
print(词汇表, word_list) # 输出词汇表
print(词汇到索引的字典, word_to_idx) # 输出词汇到索引的字典
print(索引到词汇的字典, idx_to_word) # 输出索引到词汇的字典
print(词汇表大小, voc_size) # 输出词汇表大小2. 生成Skip-Gram训练数据
# 生成Skip-Gram训练数据
def create_skipgram_dataset(sentences, window_size2):data []for sentence in sentences:sentence sentence.split() # 将句子分割成单词列表for idx, word in enumerate(sentence): # 遍历单词及其索引# 获取相邻的单词将当前单词前后各N个单词作为相邻单词for neighbor in sentence[max(idx - window_size, 0): min(idx window_size 1, len(sentence))]:if neighbor ! word: # 排除当前单词本身# 将相邻单词与当前单词作为一组训练数据data.append((neighbor, word))return data
# 使用函数创建Skip-Gram训练数据
skipgram_data create_skipgram_dataset(sentences)
# 打印未编码的Skip-Gram数据样例
print(Skip-Gram数据样例未编码, skipgram_data)3. 对Skip-Gram数据进行One-Hot编码
# 定义One-Hot编码函数
import torch # 导入torch库
def one_hot_encoding(word, word_to_idx):# 创建一个全为0的张量长度与词汇表大小相同tensor torch.zeros(len(word_to_idx)) tensor[word_to_idx[word]] 1 # 将对应词汇的索引位置置为1return tensor # 返回生成的One-Hot向量# 展示One-Hot编码前后的数据
word_example Teacher
print(One-Hot编码前的单词, word_example)
print(One-Hot编码后的向量, one_hot_encoding(word_example, word_to_idx))# 展示编码后的Skip-Gram数据样例
print(Skip-Gram数据样例已编码, [(one_hot_encoding(context, word_to_idx), word_to_idx[target]) for context, target in skipgram_data[:3]])4. 定义Skip-Gram模型
# 定义Skip-Gram模型
import torch.nn as nn # 导入neural network
class SkipGram(nn.Module):def __init__(self, voc_size, embedding_size):super(SkipGram, self).__init__()# 从词汇表大小到嵌入大小的线性层权重矩阵self.input_to_hidden nn.Linear(voc_size, embedding_size, biasFalse) # 从嵌入大小到词汇表大小的线性层权重矩阵self.hidden_to_output nn.Linear(embedding_size, voc_size, biasFalse) def forward(self, X): # X : [batch_size, voc_size] # 生成隐藏层[batch_size, embedding_size]hidden_layer self.input_to_hidden(X) # 生成输出层[batch_size, voc_size]output_layer self.hidden_to_output(hidden_layer) return output_layerembedding_size 2 # 设定嵌入层的大小这里选择2是为了方便展示
skipgram_model SkipGram(voc_size,embedding_size) # 实例化SkipGram模型
print(Skip-Gram模型, skipgram_model)##建立skipgram模型--使用nn.embedding层替代线性层import torch.nn as nn
class SkipGram(nn.Module):def __init__(self,voc_size,embeding_size):super(SkipGram,self).__init__()self.input_to_hiddennn.Embedding(voc_size,embeding_size)self.hidden_to_outputnn.Linear(embeding_size,voc_size,biasFalse)def forward(self,X):hidden_layerself.input_to_hidden(X)output_layerself.hidden_to_output(hidden_layer)return output_layervoc_sizelen(words_list)
skipgram_modelSkipGram(voc_size,embeding_size2)5. 训练Skip-Gram模型
# 训练Skip-Gram模型
learning_rate 0.001 # 设置学习速率
epochs 1000 # 设置训练轮次
criterion nn.CrossEntropyLoss() # 定义交叉熵损失函数
import torch.optim as optim # 导入随机梯度下降优化器
optimizer optim.SGD(skipgram_model.parameters(), lrlearning_rate) # 开始训练循环
loss_values [] # 用于存储每轮的平均损失值
for epoch in range(epochs):loss_sum 0 # 初始化损失值for context, target in skipgram_data: X one_hot_encoding(target, word_to_idx).float().unsqueeze(0) # 将中心词转换为One-Hot向量 y_true torch.tensor([word_to_idx[context]], dtypetorch.long) # 将周围词转换为索引值 y_pred skipgram_model(X) # 计算预测值loss criterion(y_pred, y_true) # 计算损失loss_sum loss.item() # 累积损失optimizer.zero_grad() # 清空梯度loss.backward() # 反向传播optimizer.step() # 更新参数if (epoch1) % 100 0: # 输出每100轮的损失并记录损失print(fEpoch: {epoch1}, Loss: {loss_sum/len(skipgram_data)}) loss_values.append(loss_sum / len(skipgram_data))# 绘制训练损失曲线
import matplotlib.pyplot as plt # 导入matplotlib
plt.plot(range(1, epochs//100 1), loss_values) # 绘图
plt.title(Training Loss) # 图题
plt.xlabel(Epochs) # X轴Label
plt.ylabel(Loss) # Y轴Label
plt.show() # 显示图6. 输出Skip-Gram词向量
# 输出Skip-Gram习得的词嵌入
print(\nSkip-Gram词嵌入:)
for word, idx in word_to_idx.items(): # 输出每个单词的嵌入向量print(f{word}: \{skipgram_model.input_to_hidden.weight[:, idx].detach().numpy()}) plt.rcParams[font.family][SimHei] # 用来设定字体样式
plt.rcParams[font.sans-serif][SimHei] # 用来设定无衬线字体样式
plt.rcParams[axes.unicode_minus]False # 用来正常显示负号
# 绘制二维词向量图
fig, ax plt.subplots()
for word, idx in word_to_idx.items():vec skipgram_model.input_to_hidden.weight[:, \idx].detach().numpy() # 获取每个单词的嵌入向量ax.scatter(vec[0], vec[1]) # 在图中绘制嵌入向量的点ax.annotate(word, (vec[0], vec[1]), fontsize12) # 点旁添加单词标签
plt.title(2维词嵌入) # 图题
plt.xlabel(向量维度1) # X轴Label
plt.ylabel(向量维度2) # Y轴Label
plt.show() # 显示图二、使用CBOW 模型
1. 构建实验语料库
# 定义一个句子列表后面会用这些句子来训练CBOW和CBOW模型
sentences [Kage is Teacher, Mazong is Boss, Niuzong is Boss,Xiaobing is Student, Xiaoxue is Student,]
# 将所有句子连接在一起然后用空格分隔成词汇
words .join(sentences).split()
# 构建词汇表去除重复的词
word_list list(set(words))
# 创建一个字典将每个词汇映射到一个唯一的索引
word_to_idx {word: idx for idx, word in enumerate(word_list)}
# 创建一个字典将每个索引映射到对应的词汇
idx_to_word {idx: word for idx, word in enumerate(word_list)}
voc_size len(word_list) # 计算词汇表的大小
print(词汇表, word_list) # 输出词汇表
print(词汇到索引的字典, word_to_idx) # 输出词汇到索引的字典
print(索引到词汇的字典, idx_to_word) # 输出索引到词汇的字典
print(词汇表大小, voc_size) # 输出词汇表大小
2. 生成CBOW训练数据
# 生成CBOW训练数据
def create_cbow_dataset(sentences, window_size2):data []for sentence in sentences:sentence sentence.split() # 将句子分割成单词列表for idx, word in enumerate(sentence): # 遍历单词及其索引# 获取上下文词汇将当前单词前后各window_size个单词作为上下文词汇context_words sentence[max(idx - window_size, 0):idx] \ sentence[idx 1:min(idx window_size 1, len(sentence))]# 将当前单词与上下文词汇作为一组训练数据data.append((word, context_words))return data# 使用函数创建CBOW训练数据
cbow_data create_cbow_dataset(sentences)
# 打印未编码的CBOW数据样例前三个
print(CBOW数据样例未编码, cbow_data[:3])
3. CBOW数据进行One-Hot编码
# 定义One-Hot编码函数
import torch # 导入torch库
def one_hot_encoding(word, word_to_idx):# 创建一个全为0的张量长度与词汇表大小相同tensor torch.zeros(len(word_to_idx)) tensor[word_to_idx[word]] 1 # 将对应词汇的索引位置置为1return tensor # 返回生成的One-Hot向量# 展示One-Hot编码前后的数据
word_example Teacher
print(One-Hot编码前的单词, word_example)
print(One-Hot编码后的向量, one_hot_encoding(word_example, word_to_idx))# 展示编码后的CBOW数据样例
# 展示编码后的CBOW数据样例
print(CBOW数据样例已编码, [(one_hot_encoding(target, word_to_idx), [one_hot_encoding(context, word_to_idx) for context in context_words]) for target, context_words in cbow_data[:3]])
4. 定义CBOW模型
# 定义CBOW模型
import torch.nn as nn # 导入neural network# 定义CBOW模型
class CBOW(nn.Module):def __init__(self, voc_size, embedding_size):super(CBOW, self).__init__()# 从词汇表大小到嵌入大小的线性层权重矩阵self.input_to_hidden nn.Linear(voc_size, embedding_size, biasFalse) # 从嵌入大小到词汇表大小的线性层权重矩阵self.hidden_to_output nn.Linear(embedding_size, voc_size, biasFalse) def forward(self, X): # X: [num_context_words, voc_size]# 生成嵌入[num_context_words, embedding_size]embeddings self.input_to_hidden(X) # 计算隐藏层求嵌入的均值[embedding_size]hidden_layer torch.mean(embeddings, dim0) # 生成输出层[1, voc_size]output_layer self.hidden_to_output(hidden_layer.unsqueeze(0)) return output_layerembedding_size 2 # 设定嵌入层的大小这里选择2是为了方便展示
cbow_model CBOW(voc_size,embedding_size) # 实例化cbow模型
print(CBOW模型, cbow_model)
5. 训练CBOW模型
# 训练CBOW模型
learning_rate 0.001 # 设置学习速率
epochs 1000 # 设置训练轮次
criterion nn.CrossEntropyLoss() # 定义交叉熵损失函数
import torch.optim as optim # 导入随机梯度下降优化器
optimizer optim.SGD(cbow_model.parameters(), lrlearning_rate) # 开始训练循环
loss_values [] # 用于存储每轮的平均损失值
for epoch in range(epochs):loss_sum 0for target, context_words in cbow_data:# 将上下文词转换为One-hot向量并堆叠X torch.stack([one_hot_encoding(word, word_to_idx) for word in context_words]).float() y_true torch.tensor([word_to_idx[target]], dtypetorch.long) # 将目标词转换为索引值y_pred cbow_model(X) # 计算预测值loss criterion(y_pred, y_true) # 计算损失loss_sum loss.item()optimizer.zero_grad() # 清空梯度loss.backward() # 反向传播optimizer.step() # 更新参数if (epoch1) % 100 0: # 输出每100轮的损失并记录损失print(fEpoch: {epoch1}, Loss: {loss_sum/len(cbow_data)}) loss_values.append(loss_sum / len(cbow_data))
# 绘制训练损失曲线
import matplotlib.pyplot as plt # 导入matplotlib
plt.plot(range(1, epochs//100 1), loss_values) # 绘图
plt.title(Training Loss) # 图题
plt.xlabel(Epochs) # X轴Label
plt.ylabel(Loss) # Y轴Label
plt.show() # 显示图 6. 输出CBOW词向量
# 输出CBOW习得的词嵌入
print(\nCBOW词嵌入:)
for word, idx in word_to_idx.items(): # 输出每个单词的嵌入向量print(f{word}: \{cbow_model.input_to_hidden.weight[:, idx].detach().numpy()}) plt.rcParams[font.family][SimHei] # 用来设定字体样式
plt.rcParams[font.sans-serif][SimHei] # 用来设定无衬线字体样式
plt.rcParams[axes.unicode_minus]False # 用来正常显示负号
# 绘制二维词向量图
fig, ax plt.subplots()
for word, idx in word_to_idx.items():vec cbow_model.input_to_hidden.weight[:, \idx].detach().numpy() # 获取每个单词的嵌入向量ax.scatter(vec[0], vec[1]) # 在图中绘制嵌入向量的点ax.annotate(word, (vec[0], vec[1]), fontsize12) # 点旁添加单词标签
plt.title(2维词嵌入) # 图题
plt.xlabel(向量维度1) # X轴Label
plt.ylabel(向量维度2) # Y轴Label
plt.show() # 显示图