深度学习之自然语言处理CBOW预测及模型的保存
自然语言处理CBOW预测及模型的保存
目录
- 自然语言处理CBOW预测及模型的保存
- 1 自然语言处理
- 1.1 概念
- 1.2 词向量
- 1.2.1 one-hot编码
- 1.2.2 词嵌入
- 1.2.3 常见的词嵌入模型
- 2 CBOW预测模型搭建
- 2.1 数据及模型确定
- 2.1.1 数据
- 2.1.2 CBOW模型
- 2.1.3 词嵌入降维
- 2.2 数据预处理
- 2.3 模型搭建
- 2.4 训练、测试模型
- 2.5 模型保存及词嵌入权重查看
1 自然语言处理
1.1 概念
自然语言处理(Natural Language Processing, NLP)是人工智能和语言学的一个交叉领域,旨在使计算机能够理解、处理和生成人类语言。
1.2 词向量
词向量(Word Embeddings):是自然语言处理(NLP)中的一种技术,将单词映射到高维向量空间,捕捉语义和语法特性,用于将单词表示为实数向量。这些向量在向量空间中具有这样的性质,即语义上相似的单词在向量空间中的距离相近。常见方法包括Word2Vec、GloVe、FastText等。词向量广泛应用于各种NLP任务,如文本分类、机器翻译、情感分析等。
1.2.1 one-hot编码
- 概念:是一种将类别变量转换为二进制向量的编码方式,其中每个向量只有一个元素为1,其余为0。每个单词表示为一个高维稀疏向量。
- 缺点:维度灾难,无法捕捉单词间的语义关系。
例如:对于一个包含三个单词的词汇表 [“apple”, “banana”, “cherry”],独热编码可能如下所示:- “apple” -> [1, 0, 0]
- “banana” -> [0, 1, 0]
- “cherry” -> [0, 0, 1]
1.2.2 词嵌入
词嵌入(Word Embedding)是自然语言处理(NLP)中的一种技术,用于将词汇表示为密集的向量。词嵌入是词向量的一种实现方式,但通常词嵌入指的是通过神经网络模型学习到的向量表示,可以将独热编码的单词表示转换为更有意义且维度更低的词嵌入向量,将高维的独热编码向量转换为低维的密集向量,同时保留单词的语义信息。
- 主要特点:
- 密集表示:与one-hot编码不同,词嵌入是低维密集向量,通常维度在几十到几百之间。
- 语义信息:相似的单词在嵌入空间中具有相似的向量表示,可以捕捉到单词的语义信息。
- 分布式表示:单词的表示分布在整个向量中,每个维度可能代表某种潜在的语义特征。
1.2.3 常见的词嵌入模型
- Word2Vec:
- CBOW(Continuous Bag of Words):通过上下文预测中心词。
- Skip-Gram:通过中心词预测上下文。
- GloVe(Global Vectors for Word Representation):
- 结合了全局矩阵分解和局部上下文窗口的方法,利用共现矩阵来训练词向量。
- FastText:
- 扩展了Word2Vec模型,将每个单词表示为组成它的字符n-gram的向量之和。
- ELMo(Embeddings from Language Models):
- 基于预训练的语言模型,为每个单词生成动态的词向量表示。
2 CBOW预测模型搭建
2.1 数据及模型确定
2.1.1 数据
语料库:
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.
2.1.2 CBOW模型
根据上文2个词汇、下文2个词汇预测中间1个词
2.1.3 词嵌入降维
由于语料库内容较少,所以将独热编码通过词嵌入降维至10维。
2.2 数据预处理
代码展示:
import torch
CONTEXT_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)
# 字典,可以根据字典便于后续处理
word_to_idx = {word:i for i,word in enumerate(vocab)}
idx_to_word = {i:word for i,word in enumerate(vocab)}
# 上下文内容和可预测内容,每个元素是一个元组 (context, target)
data = []
for i in range(CONTEXT_SIZE,len(raw_text)-CONTEXT_SIZE):context = ([raw_text[i - (2- j)] for j in range(CONTEXT_SIZE)]+ [raw_text[(i+ j + 1)] for j in range(CONTEXT_SIZE)])target = raw_text[i]data.append((context,target))
# 将上下文中的单词转换为对应的索引,并转为张量返回
def make_context_vector(context,word_to_ix):idxs = [word_to_ix[w] for w in context]return torch.tensor(idxs,dtype=torch.long)
2.3 模型搭建
class CBOW(nn.Module):def __init__(self, vocab_size, embedding_dim):super(CBOW, self).__init__()# 词嵌入低维密向量self.embeddings = nn.Embedding(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)out = F.relu(self.proj(embeds))out = self.output(out)nll_prob = F.log_softmax(out, -1)return nll_prob
2.4 训练、测试模型
代码展示:
import torch
from torch import nn
import torch.nn.functional as F
from tqdm import tqdmCONTEXT_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)
word_to_idx = {word:i for i,word in enumerate(vocab)}
idx_to_word = {i:word for i,word in enumerate(vocab)}data = []
for i in range(CONTEXT_SIZE,len(raw_text)-CONTEXT_SIZE):context = ([raw_text[i - (2- j)] for j in range(CONTEXT_SIZE)]+ [raw_text[(i+ j + 1)] for j in range(CONTEXT_SIZE)])target = raw_text[i]data.append((context,target))def make_context_vector(context,word_to_ix):idxs = [word_to_ix[w] for w in context]return torch.tensor(idxs,dtype=torch.long)print(make_context_vector(data[0][0],word_to_idx))class CBOW((nn.Module)):def __init__(self,vocab_size,embedding_dim):super(CBOW,self).__init__()self.embeddings = nn.Embedding(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)out = F.relu(self.proj(embeds))out = self.output(out)nll_prob = F.log_softmax(out,-1)return nll_probdevice = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
print(f'Using {device} device')model = CBOW(vocab_size,10).to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)losses = []
loss_function = nn.NLLLoss()
## 进入训练模式
model.train()
for epoch in tqdm(range(200)):totall_loss = 0for context,target in data:context_vector = make_context_vector(context,word_to_idx).to(device)target = torch.tensor([word_to_idx[target]]).to(device)train_pre = model(context_vector)loss = loss_function(train_pre,target)optimizer.zero_grad()loss.backward()optimizer.step()totall_loss +=loss.item()losses.append(totall_loss)# print(losses)context = ['People','create','to','direct']
context_vector = make_context_vector(context,word_to_idx).to(device)
model.eval()
pre = model(context_vector)
#获取预测结果中概率最大的索引。
max_idx = pre.argmax(1)
print(f'根据上文:{context[0],context[1]}和下文:{context[2],context[3]}预测中间内容:{max_idx}:{idx_to_word[max_idx.item()]}')
运行结果:

