资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Python

情感分析系列(一)——IMDb数据集及其预处理

Python 更新时间: 发布时间: 计算机考试归档 最新发布

情感分析系列(一)——IMDb数据集及其预处理

目录
  • 一、IMDb数据集
  • 二、数据预处理
    • 2.1 读取数据集
    • 2.2 构建数据集
  • 三、封装
  • References

一、IMDb数据集

IMDb数据集[1]是一个情感分析数据集(二分类),训练集和测试集各有 25000 25000 25000 个样本(每一个样本都是一段影评),无论是训练集还是测试集,其中的正/负类(即积极/消极)样本个数均相同,为 12500 12500 12500 个。

数据集下载:IMDb-Large Movie Review Dataset。注意,这里提供的数据集和官网的相比,仅仅删除了一些不必要的文件,其他均未改动。

结构:

$ tree aclImdb -d
aclImdb
├── test
│   ├── neg
│   └── pos
└── train
    ├── neg
    └── pos

6 directories

因文件过多,这里仅展示了目录。其中每个 neg 或 pos 目录下均有 12500 12500 12500 个文件。

二、数据预处理

导入本文所需要的所有包

import os
import torch

from torchtext.data import get_tokenizer
from torchtext.vocab import build_vocab_from_iterator
from torchtext import transforms as T
from torch.utils.data import TensorDataset
2.1 读取数据集

首先定义一个 read_imdb() 函数,它的作用是从给定的路径中读取训练集或测试集,并返回分词后的影评及其对应的标签。

这里我们采用 torchtext 的分词器进行分词:

def read_imdb(path='./aclImdb', is_train=True):
    reviews, labels = [], []
    tokenizer = get_tokenizer('basic_english')
    for label in ['pos', 'neg']:
        folder_name = os.path.join(path, 'train' if is_train else 'test', label)
        for filename in os.listdir(folder_name):
            with open(os.path.join(folder_name, filename), mode='r', encoding='utf-8') as f:
                reviews.append(tokenizer(f.read()))
                labels.append(1 if label == 'pos' else 0)
    return reviews, labels

返回的 reviews 是一个二维列表,即 reviews[0] 代表一段(分词了的)影评,reviews[0][0] 代表这段影评中的一个词元。返回的 labels 是一个一维列表,其中的每个元素非 0 0 0 即 1 1 1。 0 0 0 代表是消极影评(负样本), 1 1 1 代表是积极影评(正样本)。

2.2 构建数据集

经过简单的统计可以发现,分词后,训练集中最短影评的长度为 11 11 11,最长影评的长度为 2752 2752 2752,平均长度为 271 271 271;测试集中最短影评的长度为 8 8 8,最长影评的长度为 2623 2623 2623,平均长度为 265 265 265。

因为批量加载句子需要统一长度,所以这里我们选择 512 512 512 作为标准,长度超过 512 512 512 的进行截断,长度不到 512 512 512 的使用填充词元 进行填充。

对于截断和填充操作,这里选择调用 torchtext.transforms 中的相关API:

def build_dataset(reviews, labels, vocab, max_len=512):
    text_transform = T.Sequential(
        T.VocabTransform(vocab=vocab),
        T.Truncate(max_seq_len=max_len),
        T.ToTensor(padding_value=vocab['']),
        T.PadTransform(max_length=max_len, pad_value=vocab['']),
    )
    dataset = TensorDataset(text_transform(reviews), torch.tensor(labels))
    return dataset

对于词典,我们依然采用 torchtext 中提供的API,之后就可以设置一个 load_imdb() 函数用来加载数据集:

def load_imdb():
    reviews_train, labels_train = read_imdb(is_train=True)
    reviews_test, labels_test = read_imdb(is_train=False)
    vocab = build_vocab_from_iterator(reviews_train, min_freq=3, specials=['', '', '', ''])
    vocab.set_default_index(vocab[''])
    train_data = build_dataset(reviews_train, labels_train, vocab)
    test_data = build_dataset(reviews_test, labels_test, vocab)
    return train_data, test_data, vocab

这里之所以加上 这两个特殊词元是因为本系列稍后的文章会将BERT应用在该数据集上。

三、封装

为了让项目更加结构化,我们将上述三个函数封装进 data_preprocess.py 文件中,之后需要加载数据集的时候,只需要简单导入:

from data_preprocess import load_imdb

References

[1] https://ai.stanford.edu/~amaas/data/sentiment/

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/1041505.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【情感分析系列(一)——IMDb数据集及其预处理】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2