从代码学习深度学习 - 情感分析:使用循环神经网络 PyTorch版

文章目录

  • 前言
  • 1. 加载与预处理数据集
    • 数据读取与词元化
    • 构建词汇表
    • 截断、填充与数据迭代器
  • 2. 构建循环神经网络模型
    • 双向RNN模型(BiRNN)详解
    • 权重初始化
  • 3. 加载预训练词向量
    • 构建词向量加载器
    • 将预训练向量注入模型
  • 4. 训练与评估模型
    • 定义训练函数
    • 可视化训练过程
  • 5. 模型预测
    • 编写预测函数
    • 实例测试
  • 6. 总结


前言

在信息爆炸的时代,从海量的文本数据中提取有价值的信息变得至关重要。无论是电商网站的商品评论、社交媒体上的用户反馈,还是新闻文章中的观点倾向,理解文本背后的情感色彩——即情感分析——都有着广泛的应用。

循环神经网络(RNN)由于其对序列数据的强大建模能力,天然地适用于处理文本这类具有时序特征的数据。在本篇博客中,我们将从零开始,使用PyTorch框架构建一个基于双向循环神经网络(Bi-RNN)的情感分析模型。我们不仅会详细讲解数据预处理、模型构建、训练评估的全过程,还将引入预训练的GloVe词向量来提升模型的性能。

这篇博客的目标是“从代码学习深度学习”。因此,我们将完整地展示每一个模块的代码,并配以详尽的解释,力求让读者不仅能看懂代码,更能理解每一行代码背后的原理和设计思想。无论您是深度学习初学者,还是希望系统学习PyTorch在自然语言处理中应用的开发者,相信都能从中获益。

让我们一起踏上这场代码与思想的探索之旅吧!

完整代码:下载链接


1. 加载与预处理数据集

任何成功的NLP项目都始于坚实的数据处理。我们的任务是分析IMDb电影评论的情感,这是一个经典的二分类问题(正面/负面)。在这一步,我们将完成从原始文本文件到PyTorch数据迭代器的全部转换过程。

主逻辑由load_data_imdb函数驱动,它调用了一系列辅助函数来完成任务。

# 情感分析:使用循环神经网络.ipynbimport torch
import utils_for_data
from torch import nnbatch_size = 64
train_iter, test_iter, vocab = utils_for_data.load_data_imdb(batch_size)

上面的代码是我们的入口,它调用utils_for_data.load_data_imdb来获取训练/测试数据迭代器和词汇表。现在,让我们深入utils_for_data.pyutils_for_vocab.py,看看这一切是如何实现的。

数据读取与词元化

首先,我们需要从压缩包中读取IMDb数据集的文本和标签。read_imdb函数负责遍历指定目录,读取每个评论文件并为其打上正面(1)或负面(0)的标签。

# utils_for_data.pyimport os
import zipfile
import tarfile
import utils_for_vocab
import torch.utils.data as data
import torchdef extract(name, folder=None):"""下载并解压zip/tar文件参数:name (str): 要解压的文件名/路径,维度: [字符串]folder (str, optional): 指定的文件夹名称,维度: [字符串] 或 None返回:str: 解压后的目录路径,维度: [字符串]"""base_dir = os.path.dirname(name)data_dir, ext = os.path.splitext(name)if ext == '.zip':fp = zipfile.ZipFile(name, 'r')elif ext in ('.tar', '.gz'):fp = tarfile.open(name, 'r')else:assert False, '只有zip/tar文件可以被解压缩'fp.extractall(base_dir)fp.close()return os.path.join(base_dir, folder) if folder else data_dirdef read_imdb(data_dir, is_train):"""读取IMDb评论数据集文本序列和标签参数:data_dir (str): 数据集根目录路径is_train (bool): 是否读取训练集,True为训练集,False为测试集返回:tuple: (data, labels)data (list): 评论文本列表,维度为 [样本数量]labels (list): 标签列表,维度为 [样本数量],1表示正面评价,0表示负面评价"""data = []labels = []for label in ('pos', 'neg'):folder_name = os.path.join(data_dir, 'train' if is_train else 'test', label)for file in os.listdir(folder_name):file_path = os.path.join(folder_name, file)with open(file_path, 'rb') as f:review = f.read().decode('utf-8').replace('\n', '')data.append(review)labels.append(1 if label == 'pos' else 0)return data, labels

拿到原始文本后,我们需要将其分解为模型可以理解的基本单元——词元(Token)。这个过程称为词元化(Tokenization)。tokenize函数可以按单词或字符进行分割。

