当前位置: 首页 > news >正文

基于NLP进行文本内容预测常规流程

NLP文本内容预测项目流程

完整过程

  • 文本内容 → 分词处理 → Embedding词嵌入层 → RNN(隐藏层) → 输出层(全连接层)
分词处理
  1. **句子分词:**使用分词工具(如:jieba)对文本内容进行分词,常用jieba.lcut(文本内容),输出结果为列表;
  2. **分词去重:**对分词结果进行保序去重处理;
  3. **构建词索引字典:**在分词去重结果基础上,构建由词和对应索引组成的键值对的字典
  4. **文本转数字:**遍历每个句子,将每个句子的词变为索引,同时在每句末尾加上空格索引,进行断句区分,最终实现将所有的文本内容转成由词汇索引构成的列表。
Embedding词嵌入
  1. **目的:**将每一个词汇由向量表示,即构建词向量
  2. API调用:
ebed = torch.nn.Embedding(num_embedding, embedding_dim)
"""参数解释:num_Embedding:去重后词的数量【即:unique_word_list列表元素个数,或word_list词典的键值对的个数】Embedding_dim:每个词向量的维度数 【可以随意设置】官方解释:num_embeddings (int): size of the dictionary of embeddingsembedding_dim (int): the size of each embedding vector注意:embedding的结果要输入到RNN中,需要满足RNN输入形状的要求,因此需要对embedding结果0和1做位置交换:ebed.transpose(0,1)
"""
RNN循环神经网络层
  1. API调用:
# 定义网络层
rnn = torch.nn.RNN(input_size, hidden_size, num_layers)
"""参数解释:input_size:输入数据的维度,一般是指每个输入词向量维度 【必须与embedding层设置的词向量维度数一致】hidden_size:隐藏状态的维度,也就是当前层神经元维度 【可以任意设置】num_layers:隐藏层的层数 【任意设置】官方解释:input_size: The number of expected features in the input `x`hidden_size: The number of features in the hidden state `h`num_layers: Number of recurrent layers.
"""
# 网络层的调用
x, hidden = rnn(x, hidden)
"""参数解释:x:输入的embedding结果,形状 -> (seq_len, batch, input_size)seq_len:每个句子划分的词的个数batch:每个批次的句子条数input_size:每个词向量的维度数hidden:隐藏状态结果,形状 -> (num_layers, batch, hidden_size)num_layers:隐藏层层数batch:每个批次的句子条数hidden_size:输入隐藏状态的维度
"""
输出层(全连接层)
  1. **目的:**计算整个网络线性求和并激活的结果,作为计算损失的输入
  2. API调用:
# 定义输出层
out = torch.nn.Linear(in_features, out_features)
"""参数解释:in_features:输入维度【不能随意设置,取决于上一层的输入维度】,可理解为特征个数或神经元个数out_faetures:输出维度【不能随意设置,分类任务必须与类别数保持一致】,可以理解为分类类别数
"""
# 输出层调用
output = out(x.reshape(-1, x.shape[-1]))
"""参数解释:x:RNN层的输出结果x变换形状的原因:全连接层只能处理二维数据,而RNN层输出的结果x是三维张量,不可以直接使用,需要做形状变换;定义全连接层的数据维度为(in_features, out_features),out_features是分类类别数,因此,只需要保证分类类别数是固定的,其余维度数设置为-1,自行计算确定。
"""
网络搭建
  1. 搭建流程:定义类 -> 继承父类并初始化 -> 定义网络层结构(根据需求)-> 前向传播forward -> 初始化隐藏状态
"""举例:假设类名为A"""
# 1. 定义类,继承并初始化父类
class A(nn.Module):def __init__():super().__init__():pass# 2. 定义网络层结构
"""层结构的定义需要结合实际业务的需求,这里举简单的例子
"""# 2.1 定义词嵌入层ebed = torch.nn.Embedding(num_embedding, embedding_dim)# 2.2 定义RNN层rnn = torch.nn.RNN(input_size, hidden_size, num_layers)# 2.3 定义输出层 -> 全连接层out = torch.nn.Linear(in_features, out_features)
# 3. 前向传播 -> 顺序执行各个层 传入参数为(x, hidden)x_vec = ebed(x)  # x是输入的每个句子的词汇 ->经过Embedding层之后,转换为词向量x_vec, hidden = rnn(x_vec, hidden)output, hidden = out(x_vec, hidden)

项目流程

自定义Dataset
  1. **原因:**文本数据不像常规的张量数据那样将特征和标签完全区分开的,而是标签来自于特征,因此直接调用torch.utils.data.Dataset无法实现特征标签一一对应组合,所以通过自定义Dataset功能模块实现特征与标签数据一一对应组合。
  2. 自定义过程:
