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()。
将上述处理后的所有列组合成一个列表,作为批次数据的输出.其中,该列表中的每个元素对应于一个视频数据样本中的某个信息,
例如第一个元素为所有视频的文本信息组成的张量。'''