从代码学习深度学习 - 情感分析及数据集 PyTorch版
文章目录
- 前言
- 1. 认识数据集:aclImdb
- 🔹 基本信息
- 🔹 数据结构
- 🔹 特点
- 2. 解压与读取数据
- 2.1 解压文件
- 2.2 读取评论与标签
- 3. 预处理数据集
- 3.1 词元化与构建词汇表
- 3.2 分析评论长度
- 3.3 截断与填充
- 4. 创建数据迭代器
- 5. 整合所有步骤
- 总结
前言
欢迎来到“从代码学习深度学习”系列!今天,我们将深入探讨自然语言处理(NLP)中的一个核心任务:情感分析。
随着互联网的普及,从产品评论、社交媒体到论坛讨论,我们每天都在产生海量的文本数据。这些数据背后隐藏着人们丰富的情感和观点,具有巨大的商业和研究价值。情感分析(Sentiment Analysis)正是研究如何从文本中自动识别和提取这些“隐藏”情绪的技术。它能帮助我们理解公众对政策的看法、分析市场的恐慌或乐观情绪,或是评估消费者对新产品的反馈。
我们可以将情感分析看作一项文本分类任务,即将一段可变长度的文本(如一条电影评论)映射到一个固定的类别(如“积极”或“消级”)。
为了学习这个任务,我们将使用一个非常经典的数据集——斯坦福大学的大型电影评论数据集(aclImdb)。本篇博客将带领你从零开始,详细解析每一行代码,学习如何使用 PyTorch 完成从原始数据文件到可供模型训练的数据迭代器的完整流程。
让我们开始吧!
完整代码:下载链接
1. 认识数据集:aclImdb
在动手编码之前,我们首先需要了解将要处理的数据。aclImdb_v1
数据集是情感分析领域的“Hello, World!”,几乎所有新的文本分类模型都会在这个数据集上进行性能测试。
🔹 基本信息
- 名称:
aclImdb_v1
- 任务类型:二分类情感分析(Positive / Negative)
- 语言:英语
- 规模:共 50,000 条影评文本
- 训练集:25,000 条(12,500 正面 + 12,500 负面)
- 测试集:25,000 条(12,500 正面 + 12,500 负面)
🔹 数据结构
下载并解压后,数据集的目录结构非常清晰,这为我们编写代码读取数据提供了便利:
aclImdb/
│
├── train/
│ ├── pos/ # 正面影评,每篇为一个 .txt 文件
│ ├── neg/ # 负面影评,每篇为一个 .txt 文件
│ └── unsup/ # 无标签数据(我们本次任务不会使用)
│
├── test/
│ ├── pos/ # 正面测试影评
│ └── neg/ # 负面测试影评
│
└── README
🔹 特点
- 平衡的正负样本:训练集和测试集中,正负样本数量完全相等,这有助于模型避免偏向某一类别。
- 文本长度不一:评论有长有短,非常贴近真实场景,对模型的长文本处理能力提出了挑战。
- 真实数据:所有评论均采自 IMDb 网站,语言风格多样,具有很好的代表性。
2. 解压与读取数据
现在,我们开始编写代码。第一步是解压我们下载的数据集,并将其从一个个独立的 .txt
文件读取到内存中。
2.1 解压文件
我们先定义一个辅助函数 extract
,用于自动解压 .tar.gz
或 .zip
格式的文件。
import os
import zipfile
import tarfiledef extract(name, folder=None):"""下载并解压zip/tar文件参数:name (str): 要解压的文件名/路径,维度: [字符串]folder (str, optional): 指定的文件夹名称,维度: [字符串] 或 None返回:str: 解压后的目录路径,维度: [字符串]"""# 获取文件所在的基础目录路径# fname应该是全局变量,表示文件的完整路径,维度: [字符串]base_dir = os.path.dirname(name) # base_dir维度: [字符串]# 分离文件名和扩展名# data_dir: 不含扩展名的文件路径,维度: [字符串]# ext: 文件扩展名(如'.zip', '.tar'等),维度: [字符串]data_dir, ext = os.path.splitext(name)# 根据文件扩展名选择相应的解压方式if ext == '.zip':# 处理ZIP文件# fp: ZipFile对象,用于操作ZIP文件,维度: [ZipFile对象]fp = zipfile.ZipFile(name, 'r')elif ext in ('.tar', '.gz'):# 处理TAR文件(包括.tar和.gz格式)# fp: TarFile对象,用于操作TAR文件,维度: [TarFile对象]fp = tarfile.open(name, 'r')else:# 不支持的文件格式,抛出断言错误assert False, '只有zip/tar文件可以被解压缩'# 将文件内容解压到基础目录中# base_dir: 解压的目标目录,维度: [字符串]fp.extractall(base_dir)# 关闭文件对象,释放资源fp.close()# 返回最终的目录路径# 如果指定了folder参数,则返回base_dir/folder的路径# 否则返回默认的data_dir路径# 返回值维度: [字符串]return os.path.join(base_dir, folder) if folder else data_dirextract(name="aclImdb_v1.tar.gz")
2.2 读取评论与标签
接下来,我们定义 rea