# 1.根据词汇表,获取特征和标签(该过程位于__getItem__魔法方法中)# 1.1 定义特征和标签的起始位置与终止位置start = min(max(0, idx), word_count - sentence_len - 1)end = start + sentence_len"""word_count:整个文本总共的词汇个数sentence_len:每个句子的词汇数-1:因为前面计算出来的是满足标签划分的最大数量,而特征起始则需要向前移动一位,因此-1"""# 1.2 创建并输出划分结果,需转换为tensor张量,才能用于计算x = torch.tensor(corpus_idx[start:end])y = torch.tensor(copus_inx[start+1:end+1])"""corpus_idx:表示文本内容全部转换为由索引值组成的数据列表"""
# 2.通过定义相关魔法方法,使得方法调用更简便# 2.1 __init__:实例化类的相关属性# 2.2 __len__:当外部使用len(类的实例对象)时,自动返回文本内容可划分的最大样本量# 2.3 __getItem__:实例化对象时,自动调用该方法,计算输出x张量和y张量组成的dataset结果
模型训练
  1. 常规流程:实例化循环神经网络类对象 -> 定义损失函数 -> 定义优化器 -> 循环epoch -> 循环batch -> 计算平均损失 -> 保存模型参数。
# 1. 实例化循环神经网络类对象
model = 类名(arg1, arg2, ...)# 2. 创建DataLoader对象
torch.manual_seed(常量值)  # 手动初始化随机数种子
dataloader = DataLoader(dataset, batch_size, shuffle=True)# 3. 定义损失函数(多分类使用CrossEntropy,该函数内部自动调用softmax,因此在输出层不需要手动进行softmax激活)
criterion = torch.nn.CrossEntropy()# 4. 定义优化器,直接使用Adam
optimizer = torch.optim.Adam(model.parameters(), lr, betas)  # lr:常设置为0.001,0.0001;betas:[0.9, 0.99]# 5. 循环epoch
"""记录每个epoch的平均损失值"""
total_loss = 0
total_samples = 0
# 6. 循环batch# 6.1 初始化隐藏状态hidden = model.init_hidden(batch_size)# 6.2 计算预测值y_pred, hidden = model(x, hidden)# 6.3 计算损失loss = criterion(y_pred, y)# 6.4 统计总损失total_loss += loss.item()*len(x)total_samples += len(x)# 6.5 反向传播梯度更新optimizer.zero_grad()loss.sum().backward()optimizer.step()# 7. 计算平均损失
avg_loss = total_loss / total_samples# 8.保存模型参数
torch.save(model.state_dict(), path)
模型预测
  1. 完整流程:准备数据 -> 加载模型 -> 初始化隐藏状态 -> 预测结果
"""准备数据部分主要包括:创建词表、词向量,将输入词转换为词向量
"""
# 1. 准备数据 -- 假设输入词为input_word='阴天'
unique_words, word_dict, corpus_idx = build_vocab()
input_word_index = word_dict[input_word]# 2. 加载模型
model = torch.load_state_dict(torch.load(path))# 3. 初始化隐藏状态hidden
hidden = model.init_hidden(batch_size=1)# 4. 模型预测:# 4.1 遍历要预测的词汇个数次,每次得到隐藏状态和输出结果predict_contents = input_wordfor _ in range(sentence_len):  -> sentence_len 往后预测多少个词y_pred, hidden = model(torch.tensor([[input_word_index]]), hidden)# 4.2 取最大概率的结果ountput = torch.argmax(y_pred)input_word += output  # 输出结果为字符串类型,采用字符串拼接,得到后续预测结果,形成一句话
http://www.dtcms.com/a/516132.html

相关文章:

  • 建设银行手机网站变塘厦水霖学校
  • 音乐介绍网站怎么做抖音代运营介绍
  • 假数据神器JSONPlaceholder介绍(假数据接口、模拟数据接口、模拟测试接口、Mock data interface)
  • Alpha World:以结构化金融驱动Web3共识
  • 关于jsp网站开发的最新书籍厦门网站建设哪家便宜
  • 基于频率分集阵列的MIMO雷达联合距离角度估计——论文阅读
  • 20.3 ResNet50+多模态融合!ChatPPT3.0一键生成专业级PPT全攻略
  • 甘肃省建设工程安全质量监督局网站hostgator wordpress主机
  • Fiddler使用教程,全面掌握Fiddler抓包工具的配置方法、代理设置与调试技巧(HTTPHTTPS全解析)
  • 金泉网普通会员可以建设网站吗上海网站编辑招聘
  • <数据集>yolo纸板缺陷识别数据集<目标检测>
  • ubuntu 系统扩容,多硬盘挂载
  • 上海最专业的网站设计制蒙古文政务网站建设工作汇报
  • 近红外工业相机的简单介绍和场景应用
  • 基于开源免费Odoo软件构建CRM销售管理系统
  • 网站开发有哪些要求asp.net企业门户网站源码
  • 潮州南桥市场中国建设银行网站公司建立网站的目的
  • 直流电机编码器测速
  • GraphRAG产品赋能千行百业:创邻科技“知寰Hybrid RAG”的实践与价值全景
  • Java操作PDF图层:添加、设置和删除
  • 机器人数据录制,通过遥操作的方式,操作isaacsim录制仿真数据的方法,HDF5格式秒变LeRobot标准数据集(一)
  • Linux内核InfiniBand缓存系统深度解析:高性能网络的核心引擎
  • 网站鼠标经过图片代码男女做网站
  • 罗湖网站建设费用网页游戏源码怎么用
  • MySQL 与 PostgreSQL,该怎么选
  • 【CMakeLists.txt】CMake 编译定义带值参数详解
  • 系统集成项目管理工程师第五章:软件工程核心笔记(精简版)
  • nvm切换node版本-jenkins上编译
  • 人和做网站架设网站费用
  • 支付商城网站制作韩国出线了吗