《深度学习》神经语言模型 Word2vec CBOW项目解析、npy/npz文件解析

news2024/11/24 15:43:22

目录

一、关于word2vec

1、什么是word2vec

2、常用训练算法

1)CBOW

2)SkipGram

二、关于npy、npz文件

1、npy文件

1)定义

2)特性

3)用途

4)保存及读取

运行结果:

运行结果:

2、npz文件

1)定义

2)用途

3)保存及读取

运行结果:

运行结果:

三、CBOW案例解析

1、获取训练集数据

调试结果:

2、生成one-hot

运行结果:

3、创建CBOW类

4、cuda、优化器

5、开始训练

运行结果:

6、测试

运行结果:

7、获取词向量矩阵

运行结果:

8、生成词嵌入字典

9、保存为npz文件

运行结果:


一、关于word2vec

1、什么是word2vec

        Word2Vec是一种用于将单词表示为连续向量的技术。它是一种浅层、双层的神经网络模型,用于训练单词的分布式表示。

        Word2Vec模型将单词映射到一个低维向量空间中,使得具有相似含义的单词在向量空间中距离较近。这种表示方法有助于在自然语言处理任务中更好地捕捉和理解单词之间的语义关系。

2、常用训练算法

        1)CBOW

                  以上下文词汇预测当前词,前后两个单词预测当前词,这里的两个单词是自定义个数的

    

        2)SkipGram

                以当前词预测上下文词汇,即当前词预测前后两个单词,这里的两个单词也是自定义个数的

二、关于npy、npz文件

1、npy文件

        1)定义

                npy文件是NumPy库中用于保存数组数据的二进制文件格式。

        2)特性

                二进制存储:npy文件以二进制形式存储数据,比文本文件(如CSV)更加高效地保存大型数组数据。二进制格式允许直接映射到内存,从而加快了读写速度

                数据完整性:npy文件不仅保存数组的数据,还包含了数组的形状(维度)、数据类型以及其他必要的元数据信息。这确保了数据的完整性,使得在加载数据时可以完全重现保存时的数组,而无需任何额外的转换或解析。

                跨平台性:npy文件的格式是跨平台的,可以在不同的操作系统硬件环境中进行加载和使用。

        3)用途

                npy文件的设计目的是为了在数据分析科学计算领域中,提供一种高效的存储读取NumPy数组数据的方式。

        4)保存及读取
"""保存为npy文件"""
a = np.random.randint(5,size=(2,4))
np.save('test.npy',a)
                运行结果:

"""读取npy文件"""
b = np.load('test.npy')
print(b)
                运行结果:

2、npz文件

        1)定义

                npz文件是NumPy用于存储数值数据的压缩格式。它实际上是一个压缩存档文件,可以包含一个或多个NumPy数组。

        2)用途

                npz文件通常用于存储和传输大量的数值数据,特别是在科学计算和数据分析领域。

        3)保存及读取
"""保存为npz文件"""
a = np.random.randint(0,10,(3,),dtype='int')
b = np.random.randint(0,10,(3,),dtype='int')
c = np.random.randint(0,10,(3,),dtype='int')
np.savez('test.npz',file1=a,file2=b,file3=c)  # 压缩储存数组,并给数组 分别命名
                运行结果:

"""读取npz文件"""
data = np.load('test.npz')
print(data.files)  # 读取其内文件名
aa = data[data.files[0]]  # 读取文件内容
bb = data[data.files[1]]
cc = data[data.files[2]]
print('read:',aa,bb,cc)  # 打印文件内容
                运行结果:

三、CBOW案例解析

1、获取训练集数据

import torch
import torch.nn as nn  # 神经网络
import torch.nn.functional as F
import torch.optim as optim
from tqdm import tqdm,trange  # 显示进度条函数
import numpy as np


CONTEX_SIZE = 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()   # 语料库

# 中文的语句,你可以选择分词,也可以选择分字
vocab = set(raw_text)   # 利用集合的唯一性,建立词库,集合内元素不重复
vocab_size = len(vocab)   # 打印词库长度

# enumerate返回一个可迭代对象的元素内容及其索引
word_to_idx = {word:i for i,word in enumerate(vocab)}  # for循环的复合写法,第1次循环,i得到的索引号,word 第1个单词
idx_to_word = {i:word for i,word in enumerate(vocab)}

