【课程总结】Day17(上):NLP自然语言处理及RNN网络

前言

在机器学习章节【课程总结】Day6(上):机器学习项目实战–外卖点评情感分析预测中,我们曾借助sklearn进行了外卖点评的情感分析预测;接下来,我们将深入了解自然语言处理的基本概念、RNN模型以及借助RNN重新进行外卖点评的情感分析预测。

自然语言处理基本概念

正如机器学习中所学内容:数据集是汉字 ,机器无法处理(因为机器学习底层是对数字的处理),所以我们首先需要对数据数字化(也叫汉字向量化)。

因此,本章我们将重新学习汉字向量化的处理过程。

汉字向量化处理步骤

分词处理

第一步:使用jieba进行分词

import jieba
import torch 
from torch import nns1 = '我吃饭了!'
s2 = '今天天气很好!'
s3 = '这辆车很好看!'
# 使用jieba分词
jieba.lcut(s3)# 输出结果
# ['这辆', '车', '很', '好看', '!']
# 对s1~s3进行分词
words = {word for sentence in [s1, s2, s3] for word in jieba.lcut(sentence)}# 输出结果为
# {'了', '今天天气', '吃饭', '好', '好看', '很', '我', '车', '这辆', '!'}# 添加中间词
# <PAD>代表填充,用于补齐保持数据集长度一致
# <UNK>代表未知词
words.add("<PAD>")
words.add("<UNK>")
构建词典

第二步:构建词典

word2idx = {word: idx for idx, word in enumerate(words)}
idx2word = {idx: word for idx, word in enumerate(words)}# word2idx内容为:
# {'很': 0,
#  '今天天气': 1,
#  '我': 2,
#  '吃饭': 3,
#  '<UNK>': 4,
#  '!': 5,
#  '<PAD>': 6,
#  '好看': 7,
#  '好': 8,
#  '了': 9,
#  '这辆': 10,
#  '车': 11}# idx2word内容为:
# {0: '很',
#  1: '今天天气',
#  2: '我',
#  3: '吃饭',
#  4: '<UNK>',
#  5: '!',
#  6: '<PAD>',
#  7: '好看',
#  8: '好',
#  9: '了',
#  10: '这辆',
#  11: '车'}
数据对齐

第三步:将数据长度对齐

idx1 = [word2idx.get(word, word2idx.get("<UNK>")) for word in jieba.lcut(s1)]
idx2 = [word2idx.get(word, word2idx.get("<UNK>")) for word in jieba.lcut(s2)]
idx3 = [word2idx.get(word, word2idx.get("<UNK>")) for word in jieba.lcut(s3)]# 运行结果:
# [2,  3,  9, 5]
# [1,  0,  8, 5]
# [10, 11, 0, 7, 5]
# 可以看到s1,s2,s3长度不一致# 补1个<PAD>,使得长度一致
idx1 = idx1 + [word2idx['<PAD>']]
idx2 = idx2 + [word2idx['<PAD>']]# 补齐后结果:
# [2,  3,  9, 5, 6]
# [1,  0,  8, 5, 6]
# [10, 11, 0, 7, 5]
# 可以看到经过补<PAD>后,s1,s2,s3长度一致
转张量

第四步:将数据转换为tensor张量

X = torch.tensor(data=[idx1, idx2, idx3], dtype=torch.long)# 运行结果:
# tensor([[ 2,  3,  9,  5,  6],
#         [ 1,  0,  8,  5,  6],
#         [10, 11,  0,  7,  5]])X.shape
# 输出结果:
# torch.Size([5, 3])

知识点补充:

  • 上述结构为 [seq_len, batch_size]
    • seq_len:序列长度
    • batch_size:批次大小
词向量处理
embedding概念

定义:“Embedding”(嵌入)是指将离散的对象(如单词、句子或其他类别)转换为连续的向量表示的过程。

nn.Embedding

nn.EmbeddingPyTorch 中用于将离散的整数索引映射到连续的向量表示的一个重要模块。它通常用于自然语言处理(NLP)任务中,将词汇表中的每个单词(或符号)映射到一个固定大小的向量空间。

概念:nn.Embedding 是一个查找表,它将每个单词的索引映射到一个稠密的向量。这个向量可以被视为该单词的嵌入(embedding),它捕捉了单词之间的语义关系。

