当前位置: 首页 > news >正文

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

目录

一.加载数据集

1.加载词汇表

2.构建一个简单分词器

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

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

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

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

7.返回值

二.数据类型定义

1.共享空间赋值

2.数据转化为张量

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

4.其他伴生方法


from tqdm import tqdm
import pickle as pkl
import random
import torch
UNK,PAD='<UNK>','<PAD>'

一.加载数据集

1.加载词汇表

pad_size是每个评论的截断长度

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

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

2.构建一个简单分词器

    tokenizer=lambda x: [y for y in x]

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

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

    with (open(path,'r',encoding='UTF-8') as f):i=0for line in tqdm(f):if i==0:i+=1continueif not line:continuelabel=int(line[0])content=line[2:].strip('\n')

label是标签

content是评论内容

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

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

            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.遍历填充或截断后的分词表,通过加载的字典来获取每个词对应的独热编码

            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%作为测试集

        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.返回值

        return vocab,train_data,dev_data,test_data

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

二.数据类型定义

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

1.共享空间赋值

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

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

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

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

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

2.数据转化为张量

     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:迭代获取对象
    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+=1batches=self._to_tensor(batches)return batcheselif self.index>self.n_batches:#当读取完最后一个batch时:self.index=0raise StopIteration#为了防止迭代永远进行,我们可以使用StopIteration(停止迭代)语句else:#当没有读取到最后一个batch时:batches=self.batches[self.index*self.batch_size : (self.index+1)*self.batch_size]#提取当前bathsize的数据self.index+=1batches=self._to_tensor(batches)return batches

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

4.其他伴生方法

    def __iter__(self):return selfdef __len__(self):if self.residue:return self.n_batches+1else:return self.n_batches

http://www.dtcms.com/a/419160.html

相关文章:

  • 自定义渲染管线 Custom Render Pipeline
  • 【循环神经网络3】门控循环单元GRU详解
  • 邯郸网站设计做网站的动态图片
  • 建网站要花钱吗网络建设推广
  • 【Java并发】揭秘Lock体系 -- 深入理解AbstractQueuedSynchronizer(AQS)
  • 3.8 数据链路层设备 (答案见原书 P122)
  • 轻松修复 WordPress 的“缺少临时文件夹”错误
  • PHP智能开发工具PhpStorm v2025.2全新上线——支持PHPUnit 12等
  • MySQL 事务和 Spring 事务
  • 怎样免费建立网站广州工商注册查询系统官网
  • 广州新建站wordpress 缩略图 oss
  • JVM 目录
  • Unity学习之常用的数据结构
  • 【C++实战(51)】C++11新特性实战:移动语义与右值引用,解锁性能密码
  • 做宠物的网站有哪些做任务 网站
  • python做网站缺点公司建设官方网站
  • 【笔记】1.1 化学电源的组成
  • 【面试题】HTTP与HTTPS的区别
  • 虚幻引擎|UE5制作DeepSeek插件并打包发布
  • 做链接的网站深圳门窗在哪里网站做推广
  • destoon 网站搬家做app找什么公司
  • UniApp键盘监听全攻略
  • SpringBoot09-自动配置原理
  • 网站网页设计培训班太原网站怎么做seo
  • 阿里云 个人网站备案营销软文模板
  • [论文阅读] AI赋能 | 当AI看懂交通摄像头:多模态大模型零样本检测的实战报告
  • IDC发布AI+政务、财政、应急三大市场空间与厂商份额报告
  • 情绪识别论文阅读——EMO
  • 做网站 英语如何做网站的内链优化
  • 昆山便宜做网站企业网站html模板免费下载