data = []  # 用于存放分割出来的元组,元组内有两个元素,一个数前后对应的四个单词,另一个是中间的词
for i in range(CONTEX_SIZE,len(raw_text)-CONTEX_SIZE):  # 遍历值为上述设置的左右两边词长度2到文章总次数-2,i从2开始
    context = (
        [raw_text[i-(2-j)] for j in range(CONTEX_SIZE)]  # 获取前两个单词
        + [raw_text[i+j+1] for j in range(CONTEX_SIZE)]  # 获取后两个单词
    )   # 获取上下文词,第一组为(['we''are''to''study'])
    target = raw_text[i]   # 获取目标词,第一个词为about
    data.append((context,target))   # 将上下文词和目标词保存到data中,第一组格式为((['we','are''to''study']),'about')
        调试结果:

2、生成one-hot

def make_context_vector(context,word_to_idx):   # 将上下文词转换为one-hot
    idxs = [word_to_idx[w] for w in context]  # 遍历四个词,返回四个词对应的索引,将索引存入列表
    return torch.tensor(idxs,dtype=torch.long)  # 返回创建的一个torch张量,内容为词在词库中对应的索引

# 上述函数的示例
print(make_context_vector(data[0][0],word_to_idx))   # 将前后两组单词以及上述定义的字典传入自定义函数,返回其在词库中的索引
        运行结果:

3、创建CBOW类

class CBOW(nn.Module):  # 定义一个CBOW的类,其继承nn.Module,nn.Module是PyTorch中所有神经网络模块的基类,提供了模型构建所需的基本功能。
    def __init__(self,vocab_size,embedding_dim):  # 初始化
        super(CBOW,self).__init__()
        self.embeddings = nn.Embedding(vocab_size,embedding_dim)  # vocab_size表示需要训练的词的个数,embedding_dim表示每个单词嵌入的维度大小
        self.proj = nn.Linear(embedding_dim,128)  # 额外增强的全连接层
        self.output = nn.Linear(128,vocab_size)

    def forward(self,inputs):  # 前向传播,传入数据的索引
        embeds = sum(self.embeddings(inputs)).view(1,-1)  # 将索引传入上述的Embedding词嵌入层进行处理,然后对结果求和,最后调整形状为1,embedding_dim,-1表示根据张量的大小自动计算该位置上的维度
        out = F.relu(self.proj(embeds))  # 将词嵌入的结果进行线性变换,然后再进行relu激活函数处理,即小于0的变为0,大于0的不变
        out = self.output(out)  # 输出层
        nll_prob = F.log_softmax(out,dim=-1)  # 使用softmax激活函数将原始输出值转换为概率分布的对数形式,dim=-1 指定了对最后一个维度进行计算,
        return nll_prob

4、cuda、优化器

# m模型在cuda训练
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
print(device)
model = CBOW(vocab_size,10).to(device)  # 将词库长度和每个单词嵌入的维度大小传入模型,然后放入GPU进行运算

optimizer = optim.Adam(model.parameters(),lr=0.001)  # 创建一个Adam优化器,对模型的参数进行优化
# model.parameters()返回模型中所有可训练参数的迭代器,lr表示学习率

5、开始训练

losses = []   # 存储损失的集合
loss_function = nn.NLLLoss()  # NLLLoss损失函数(当分类列表非常多的情况),将多个类别分别分成0、1两个类别。
for epoch in tqdm(range(200)):   # 开始训练,tqdm表示展示一个进度条,200表示循环展示200次
    total_loss = 0  # 用于储存当前epoch的总损失,每轮将总损失增加到列表
    for context,target in data:  # 遍历元组中的左右四个词,以及中间的一个词
        context_vecter = make_context_vector(context,word_to_idx).to(device)  # 通过遍历将所有的四个词以及词组对应的字典传入函数,返回对应的索引,然后传入GPU
        target = torch.tensor([word_to_idx[target]]).to(device)  # 返回中间的词对应的索引,然后转换为torch张量传入GPU

        train_predict = model(context_vecter)   # 将每一组数据的四个索引传入模型进行前向传播,model.forward可以不写forward
        # print(train_predict)  # 打印返回的每一个数对应的概率值对数形式
        loss = loss_function(train_predict,target)  # 将上述模型返回的预测结果与真实值传入负对数似然损失函数进行计算得到损失值

        optimizer.zero_grad()   # 梯度清零
        loss.backward()    # 反向传播计算得到每个参数梯度值
        optimizer.step()   # 根据梯度更新网络参数

        total_loss += loss.item()  # 叠加损失值
    losses.append(total_loss)
