【自然语言处理入门】代码学习

GitHub - xiaoqiangzhang203/Multi-modal-Sarcasm-Detection-ConAttSD

目录结构

 

dataloader_make_umask.py

根据文件名 dataloader_make_umask.py,可以猜测该文件的功能是创建一个数据加载器,并对数据进行预处理,生成一个掩码(umask)。

import random
import os
import numpy as np
import torch
def seed_torch(seed):
    seed = int(seed)
    random.seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False
    torch.backends.cudnn.enabled = False

import torch
from torch.utils.data import Dataset
from torch.nn.utils.rnn import pad_sequence
import pickle
import pandas as pd
seed_torch(20210412)

class MUSTARDDataset(Dataset):
    #path:pickle 文件的路径。
    #train:一个布尔类型的参数,表示是否为训练数据,默认为 True。
    def __init__(self, path, train=True):#读取视频数据集的相关信息
        with open(path, 'rb') as file:
            data=pickle.load(file, encoding='latin1')# pickle 文件中读取数据,并将其存储在 data 变量中。
        self.videoIDs = data[0]#视频 ID
        self.videoSpeakers = data[1]#讲话人
        self.sarcasmslabel = data[2]#讽刺标签
        self.sentiment_implicit=data[3]#隐含情感标签
        self.sentiment_explicit=data[4]#显式情感标签
        self.videoText = data[7]#文本
        self.videoAudio = data[8]#音频
        self.videoVisual = data[9]#视觉
        self.videoSentence = data[10]#视频句子
        self.trainVid = sorted(data[11])#将训练数据的视频 ID 存储在 trainVid 变量中,并进行排序。
        self.testVid = sorted(data[12])#将测试数据的视频 ID 存储在 trainVid 变量中,并进行排序。
        self.keys = [x for x in (self.trainVid if train else self.testVid)]#如果 train 为 True,则使用 self.trainVid(训练视频的 ID);
        # 否则使用 self.testVid(测试视频的 ID)。然后,将所选的视频 ID 存储在 self.keys 列表中。
        self.len = len(self.keys)#获取数据集的长度,即视频的数量,并将其存储在 len 变量中。


    def __getitem__(self, index):#根据指定的索引位置 index,获取对应的视频数据样本

        vid = self.keys[index]#从数据集中获取指定索引位置 index 对应的视频 ID keys
        #true

        umask=[]
        # 标签掩码,其长度与标签序列的长度相同,其中最后一个位置的值为 1,其余位置的值为 0。
        #chat:标签掩码可以用于在训练模型时,指示模型对标签序列中最后一个标签进行预测。
        labellen=len(self.sarcasmslabel[vid])##讽刺标签
        for i in range (labellen):
            if i!= labellen-1:
                umask.append(0)
            else:
                umask.append(1)

        # 根据视频 ID vid 获取对应的文本、视觉、音频、说话人、标签等数据,转换为浮点数张量/长整型张量
        return torch.FloatTensor(self.videoText[vid]), \
               torch.FloatTensor(self.videoVisual[vid]), \
               torch.FloatTensor(self.videoAudio[vid]), \
               torch.FloatTensor(self.videoSpeakers[vid]), \
               torch.FloatTensor(umask), \
               torch.LongTensor(self.sarcasmslabel[vid]), \
               torch.LongTensor(self.sentiment_implicit[vid]), \
               torch.LongTensor(self.sentiment_explicit[vid]), \
               vid




    def __len__(self):
        return self.len

    def collate_fn(self, data):#用于将多个视频数据样本组合成一个批次数据(Batch Data)

        dat = pd.DataFrame(data)#将多个视频数据样本 data 转换为 Pandas 数据帧
        return [pad_sequence(dat[i]) if i<4 else pad_sequence(dat[i], True) if i<8 else dat[i].tolist() for i in dat]
        '''如果该列的索引值 i 小于 4,即为视频的文本、视觉、音频、说话人信息,就将该列进行填充(Pad)操作,
        使得每个视频的该信息在该列上的长度相同。pad_sequence 函数进行填充操作,即 pad_sequence(dat[i])。

        如果该列的索引值 i 小于 8 且大于等于 4,
        即为标签掩码、讽刺标签、隐含情感标签、显式情感标签,
        同样进行填充操作,并将填充后的结果转换为布尔型张量(BoolTensor)。
        这里使用了 pad_sequence 函数的另一种形式进行填充操作,即 pad_sequence(dat[i], True)。
        
        如果该列的索引值 i 大于等于 8,即为视频的 ID(标识符),就将该列转换为列表类型(List),即 dat[i].tolist()。
        将上述处理后的所有列组合成一个列表,作为批次数据的输出.其中,该列表中的每个元素对应于一个视频数据样本中的某个信息,
        例如第一个元素为所有视频的文本信息组成的张量。'''
        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值