作用

  • 维度降低:将高维的稀疏数据(如独热编码)转换为低维的稠密向量,减少计算复杂度。
  • 语义表示:嵌入向量可以捕捉单词之间的语义关系,例如“国王”和“王后”之间的关系。
  • 训练灵活性:嵌入向量是可训练的参数,随着模型的训练,向量会根据上下文的不同而调整,从而更好地表示单词的含义。
nn.Embedding的使用
# num_embeddings:词汇表的大小,即可以嵌入的单词(或符号)的总数。
# embedding_dim:每个单词嵌入向量的维度,即降维之后的向量
# 过程:
# 1.先对单词进行One-hot编码,
# 2.然后乘以可学习的降维矩阵,进行线性降维,得到稠密矩阵embed = nn.Embedding(num_embeddings=len(word2idx), embedding_dim=6)# [3, 5, 12] --> [3, 5, 6]
# [3, 5, 12]是降维矩阵,3代表有3句话,每句话5个单词,每个单词是12维的向量
# [3, 5,  6]是降维后的稠密矩阵,3代表有3句话,每句话5个单词,每个单词是6维的向量embed(X)
# 输出结果:
# tensor([[[-0.4017,  1.0236,  2.2761, -0.7839,  0.7540, -0.2321],
#          [-1.6476, -0.4885,  0.0074,  0.5844,  0.7727, -0.8194],
#          [ 1.7552, -1.5381, -0.6061,  0.9384,  1.7029, -0.8575],
#          [ 1.3455, -1.1269, -0.9036,  0.2579,  0.2227, -0.1865],
#          [-1.5439,  0.7572, -0.1988, -1.4769, -1.1864,  0.9779]],#         [[ 0.2663, -0.2779, -0.3478,  0.2670,  0.6165,  1.1189],
#          [ 0.8495, -1.6437,  0.4758,  1.7543,  1.3755, -0.3943],
#          [-0.5781,  1.8609, -0.2794,  0.0876,  0.6801, -0.5056],
#          [ 1.3455, -1.1269, -0.9036,  0.2579,  0.2227, -0.1865],
#          [-1.5439,  0.7572, -0.1988, -1.4769, -1.1864,  0.9779]],#         [[ 1.3642, -2.9807,  0.6432, -0.3364, -0.5630,  2.3331],
#          [-0.7616,  1.9371,  0.1402,  1.2046,  0.4930,  0.8405],
#          [ 0.8495, -1.6437,  0.4758,  1.7543,  1.3755, -0.3943],
#          [-0.4715,  1.9458, -0.9278, -0.7103,  0.0582,  0.6413],
#          [ 1.3455, -1.1269, -0.9036,  0.2579,  0.2227, -0.1865]]],
#        grad_fn=<EmbeddingBackward0>)embed(X).shape
# 输出结果:
# torch.Size([3, 5, 6])
# 上述结构也表示为[N ,Seq_len, Embedding_dim]

知识点补充:

  • NLP中的经典结构为 [N ,Seq_len, Embedding_dim]
  • CV中的经典结构为 [N, C, H, W]
  • 关于矩阵降维,可以查看【课程总结】Day5(下):PCA降维、SVD分解、聚类算法和集成学习进行回顾。

以上为自然语言处理基本概念,以及词向量处理。由于语言是具有时序性的,所以接下来将了解循环神经网络。

RNN循环神经网络

背景

一个例子:

“狗追猫。”
“猫追狗。”

解释:在这两个句子中,单词的顺序是不同的,但它们的意思完全相反。第一个句子表示狗在追猫,而第二个句子则表示猫在追狗。这表明,单词的排列顺序(或时序)对于理解句子的含义至关重要。

在处理有时序性的语言时,模型通常使用以下方法:

  • RNN(递归神经网络):通过循环结构来处理序列数据,能够记住之前的状态,从而捕捉时序关系。
  • LSTM(长短期记忆网络) 和 GRU(门控循环单元):这些是 RNN 的变种,能够更好地处理长距离依赖关系。

RNN的简介

循环神经网络(Recurrent Neural Network,简称RNN)是一种能够处理序列数据的神经网络模型。循环神经网络属于深度学习神经网络(DNN),与传统的前馈神经网络不同,RNN在处理每个输入时都会保留一个隐藏状态,该隐藏状态会被传递到下一个时间步,以便模型能够记忆之前的信息。