print(losses)
        运行结果:

6、测试

# 测试
context = ['People','create','to','direct']
context_vector = make_context_vector(context,word_to_idx).to(device)

# 预测的值
model.eval()  # 进入测试模式
predict = model(context_vector)
max_idx = predict.argmax(1).item()  # dim=1表示每一行中的最大值对应的索引号,dim=0表示每一列中最大值对应的索引号
print(f"{','.join(context)}中间的单词为:",idx_to_word[max_idx])
        运行结果:

7、获取词向量矩阵

W = model.embeddings.weight.cpu().detach().numpy()   # 获取词嵌入层的权重,因为模型在GPU训练,先将其传入CPU,detach()表示分理处张量,然后将其转变为numpy数组类型
print(W)  # 打印模型的词嵌入矩阵
        运行结果:

8、生成词嵌入字典

word_2_vec = {}
for word in word_to_idx.keys():
    # 词向量矩阵中某个词的索引对应的那一列即为该词的词向量
    word_2_vec[word] = W[word_to_idx[word],:]
print('结束')

9、保存为npz文件

np.savez('word2vec实现.npz',file_1=W)
data = np.load('word2vec实现.npz')
print(data.files)
        运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用.mdf及.ldf恢复SQL SERVER数据库

文章目录 [toc]1.使用.mdf和对应的.ldf文件恢复数据库1.1 将对应的.mdf和.ldf复制到SQL SERVER路径下1.2 打开SSMS 1.使用.mdf和对应的.ldf文件恢复数据库 1.1 将对应的.mdf和.ldf复制到SQL SERVER路径下 一般默认路径是:C:\Program Files\Microsoft SQL Server\MS…

【源码+文档】基于Java的新能源停车场管理系统的设计与实现

🚩如何选题? 如何选题、让题目的难度在可控范围,以及如何在选题过程以及整个毕设过程中如何与老师沟通,这些问题是需要大家在选题前需要考虑的,具体的方法我会在文末详细为你解答。 🚭如何快速熟悉一个项…

Pywinauto,一款 Win 自动化利器!

1.安装 pywinauto是一个用于自动化Python模块,适合Windows系统的软件(GUI),可以通过Pywinauto遍历窗口(对话框)和窗口里的控件,也可以控制鼠标和键盘输入,所以它能做的事情比之前介…

Python酷库之旅-第三方库Pandas(137)

目录 一、用法精讲 616、pandas.plotting.andrews_curves方法 616-1、语法 616-2、参数 616-3、功能 616-4、返回值 616-5、说明 616-6、用法 616-6-1、数据准备 616-6-2、代码示例 616-6-3、结果输出 617、pandas.plotting.autocorrelation_plot方法 617-1、语法…

机器学习篇-day03-线性回归-正规方程与梯度下降-模型评估-正则化解决模型拟合问题

一. 线性回归简介 定义 线性回归(Linear regression)是利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 回归方程(函数) 一元线性回归: y kx b > wx b k: 斜率, 在机器学习中叫 权重(weight), 简称: w b: 截距, 在机…

Linux驱动学习——内核编译

1、从官网下载适合板子的Linux内核版本 选择什么版本的内核需要根据所使用的硬件平台而定,最好使用硬件厂商推荐使用的版本 https://www.kernel.org/pub/linux/kernel/ 2、将压缩包复制到Ubuntu内进行解压 sudo tar -xvf linux-2.6.32.2-mini2440-20150709.tgz 然…

【C++ 11】nullptr 空指针

文章目录 【 0. 问题背景 】0.1 野指针和悬空指针0.2 传统空指针 NULL0.3 传统空指针的局限性 【 1. 基本用法 】【 2. nullptr 的应用 】2.1 nullptr 解决 NULL 的遗留BUG2.2 简单实例 【 0. 问题背景 】 0.1 野指针和悬空指针 总结 野指针悬空指针产生原因指针变量未被初始…

