LSTM自然语言处理情感分析项目(二)加载数据集

目录

一.加载数据集

1.加载词汇表

2.构建一个简单分词器

3.打开评论文件路径并读取内容

4.将评论内容分词后作截断或填充操作

5.遍历填充或截断后的分词表,通过加载的字典来获取每个词对应的独热编码

6.打乱contents内容的顺序,划分数据集

7.返回值

二.数据类型定义

1.共享空间赋值

2.数据转化为张量

3.定义选代器对象的下一个元素

4.其他伴生方法


1. 数据加载器原理与实现路径

  • 当前核心是讲解如何手动实现一个数据加载器,而不是直接使用PyTorch中的标准DataLoader。
  • 实现的关键在于为数据集的对象定义一个__next__()方法,以便使其能够在for循环中被迭代。
  • next()方法的作用是将数据转换为模型所需的输入格式(如X, Y),并将其以元组(tuple)形式返回。

2. 手动构建数据加载器的具体步骤

  • 首先,在数据集中定义数据存储和随机化加载逻辑。
  • 然后,通过实现类中的__next__()方法,遍历数据并将其按批次打包。
  • 在返回batch数据时,需明确其内容构成,例如(batch_x, batch_y)或(batch_x, batch_y, length),并确保数据已正确转换为张量(tensor)类型。
  • 最终通过返回元组的方式,让外部的for循环可以正确地接收每一batch的数据。
python 复制代码
from tqdm import tqdm
import pickle as pkl
import random
import torch
UNK,PAD='<UNK>','<PAD>'

一.加载数据集

1.加载词汇表

pad_size是每个评论的截断长度

python 复制代码
def load_dataset(path,pad_size=70):
    contents=[]
    vocab=pkl.load(open('simplifyweibo_4_moods.pkl','rb'))

使用pickle的load()方法加载上一节保存的词表字典文件

2.构建一个简单分词器

python 复制代码
    tokenizer=lambda x: [y for y in x]

这里就是简单将每一个字当作词划分

3.打开评论文件路径并读取内容

python 复制代码
    with (open(path,'r',encoding='UTF-8') as f):
        i=0
        for line in tqdm(f):
            if i==0:
                i+=1
                continue
            if not line:
                continue
            label=int(line[0])
            content=line[2:].strip('\n')

label是标签

content是评论内容

4.将评论内容分词后作截断或填充操作

如果长度大于pad_size就截断反之填充'<PAD>'字符

python 复制代码
            words_line=[]
            token=tokenizer(content)
            seq_len=len(token)
            if pad_size:
                if len(token)<pad_size:
                    token.extend([PAD]*(pad_size-len(token)))
                else:
                    token=token[:pad_size]
                    seq_len=pad_size

5.遍历填充或截断后的分词表,通过加载的字典来获取每个词对应的独热编码

python 复制代码
            for word in token:
                words_line.append((vocab.get(word,vocab.get(UNK))))
            contents.append((words_line,int(label),seq_len))

向contents中添加该条评论每个词的独热编码列表和标签作为一个元组,与评论长度再组成一个元组返回

6.打乱contents内容的顺序,划分数据集

前80%作为训练集

80%-90%作为验证集

90%-100%作为测试集

python 复制代码
        random.shuffle(contents)#打乱顺序
        train_data=contents[:int(len(contents)*0.8)]
        dev_data=contents[int(len(contents)*0.8):int(len(contents)*0.9)]
        test_data=contents[int(len(contents)*0.9):]

7.返回值

python 复制代码
        return vocab,train_data,dev_data,test_data

返回此表词表和各个数据集

二.数据类型定义

为了再接下来的模型训练过程中我们能够循环迭代的取出数据,所以我们自定义一种数据类型包含__next__()方法

1.共享空间赋值

python 复制代码
class DatasetIterater(object):
    def __init__(self,batches,batch_size,device):
        self.batch_size=batch_size
        self.batches=batches
        self.n_batches=len(batches)//batch_size
        self.residue=False#记录划分后的数据是否存在剩余的数据
        if len(batches)%self.n_batches!=0:
            self.residue=True
        self.index=0
        self.device=device

batches是传进来的训练或测试数据

batch_size是每个批次的需要训练或测试的评论数据条数

n_batches是总共需要训练或测试的次数

residue记录划分后的数据是否存在剩余的数据

2.数据转化为张量

python 复制代码
     def _to_tensor(self,datas):
        x=torch.LongTensor([_[0] for _ in datas]).to(self.device)#评论内容
        y=torch.LongTensor([_[1] for _ in datas]).to(self.device)#评论情感
        seq_len=torch.LongTensor([_[2] for _ in datas]).to(self.device)
        return (x,seq_len),y

3.定义选代器对象的下一个元素

复制代码
--getitem__:是通过索引的方式获取数据对象中的内容。__next__ 是使用 for i in train_iter:迭代获取对象
python 复制代码
    def __next__(self):#用于定义选代器对象的下一个元素。当一个对象实现了_next 方法时,它可以被用于创建迭代器对象。
        if self.residue and self.index==self.n_batches:#当读取到数据的最后一个batch:
            batches=self.batches[self.index*self.batch_size : len(self.batches)]
            self.index+=1
            batches=self._to_tensor(batches)
            return batches
        elif self.index>self.n_batches:#当读取完最后一个batch时:
            self.index=0
            raise StopIteration#为了防止迭代永远进行,我们可以使用StopIteration(停止迭代)语句
        else:#当没有读取到最后一个batch时:
            batches=self.batches[self.index*self.batch_size : (self.index+1)*self.batch_size]#提取当前bathsize的数据
            self.index+=1
            batches=self._to_tensor(batches)
            return batches

注意:这里是利用上面的方法将数据转化为张量再返回的

4.其他伴生方法

python 复制代码
    def __iter__(self):
        return self

    def __len__(self):
        if self.residue:
            return self.n_batches+1
        else:
            return self.n_batches
相关推荐
简简单单做算法3 小时前
基于遗传优化的LSTM-Attention一维时间序列预测算法matlab仿真
人工智能·lstm·时间序列预测·lstm-attention·遗传优化
金井PRATHAMA4 小时前
产生式规则对人工智能中自然语言处理深层语义分析的影响与启示研究
人工智能·自然语言处理·知识图谱
AI浩4 小时前
大型语言模型的门控注意力:非线性、稀疏性与无注意力沉没
人工智能·语言模型·自然语言处理
金井PRATHAMA7 小时前
语义网络(Semantic Net)对人工智能中自然语言处理的深层语义分析的影响与启示
人工智能·自然语言处理·知识图谱
ai智能获客_狐狐8 小时前
智能外呼产品架构组成
人工智能·算法·自然语言处理·架构·语音识别
金井PRATHAMA9 小时前
逻辑的回归——一阶谓词逻辑及其变体在自然语言处理深层语义分析中的作用与前瞻
人工智能·机器学习·自然语言处理·数据挖掘·回归·知识图谱
LETTER•12 小时前
深入理解 LLM 分词器:BPE、WordPiece 与 Unigram
深度学习·语言模型·自然语言处理
一条数据库12 小时前
中文粤语(广州)语音语料库:6219条高质量语音数据助力粤语语音识别与自然语言处理研究
人工智能·自然语言处理·语音识别
Sunhen_Qiletian12 小时前
从语言到向量:自然语言处理核心转换技术的深度拆解与工程实践导论(自然语言处理入门必读)
人工智能·自然语言处理