模型预测:上文(‘People’, ‘create’)和下文:(‘to’, ‘direct’)预测中间内容:tensor([28]):programs
实际语料库内容:People create programs to direct
2.5 模型保存及词嵌入权重查看
由于相较于torch,numpy应用范围更广泛,所以将模型保存为numpy的npz格式
# 保存词嵌入权重并转numpy
w = model.embeddings.weight.cpu().detach().numpy()
word2_vec = {}
for word in word_to_idx.keys():word2_vec[word] = w[word_to_idx[word],:]
print('结束')
import numpy as np
np.savez('word2vec实现.npz',file_1=w)
data = np.load('word2vec实现.npz')
print(data.files)
print(data[data.files[0]])
调试查看词嵌入权重:


运行结果:

相关文章:
深度学习之自然语言处理CBOW预测及模型的保存
自然语言处理CBOW预测及模型的保存 目录 自然语言处理CBOW预测及模型的保存1 自然语言处理1.1 概念1.2 词向量1.2.1 one-hot编码1.2.2 词嵌入1.2.3 常见的词嵌入模型 2 CBOW预测模型搭建2.1 数据及模型确定2.1.1 数据2.1.2 CBOW模型2.1.3 词嵌入降维 2.2 数据预处理2.3 模型搭建…...
qt项目配置部署
Test项目: 子项目testFileHelper 1.新建一个test项目的子项目:取名testFileHelper 2.编写测试用例 3.pro文件中引入qosbrowser 4.引入测试对象的cpp和头文件 2.在项目中引入资源文件testfile.txt,在其中输入abc 实现thrid目录复用 移动thrid 将thrild目录统一放在章…...
java方法学习
java 方法 在Java中,方法是类(或对象)的行为或功能的实现。(一起实现一个功能)java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段。 方法是解决一类问题步骤的有序结合。 方法包含于类或…...
基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)
第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示: 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台,所以对信息的安全和稳定要求非常高。为了解决本问题,采用前端…...
解析CV/多模态算法的要点及技术特点,弥补单模态信息不足的多模态应用的哪些场景中?
CV(计算机视觉)多模态算法是计算机科学领域的重要研究方向,融合了多种模态的数据来提升对视觉信息的理解和处理能力。 以下是一个结合自动驾驶行业的多模态大模型算法示例,采用特征级融合策略,结合摄像头图像和激光雷…...
[漏洞篇]文件上传漏洞详解
[漏洞篇]文件上传漏洞详解 一、介绍 1. 概念 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传” 本身没有问题,有问题的是文件上传后…...
11.Docker 之分布式仓库 Harbor
Docker 之分布式仓库 Harbor Docker 之分布式仓库 Harbor1. Harbor 组成2. 安装 Harbor Docker 之分布式仓库 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,由 VMware 开源,其通过添加一些企业必需的功能特性,例…...
Python项目源码34:网页内容提取工具1.0(Tkinter+requests+html2text)
------★Python练手项目源码★------- Python项目32:订单销售额管理系统1.0(TkinterCSV) Python项目31:初学者也能看懂的聊天机器人1.0源码(命令行界面Re正则表达式) Python项目源码30:待办事…...
使用Termux将安卓手机变成随身AI服务器(page assist连接)
通过以下方法在安卓手机上运行 Ollama 及大模型,无需 Root 权限,具体方案如下: 通过 Termux 模拟 Linux 环境运行 核心工具: 安装 (安卓终端模拟器)()]。借助 proot-distro 工具安装 Linux 发行版…...
SpringBoot3中跨域问题解决
问题 SpringBoot3 中处理跨域请求 异常 浏览器在 localhost:3000 地址请求后端 http://127.0.0.1:8080 时, 报错提示 CORS 问题. 默认使用 Get 请求正常, 其他会提示. 使用 SpringBoot 3.4.2 版本配合 SpringSecurity 配置 Access to fetch at http://127.0.0.1:8080/todo-…...
kotlin Java 使用ArrayList.add() ,set()前面所有值被 覆盖 的问题
一、问题描述和分析 结构体的字段的属性为静态, 意味着该类的所有对象共享同一个属性,所以尽管集合里存的是不同的对象,但是对象的属性还是同一个值 修改其中任何一个,其他的也会“被修改”。使用kotlin语言时候,经常…...
力扣-回溯-51 N皇后
思路 在棋盘上放皇后在回溯方法的树上来说,深度就是每一行放的皇后,宽度就是for循环里遍历放皇后,还有个问题是需要判断当前位置是否允许放皇后 代码 class Solution { public:vector< vector<string> > result;vector<str…...
flink-cdc同步数据到doris中
1 创建数据库和表 1.1 数据库脚本 这样直接创建数据库是有问题,因为后面发现superset连接使用doris://root:12345610.101.12.82:9030/internal.eayc?charsetutf8mb4 -- 创建数据库eayc create database if not exists ods_eayc; -- 创建数据表2 数据同步 2.1 f…...
Git命令行入门
诸神缄默不语-个人CSDN博文目录 之前写过一篇VSCode Git的博文:VSCode上的Git使用手记(持续更新ing…) 现在随着开发经历增加,感觉用到命令行之类复杂功能的机会越来越多了,所以我专门再写一篇Git命令行的文章。 G…...
DeepSeek R1/V3满血版——在线体验与API调用
前言:在人工智能的大模型发展进程中,每一次新模型的亮相都宛如一颗投入湖面的石子,激起层层波澜。如今,DeepSeek R1/V3 满血版强势登场,为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…...
关于 BK3633 上电时受串口 UART2 影响而无法启动的问题说明
1. 问题描述 BK3633 SDK 版本:BK3633_DesignKit_V06_2310 使用 BK3633 UART2 与指纹模块进行通讯,为了降低功耗,通过 GPIO 控制了指纹模块的供电电源。但每次给整个系统板子上电时,BK3633 很大概率会实际而无法正常运行程序&…...
Redis7——基础篇(六)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
简单工厂模式(Simple Factory Pattern)虽然不属于 GoF 23 种经典设计模式,但在实际开发中非常常用,尤其是在 Spring Boot 项目中。它提供了一种简单的方式来创建对象,将对象的创建逻辑集中到一个工厂类中。 一、简单工…...
Python简单使用MinerU
Python简单使用MinerU 1 简介 MinerU是国产的一款将PDF转化为机器可读格式的工具(如markdown、json),可以很方便地抽取为任意格式。目前支持图像(.jpg及.png)、PDF、Word(.doc及.docx)、以及P…...
使用AI创建流程图和图表的 3 种简单方法
你可能已经尝试过使用 LLMs 生成图像,但你有没有想过用它们来创建 流程图和图表?这些可视化工具对于展示流程、工作流和系统架构至关重要。 通常,在在线工具上手动绘制图表可能会耗费大量时间。但你知道吗?你可以使用 LLMs 通过简…...
ImportError: cannot import name ‘FixtureDef‘ from ‘pytest‘
错误信息表明 pytest 在尝试导入 FixtureDef 时出现了问题。通常是由于 pytest 版本不兼容 或 插件版本冲突 引起的。以下是详细的排查步骤和解决方案: 1. 检查 pytest 版本 首先,确认当前安装的 pytest 版本。某些插件可能需要特定版本的 pytest 才能…...
机器学习实战(7):聚类算法——发现数据中的隐藏模式
第7集:聚类算法——发现数据中的隐藏模式 在机器学习中,聚类(Clustering) 是一种无监督学习方法,用于发现数据中的隐藏模式或分组。与分类任务不同,聚类不需要标签,而是根据数据的相似性将其划…...
z-score算法
z-score算法原理参考网址 https://blog.csdn.net/m0_59596937/article/details/128378641 具体实现代码如下: import numpy as npclass ZScoreOutlierDetector:def __init__(self, threshold3):"""构造函数"""self.threshold thre…...
企业级RAG开源项目分享:Quivr、MaxKB、Dify、FastGPT、RagFlow
企业级 RAG GitHub 开源项目深度分享:Quivr、MaxKB、Dify、FastGPT、RagFlow 及私有化 LLM 部署建议 随着生成式 AI 技术的成熟,检索增强生成(RAG)已成为企业构建智能应用的关键技术。RAG 技术能够有效地将大型语言模型ÿ…...
open webui 部署 以及解决,首屏加载缓慢,nginx反向代理访问404,WebSocket后端服务器链接失败等问题
项目地址:GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 选择了docker部署 如果 Ollama 在您的计算机上,请使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…...
C++ 智能指针 unique_ptr shared_ptr weak_ptr小练习
智能指针是 C11 引入的一项重要特性,它可以帮助我们管理动态分配的内存,自动释放内存,避免内存泄漏和悬空指针的问题。智能指针有三种常用类型:std::unique_ptr、std::shared_ptr 和 std::weak_ptr。 为了帮助你熟悉智能指针的使…...
Netstat(Network Statistics)网络工具介绍
Netstat 工具详细介绍及常见指令应用 Netstat(Network Statistics)是一个常用的命令行工具,用于显示网络连接、路由表、接口统计信息、伪装连接等信息。它可以帮助用户监控计算机的网络状态,尤其在诊断网络问题时非常有用。Netst…...
内容中台架构下智能推荐系统的算法优化与分发策略
内容概要 在数字化内容生态中,智能推荐系统作为内容中台的核心引擎,承担着用户需求与内容资源精准匹配的关键任务。其算法架构的优化路径围绕动态特征建模与多模态数据融合展开,通过深度强化学习技术实现用户行为特征的实时捕捉与动态更新&a…...
React 高阶组件的优缺点
React 高阶组件的优缺点 优点 1. 代码复用性高 公共逻辑封装:当多个组件需要实现相同的功能或逻辑时,高阶组件可以将这些逻辑封装起来,避免代码重复。例如,多个组件都需要在挂载时进行数据获取操作,就可以创建一个数…...
最新版IDEA下载安装教程
一、下载IDEA 点击前往官网下载 或者去网盘下载 点击前往百度网盘下载 点击前往夸克网盘下载 进去后点击IDEA 然后点击Download 选择自己电脑对应的系统 点击下载 等待下载即可 二、安装IDEA 下载好后双击应用程序 点击下一步 选择好安装目录后点击下一步 勾选这两项后点击…...