RNN的结构


资料地址:https://colah.github.io/posts/2015-08-Understanding-LSTMs/
图示说明:

  • $$X_t$$:当前时间步的输入向量。
  • $$A$$:连接输入层和隐藏层的权重矩阵。
  • $$h_t$$:当前时间步的隐状态,包含了序列的上下文信息。

例如:我吃饭了!
$$x_0$$ = “我”,$$x_0$$ 输入到权重矩阵 A 得到$$h_0$$
$$x_1$$ = “吃”,$$x_1$$ 再输入到权重矩阵与上一步的 $$h_0$$ 合并得到 $$h_1$$
$$x_2$$ = “饭”,$$x_2$$ 再输入到权重矩阵与上一步的 $$h_1$$ 合并得到 $$h_2$$

最终得到$$h_n$$$$h_n$$就是序列的上下文信息。

RNN的计算公式

h_t = \tanh(x_t W_{ih}^T + b_{ih} + h_{t-1} W_{hh}^T + b_{hh}) 
  • $$h_t$$:在时间步 $$t$$ 的隐状态,表示当前时间步的记忆。
  • $$x_t$$:在时间步 $$t$$ 的输入向量,表示当前输入。
  • $$W_{ih}$$:输入到隐状态的权重矩阵,用于将当前输入 $$x_t$$ 转换为隐状态的输入部分。
  • $$W_{hh}$$:隐状态到隐状态的权重矩阵,用于将前一时间步的隐状态 $$h_{t-1}$$ 传递到当前时间步。
  • $$b_{ih}$$$$b_{hh}$$:分别是输入和隐状态的偏置项。
  • $$\tanh$$:激活函数,通常用于引入非线性特性,使模型能够学习复杂的模式。

知识点补充:
激活函数使用了Tanh函数而不使用Sigmoid函数的原因是:

  • Sigmoid的导数范围在[0,0.25]之内;
  • Tanh的导数范围在(0,1];
  • RNN需要不断的循环,导数值小的更容易导致梯度消失。

RNN的API使用