# utils_for_vocab.pyimport torch
import torch.utils.data
from collections import Counterdef tokenize(lines, token='word'):"""将文本行拆分为单词或字符词元参数:lines (list): 文本行列表,维度: [行数],每个元素为字符串token (str): 词元化类型,维度: [标量],'word'表示按单词分割,'char'表示按字符分割返回:tokenized_lines (list): 词元化后的文本,维度: [行数 × 词元数],嵌套列表结构"""if token == 'word':return [line.split() for line in lines]elif token == 'char':return [list(line) for line in lines]else:print('错误:未知词元类型:' + token)

构建词汇表

计算机无法直接处理文本,我们需要将词元映射为数字索引。Vocab类就是为此设计的。它会统计所有词元的频率,并只保留那些出现频率高于min_freq的词元,其余的都归为未知词元<unk>。这不仅能减小词汇表的大小,还能过滤掉噪音。

# utils_for_vocab.pydef count_corpus(tokens):"""统计词元出现频率参数:tokens (list): 词元列表,维度: [词元数] 或 [序列数 × 词元数](嵌套列表)返回:counter (Counter): 词元频率统计对象,键为词元,值为出现次数"""if len(tokens) == 0 or isinstance(tokens[0], list):tokens = [token for line in tokens for token in line]return Counter(tokens)class Vocab:"""文本词汇表类,用于管理词元到索引的映射关系"""def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):"""初始化词汇表参数:tokens (list): 词元列表,维度: [词元数] 或 [序列数 × 词元数]min_freq (int): 最小词频阈值,维度: [标量],低于此频率的词元将被忽略reserved_tokens (list): 保留词元列表,维度: [保留词元数],如特殊标记"""if tokens is None:tokens = []if reserved_tokens is None:reserved_tokens = []counter = count_corpus(tokens)self._token_freqs = sorted(counter.items()<

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

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

相关文章

化于无形的 lambda 语法

针对数据集合的每个成员进行计算是很常见的任务&#xff0c;用循环语句当然能实现&#xff0c;但比较麻烦&#xff0c;算个简单的求和都要写很多句代码。 编程语言经常把这些运算封装成函数&#xff0c;比如 Python 的 sum 函数&#xff0c;求订单价格总和是这样写的&#xff…

day42

1. 回调函数&#xff1a;把一个函数当成“任务清单”交给另一个函数&#xff0c;等后者干完活&#xff0c;就按清单执行这个函数。比如点外卖后留电话&#xff0c;骑手送到了就打电话&#xff08;执行回调&#xff09;通知你。 2. lambda函数&#xff1a;临时写的超短函数&…

百度日志中台前端重构实践

日志中台是百度内部针对打点数据的全生命周期管理平台&#xff0c;作为公司日志数据的唯一入口&#xff0c;承担以下核心职能&#xff1a;1.功能覆盖&#xff1a;提供从数据采集、传输、存储到查询分析的一站式服务&#xff0c;支持产品运营分析、研发性能监控、运维管理等多元…

資訊安全 (Information Security)3大 “CIA“要素

資訊安全之3大要素&#xff0c;業界慣用"CIA"稱之&#xff0c;包括機密性 (Confidentiality)、完整性(Integrity)與可用性(Availability)&#xff1b;更應增加諸如鑑別性、可歸責性、不可否認性與可靠性。 1.機密性 (Confidentiality) 機密性是指採用適當的安全機制…

php后台增加权限控制

背景 最近在对接某大厂&#xff0c;部署差不多了&#xff0c;但是在漏洞扫描环节有问题&#xff0c;前端是用vue代码写的。后端是php。发现前端路由可以拦截未登录的url。但是后端php接口不用登录就能访问&#xff0c;很危险 解决方法 一、创建 Auth 中间件 首先创建一个专门…

跨平台后端编程ASP.NET CORE Razor新一代Web开发框架C#

asp.net core Razor动态语言编程代替asp.net .aspx更高级吗&#xff1f; https://blog.csdn.net/xiaoyao961/article/details/148846065 C#Blazor应用-跨平台WEB开发VB.NET-CSDN博客 https://blog.csdn.net/xiaoyao961/article/details/148846437 Products.razor文件,Blazor和…

Storm-Pulse 全国强对流预报接口深度解析:从技术原理到防灾应用(附API接入示例)

2025年6月14日安徽省气象台发布的强对流黄色预警中&#xff0c;合肥、阜阳等地出现了小时雨量 30-50 毫米的短时强降水和8-10级雷暴大风&#xff0c;局地甚至观测到云闪现象。强对流天气是指由强烈上升气流引发的突发性、高破坏力天气现象&#xff0c;涵盖了短时强降水、雷暴大…

2024中国科学技术大学计算机保研上机真题