绕过中间商,不用 input 标签也能搞定文件选择

💰 点进来就是赚到知识点!本文带你用 JS 实现文件选择功能,点赞、收藏、评论更能促进消化吸收! 🚀 想解锁更多 Web 文件系统技能吗?快来订阅专栏「Web 玩转文件操作」! 📣 我是 Jax,…

【机器学习】线性回归算法简介 及 数学实现方法

线性回归 简介 利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 数学公式: ℎ_(w) w_1x_1 w_2x_2 w_3x_3 … b w^Txb 概念 ​ 利用回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关…

易基因: cfMeDIP-seq揭示cfDNA甲基化高效区分原发性和转移性前列腺|Nat Commun

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 前列腺癌(Prostate cancer,PCa)是男性中第二常见的恶性肿瘤,也是全球癌症相关死亡的第三大原因。虽然大多数原发性前列腺癌可以治愈&#…

交易所开发:构建安全、高效、可靠的数字资产交易平台

数字资产交易平台是加密市场中连接用户与数字货币的重要枢纽。开发一个安全、高效、可靠的交易所,不仅需要综合考虑技术架构、安全策略、用户体验等方面,还需严格遵循法规要求以确保合规性。本文总结了交易所开发的关键要素,包括其类型、核心…

振弦式土体沉降计有哪些功能特点

振弦式土体沉降计是一种广泛应用于土木工程领域的测量仪器,用于监测土石坝、边坡、地基等构筑物的沉降变形。以下是南京峟思给大家介绍的振弦式土体沉降计的主要优点: 高精度测量: 振弦式土体沉降计采用先-进的感应技术,能够精确地…

一个月学会Java 第5天 控制结构

Day5 控制结构 这么叫可能有些就算有基础的人也看不懂,其实就是if-else、switch-case、for、while、do-while这几个,没基础的听到了这个也不要慌张,这几个是程序的基础,多多训练就好 第一章 顺序结构 这章其实没有什么好讲的&…

Python 工具库每日推荐【openpyxl 】

文章目录 引言Python Excel 处理库的重要性今日推荐:openpyxl 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:自动生成月度销售报告案例分析高级特性条件格式数据验证扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计…

2024 Mysql基础与进阶操作系列之MySQL触发器详解(20)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️ MYSQL REDIS Advance operation 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️HCIP;H3C-SE;CCIP——…

不容错过的10款文件加密软件,2024顶尖办公文件加密软件分享

随着数据隐私和信息安全越来越受到重视,文件加密已经成为保护个人和企业机密信息的必备工具。无论是敏感的个人文件、财务报表、商业机密,还是政府机密信息,都需要高效的加密工具来确保信息安全不被未经授权的人访问。在2024年,我…

盘点2024年4款打工人都在用的PDF软件。

PDF 软件在现代的办公或者是学习当中的应用非常广泛,已经成了很多人的必备工具。因为PDF 文件具有跨设备、跨系统的优势,所以在很多设备上都可以打开浏览。如果有了PDF 编辑软件,查看,编辑,分享也会变得更加方便简单&a…

web自动化测试基础(从配置环境到自动化实现登录测试用例的执行,vscode如何导入自己的python包)

接下来的一段时间里我会和大家分享自动化测试相关的一些知识希望大家可以多多支持,一起进步。 一、环境的配置 前提安装好了python解释器并配好了环境,并安装好了VScode 下载的浏览器和浏览器驱动需要一样的版本号(只看大版本)。 1、安装浏览器 Chro…

回到原点再出发

原文What Goes Around Comes Around作者Michael Stonebraker & Joseph M. Hellerstein其他译文https://zhuanlan.zhihu.com/p/111322429 1. 摘要 本文总结了近35年来的数据模型方案,分成9个不同的时代,讨论了每个时代的方案。我们指出,…

Vue3入门 - provide和inject组合使用

在Vue3中&#xff0c;provide和inject是用于实现依赖注入的一对API。它们允许在组件树中传递和接收数据&#xff0c;而不需要通过每一层显式地传递props。在<script setup>语法中&#xff0c;provide可以用来提供一个值&#xff0c;而inject可以用来接收一个已经提供的值…