自动循环
# 自动循环:
# 创建RNN模型
rnn = nn.RNN(input_size=6, hidden_size=7, batch_first=True)# 接着之前的例子
X1 = embed(X)out, hn = rnn(X1)
out.shape, hn.shape
# 输出结果:
# torch.Size([3, 5, 7])
# torch.Size([1, 3, 7])# out.shape:每一步的输出
# hn.shape:最后一步的输出
手写循环
# 手动循环:
# 创建RNN模型
rnn_cell = nn.RNNCell(input_size=128,hidden_size=256)X = torch.randn(13, 2, 128)
X.shape
# 输出结果:
# torch.Size([13, 2, 128])"""手写循环实现RNN
"""
h0 = torch.zeros(2, 256, dtype=torch.float32)
out = []
for x in X:h0 = rnn_cell(x, h0)out.append(h0)
out = torch.stack(out)
len(out), out.shape
# 输出结果:
# (13, torch.Size([13, 2, 256]))

项目:外卖点评情感分析预测(使用RNN)

(待补充)

内容小结

  • NLP自然语言处理
    • 数据对齐:在数据对齐时,可以通过添加<PAD>补齐长度
    • “Embedding”(嵌入)是指将离散的对象(如单词、句子或其他类别)转换为连续的向量表示的过程。
    • torch中使用nn.Embedding进行嵌入操作。
    • Embedding的过程是:先对单词进行One-hot编码,然后乘以可学习的降维矩阵,进行线性降维,得到稠密矩阵
    • NLP中的经典结构为 [N ,Seq_len, Embedding_dim]
  • RNN循环神经网络
    • RNN通过循环结构来处理序列数据,能够记住之前的状态,从而捕捉时序关系。
    • RNN在处理每个输入时都会保留一个隐藏状态,该隐藏状态会被传递到下一个时间步,以便模型能够记忆之前的信息
    • 使用RNN模型时,可以通过nn.RNN创建模型,out.shape对应是每一步的输出,hn.shape对应是最后一步的输出
    • RNN的计算公式中,激活函数使用了Tanh函数的原因是:RNN需要不断的循环,导数值小的更容易导致梯度消失。

参考资料

CSDN:【人工智能基础】RNN循环神经网络

CSDN:RNN神经网络实现文本情感分析

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

法制史学习笔记(个人向) Part.7

法制史学习笔记(个人向) Part.7 11. 清朝法律制度 11.1 立法概述 11.1.1 立法指导思想 简单来说是&#xff1a;详译明律&#xff0c;参以国制&#xff1b; 努尔哈赤时期&#xff0c;后金政权处于由习惯法到成文法的过渡过程中&#xff1b;皇太极统治时期&#xff0c;奉行“参…

细说文件操作

你好&#xff01;感谢支持孔乙己的新作&#xff0c;本文就结构体与大家分析我的思路。 希望能大佬们多多纠正及支持 &#xff01;&#xff01;&#xff01; 个人主页&#xff1a;爱摸鱼的孔乙己-CSDN博客 目录 1.什么是文件 1.1.程序设计文件 1.1.1.程序文件 1.1.2.数据文件…

【网络】TCP协议——TCP连接相关、TCP连接状态相关、TCP数据传输与控制相关、TCP数据处理和异常、基于TCP应用层协议

文章目录 Linux网络1. TCP协议1.1 TCP连接相关1.1.1 TCP协议段格式1.1.2 确定应答(ACK)机制1.1.3 超时重传机制 1.2 TCP连接状态相关1.2.1 TIME_WAIT状态1.2.2 CLOSE_WAIT 状态 1.3 TCP数据传输与控制相关1.3.1 滑动窗口1.3.2 流量控制1.3.3 拥塞控制1.3.4 延迟应答1.3.5 捎带应…

【C语言】结构体内存布局解析——字节对齐

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、引言 二、什么是字节对齐&…

使用Python绘制雷达图的简单示例

雷达图&#xff08;Radar Chart&#xff09;也被称为蜘蛛网图、星形图或极坐标图&#xff0c;是一种用于显示多变量数据的图形方法。它以一个中心点为起点&#xff0c;从中心点向外延伸出多条射线&#xff0c;每条射线代表一个特定的变量或指标。每条射线上的点或线段表示该变量…

【基础篇】MySQL数据库详解:基础知识详解

一、SQL分类 1.DDL2.DML3.DQL4.DCL二、函数 1.字符串函数2.数值函数3.日期函数4.流程函数三、约束 1.概述2.约束演示3.外键约束四、多表查询 1.多表关系2.多表查询表述3.内连接4.外连接5.自连接6.子查询五、事务 1.事务简介2.事务操作3.事务四大特性4.并发事务问题5.事务隔离级…

Git的一些简单使用

下列内容适用于git初学者&#xff0c;从创建本地git仓库到提交的一个基本过程1. 1.创建git仓库 在想创建git仓库的路径下打开git bash&#xff0c;输入以下命令行创建仓库&#xff08;一般来说&#xff0c;我觉得直接在code workspace得地方创建git仓库就可以了&#xff0c;这…

自从用了这些监控工具,我连续几天没睡好觉!

大家好&#xff0c;我是程序员鱼皮&#xff0c;今天分享一些很实用的系统监控告警工具。 为什么要用监控告警&#xff1f; 说到监控告警&#xff0c;没有企业开发经验的同学非常容易忽视它&#xff0c;甚至会有同学觉得没有必要&#xff0c;大不了出了 Bug 再修就是了。 这种…

MySQL —— 库,数据类型 与 表

库与基础操作 1.1 查看数据库 使用 show databases; 可以查看当前 MySQL 目前有多少个数据库 5 rows 表示有 5 行&#xff0c;这里是表示的是有效的数据&#xff0c;不包括 第一行的指引 set 表示结果集合 0.01 sec 表示这个 sql 语句一共运行了0.01 秒&#xff0c;一般情况…

滚珠花键:新能源汽车传动系统的核心动力传递者

在日常生活中&#xff0c;汽车已经成为了必不可少的交通工具&#xff0c;尤其是新能源汽车。而滚珠花键作为传动系统中的重要组成部分&#xff0c;在传动系统方面的作用不容忽视。 随着科技的不断发展&#xff0c;汽车行业也在不断进步&#xff0c;滚珠花键作为高精度的机械传动…

C#中的wpf基础

在WPF中&#xff0c;Grid 是一种非常强大的布局控件&#xff0c;用于创建网格布局。它允许你将界面划分为行和列&#xff0c;并将控件放置在这些行和列中。 以下是一些关键点和示例&#xff0c;帮助你理解 WPF 中的 Grid&#xff1a; 基本属性 RowDefinitions&#xff1a;定义…

中国人工智能最好50所大学排名-2024年最强学校名单

人工智能最强的学校包含&#xff1a;清华大学、上海交通大学、南京大学、西安电子科技大学、电子科技大学、中国科学技术大学、哈尔滨工业大学、华中科技大学、东南大学、浙江大学等学校。这些都是人工智能专业排名全国前十的名牌大学。 圆梦小灯塔将在下文继续为2024年高考生…

详解基于百炼平台及函数计算快速上线网页AI助手

引言 在当今这个信息爆炸的时代&#xff0c;用户对于在线服务的需求越来越趋向于即时性和个性化。无论是寻找产品信息、解决问题还是寻求建议&#xff0c;人们都期望能够获得即时反馈。这对企业来说既是挑战也是机遇——如何在海量信息中脱颖而出&#xff0c;提供高效且贴心的…

MySQL系列之--关系型数据库以及SQL语句分类之DDL数据库和表的操作

文章目录 前言关系型数据库&#xff08;RDBMS&#xff09;关系型数据库的特点 MySQL数据模型SQL介绍基本语法规则SQL语句的分类DDL的介绍DDL的数据库操作DDL的表操作 前言 上一节MySQL系列之–详细安装教程和启动方法中介绍了MySQL如何安装&#xff0c;以及如何启动和客户端连接…

现代前端架构介绍(第一部分):App是如何由不同的构建块构成的

远离JavaScript疲劳和框架大战&#xff0c;了解真正重要的东西 几周前&#xff0c;我的同事们对我们的前端架构、代码结构和面临的挑战很感兴趣。在做了几次关于如何构建可扩展且健壮的前端的演讲后&#xff0c;我觉得把它们都总结一下并与社区分享我们的策略是一个不错的主意。…

内网穿透--meterpreter端口转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网&#xff0c;然后由于私网IP的缘故&#xff0c;公网无法直接访问内部主机&#xff0c;则需要通过已连接会话&#xff0c;代理穿透访问内网主机服务。 实验设备 1.路由器一台 2.内网 Win 7一台 3.公网 Kali 一台 4.网络 …

SuccBI+低代码文档中心 — 低代码应用(SuccAP)(概论)

概述&#xff1a; 低代码是什么&#xff1f; 低代码就是通过易用的、可视化的操作、加上少量的代码或脚本的方式快速的搭建业务应用。 低代码的优势&#xff1f; 低代码可以提升开发人员的效率&#xff0c;也可以让非开发人员也能进行应用开发。 低代码的分类&#xff1a;…

『康之泉活水馆』手游:打造夏日梦幻水世界

设计背景 夏日的热浪与城市的喧嚣困扰着忙碌奔波的人群&#xff0c;康之泉活水馆&#xff0c;作为多功能的室内水上乐园&#xff0c;以其独特的魅力&#xff0c;成为夏日避暑的理想之地&#xff0c;让身心得以彻底放松。 设计理念 优联前端以康之泉品牌IP形象“康康”为灵感&a…

计算机基础(Windows 10+Office 2016)教程 —— 第4章 计算机网络与Internet(上)

第4章 计算机网络与Internet 4.1 计算机网络概述4.1.1 计算机网络的定义4.1.2 计算机网络的发展4.1.3 计算机网络的功能4.1.4 计算机网络体系结构和TCP/IP 参考模型 4.2 计算机网络的组成和分类4.2.1 计算机网络的组成4.2.2 计算机网络的分类 4.3 网络传输介质和通信设备4.3.1 …

奇安信高管合计套现7.7亿,总裁个人套现1.9亿

【文末送&#xff1a;技战法】 昨天网安一哥&#xff0c;奇安信发布《关于中电金投增持公司股份暨持股 5% 以上股东协议转让公司股份的权益变动的提示性公告》&#xff0c;公告显示中国电子将再次收购奇安信5%的股份。 公告显示&#xff0c;奇安壹号合伙人中&#xff1a;天津…