中国科学技术大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/problem 运动会比赛日程安排 题目描述 某运动会设立 M M M 个比赛项目&#xff0c;每个运动员&#xff08;共 N N N 个运动员&#xff09;可以参加多个项目&#xff0c;每个项目的比赛时长…

(LeetCode 面试经典 150 题) 122. 买卖股票的最佳时机 II (贪心)

题目&#xff1a;122. 买卖股票的最佳时机 II 思路&#xff1a;贪心&#xff0c;时间复杂度0(n)。 当天比前一天值大&#xff0c;就进行卖出的交易。购入是默认前一天已购入。 C版本&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int…

一篇文章了解XML

一、什么是 XML&#xff1f; XML 是一种结构化数据的标记语言&#xff0c;用来存储、传输和描述数据。 它和 HTML 很像&#xff0c;但它的标签是自定义的&#xff0c;不限定格式和外观&#xff0c;而是强调数据的结构和含义。 XML不是用来展示数据的&#xff0c;HTML是用来展…

react经验:i18n配置换行的富文本

应用场景 调用"useTranslations().rich"输出换行的文本。 实施步骤 1.翻译文件 例如:zh.json {"home":"第一行<br></br>第二行<font>加粗文本</font>" }2.调用rich处理标签 t.rich(home, { br: () > <br /&g…

Wpf中控件作为Binding的源

1、Xaml代码 Slider 滑动控件&#xff0c;设置了最小值0和最大值100&#xff0c;TextBox作为Binding的目标对象&#xff0c;它的Text属性作为Binding目标的属性&#xff0c;Binding的源的Source就是slider_test这个Slider滑动控件&#xff0c;Binding的源的Path就是slider_test…

【机器学习深度学习】典型的模型训练过程

目录 一、模型训练直观图 二、核心目标 三、训练过程详解 3.1 训练阶段 1、准备起点&#xff1a;输入数据 初始参数权重 2、模型尝试预测&#xff1a;变换计算 (前向传播) 3、检查错误&#xff1a;计算损失值 4、学习的关键&#xff1a;反向传播 梯度下降法 (调整权…

Mysql8.0版本未卸载干净如何重新下载

Mysql8.0版本未卸载干净如何重新下载 安装前准备 清理现有安装&#xff08;确保干净环境&#xff09; :: 停止并卸载现有MySQL服务 net stop MySQL >nul 2>&1 sc delete MySQL >nul 2>&1:: 删除旧数据目录 rd /s /q "C:\ProgramData\MySQL" &…

垃圾收集器G1ZGC详解

G1收集器(-XX:UseG1GC) G1 把堆划分为许多大小相同的 Region&#xff08;默认 1~32 MB&#xff0c;一个堆通常包含上千个 Region&#xff0c;JVM目标是不超过2048个Region(JVM源码里TARGET_REGION_NUMBER 定义)&#xff09; 不再是传统的 Eden、Survivor、Old 静态分代模型&…

Bootstrap 5学习教程,从入门到精通,Bootstrap 5 弹出框(Popovers) 语法知识点及案例(22)

Bootstrap 5 弹出框(Popovers) 语法知识点及案例 一、弹出框基本概念 弹出框(Popovers)是Bootstrap提供的一个小型覆盖层组件&#xff0c;用于显示额外的信息&#xff0c;当用户点击某个元素时出现&#xff0c;再次点击时消失。 二、弹出框基本语法知识点 1. 必需属性 dat…

轻巧灵动,智启未来 ——Kinova Gen3 Lite 机器人轻松解锁各行业自动化新姿势

近年来&#xff0c;Kinova Gen3 Lite 机器人凭借其卓越的性能、灵活的应用能力以及出色的性价比&#xff0c;在全球范围内掀起了一股热销狂潮。无论是科研机构、高校实验室&#xff0c;还是工业制造企业&#xff0c;都对它青睐有加。其销量持续攀升&#xff0c;市场占有率不断扩…

STM32 实现PID

&#x1f9f1; 一、PID核心模块&#xff08;模块化设计&#xff09; 头文件 pid_controller.h #pragma once #include <stdint.h>typedef struct {// 可调参数float Kp, Ki, Kd; // PID系数float output_min; // 输出下限float output_max; // 输出上…

基于MATLAB的BP神经网络回归模型在空气质量预测中的应用

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着城市化进程的加快和工业化的不断发展&#xff0c;空气质量问题日益受到广泛关注。空气中污染物如PM2.5、PM10、…

Linux docker拉取镜像报错解决

1、错误提示&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection 主要原因就是docker源不正确&#xff0c;需要配置一下。 2、报错如下&#xff1a; 3、解决办法&#x…