├── .DS_Store ├── .idea ├── .gitignore ├── MELD-sentiment-analysis.iml ├── csv-plugin.xml ├── deployment.xml ├── inspectionProfiles │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── remote-mappings.xml ├── vcs.xml └── webServers.xml ├── Model ├── BertModel.py ├── HubertModel.py ├── MultiModal1.py ├── MultiModal2.py ├── MultiModal3.py ├── __init__.py ├── multiheadattention.py ├── position_embedding.py └── transformer.py ├── Readme.md ├── data ├── .DS_Store ├── MELD │ ├── datasets.yaml │ ├── dev_sent_emo.csv │ ├── test_sent_emo.csv │ └── train_sent_emo.csv ├── MELD_Dyadic │ ├── dev_sent_emo_dya.csv │ ├── test_sent_emo_dya.csv │ └── train_sent_emo_dya.csv ├── emorynlp │ ├── emorynlp_dev_final.csv │ ├── emorynlp_test_final.csv │ └── emorynlp_train_final.csv ├── mp4towav.py └── pickles │ └── download-features.txt ├── download.py ├── finetuning ├── Multi_feature_tuning2.py ├── text_trainer.py └── train.py ├── main.py ├── readmeImg ├── img.png ├── img_1.png └── img_2.png ├── requirements.txt ├── setting ├── __init__.py ├── config.py └── setting.py ├── test.py ├── utils ├── __init__.py ├── bert.py ├── common.py ├── data.py ├── hubert.py ├── multi.py ├── read_emorynlp.py └── read_meld.py └── 有用的链接.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiloQ/MELD-Sentiment-Analysis/daa4a978cd628a29e0dffb2630489e808f078c5d/.DS_Store -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/MELD-sentiment-analysis.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/csv-plugin.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 50 | 51 | -------------------------------------------------------------------------------- /.idea/deployment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 30 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/remote-mappings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/webServers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /Model/BertModel.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | from transformers import AutoConfig,BertModel 4 | from setting import setting 5 | import torch.nn.functional as F 6 | 7 | 8 | 9 | class BertForSequenceClassifaction(nn.Module): 10 | def __init__(self,drop=0.2,label_num=3): 11 | super(BertForSequenceClassifaction,self).__init__() 12 | self.config = AutoConfig.from_pretrained(setting.config_path) 13 | self.pretrained_model = BertModel.from_pretrained(setting.model_path) 14 | self.fc_dropout = nn.Dropout(drop) 15 | self.fc = nn.Linear(768,label_num) # BERT最后一层输出是768 16 | self.criterion = nn.CrossEntropyLoss() 17 | 18 | 19 | def forward(self,inputs): #直接把batch的字典给送进去 20 | # 我们不送进去labels,只送input_ids 和attention_mask 21 | 22 | outputs = self.pretrained_model(input_ids=inputs["input_ids"], 23 | attention_mask=inputs["attention_mask"], 24 | token_type_ids=inputs["token_type_ids"], 25 | return_dict=True) 26 | 27 | preds = self.fc(self.fc_dropout(torch.mean(outputs.get('last_hidden_state'), 1))) 28 | return F.log_softmax(preds,dim=1) 29 | 30 | 31 | def cal_loss(self,preds,labels): 32 | #将labels 变成one-hot 编码 33 | one_hot_labels = torch.eye(len(setting.Emotion_list))[labels,:].cuda() 34 | return self.criterion(preds,one_hot_labels) 35 | 36 | # if __name__ == "__main__": 37 | # model = HubertForSequenceClassfication() 38 | # print(model.config.return_attention_mask) 39 | # 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Model/HubertModel.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | from transformers import AutoConfig,HubertModel 4 | from setting import setting 5 | import torch.nn.functional as F 6 | 7 | 8 | 9 | class HubertForSequenceClassfication(nn.Module): 10 | def __init__(self,drop=0.2,fc_hiddensize=768,label_num=7): 11 | super(HubertForSequenceClassfication,self).__init__() 12 | 13 | 14 | self.config = AutoConfig.from_pretrained(setting.AudioConfig_path) 15 | self.pretrained_model = HubertModel.from_pretrained(setting.AudioModel_path) 16 | self.fc_dropout = nn.Dropout(drop) 17 | self.fc = nn.Linear(fc_hiddensize,label_num) 18 | self.criterion = nn.CrossEntropyLoss() 19 | 20 | 21 | def forward(self,inputs): #直接把batch的字典给送进去 22 | 23 | 24 | 25 | outputs = self.pretrained_model(input_values=inputs["input_values"], 26 | return_dict=True) 27 | preds = self.fc(self.fc_dropout(torch.mean(outputs.get('last_hidden_state'), 1))) 28 | return F.log_softmax(preds,dim=1) 29 | 30 | 31 | def cal_loss(self,preds,labels): 32 | #将labels 变成one-hot编码 33 | #device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") 34 | one_hot_labels = torch.eye(len(setting.Emotion_list))[labels,:].cuda() 35 | 36 | return self.criterion(preds,one_hot_labels) 37 | 38 | # if __name__ == "__main__": 39 | # model = HubertForSequenceClassfication() 40 | # print(model.config.return_attention_mask) 41 | # 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /Model/MultiModal1.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | from transformers import AutoConfig,HubertModel,BertModel 4 | from setting import setting 5 | import torch.nn.functional as F 6 | 7 | """ 8 | 多模态1 使用 9 | bert和hubert提取特征之后 10 | 将text和audio特征concat之后 11 | 送入分类网络 12 | """ 13 | 14 | class MultiModal1(nn.Module): 15 | def __init__(self,drop=0.25,label_num=7): 16 | super(MultiModal1,self).__init__() 17 | self.text_pretrained_model = BertModel.from_pretrained(setting.model_path) 18 | self.audio_pretrained_model = HubertModel.from_pretrained(setting.AudioModel_path) 19 | self.fc_dropout = nn.Dropout(drop) 20 | self.fc1 = nn.Linear(2*768,1200) 21 | self.fc2 = nn.Linear(1200,600) 22 | self.fc3 = nn.Linear(600,300) 23 | self.fc4 = nn.Linear(300,label_num) 24 | self.fc = nn.Linear(2*768,label_num) 25 | self.criterion = nn.CrossEntropyLoss() 26 | 27 | def forward(self, text_batch,audio_batch): # 直接把batch的字典给送进去 28 | 29 | ## Bert部分网络 30 | text_outputs= self.text_pretrained_model(input_ids=text_batch["input_ids"], 31 | attention_mask = text_batch["attention_mask"], 32 | token_type_ids = text_batch["token_type_ids"], 33 | return_dict = True 34 | ) 35 | text_feature = torch.mean(text_outputs.get('last_hidden_state'),1) 36 | ## Hubert 部分网络 37 | audio_outputs = self.audio_pretrained_model( 38 | input_values=audio_batch["input_values"], 39 | return_dict=True 40 | ) 41 | audio_feature = torch.mean(audio_outputs.get('last_hidden_state'),1) 42 | concat_feature = torch.concat((text_feature,audio_feature),dim=1) 43 | 44 | l1 = self.fc1(self.fc_dropout(concat_feature)) 45 | l2 = self.fc2(self.fc_dropout(l1)) 46 | l3 = self.fc3(l2) 47 | preds = self.fc4(l3) 48 | 49 | # preds = self.fc3(self.fc_dropout(l2)) 50 | #preds = self.fc(self.fc_dropout(concat_feature)) 51 | return F.log_softmax(preds, dim=1) 52 | 53 | def cal_loss(self, preds, labels): 54 | # 将labels 变成one-hot编码 55 | # device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") 56 | one_hot_labels = torch.eye(len(setting.Emotion_list))[labels, :] 57 | preds_cpu = preds.cpu() 58 | return self.criterion(preds_cpu, one_hot_labels) 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | if __name__ == "__main__": 67 | model = MultiModal1() 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /Model/MultiModal2.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | from transformers import AutoConfig,HubertModel,BertModel 4 | from setting import setting 5 | import torch.nn.functional as F 6 | 7 | """ 8 | MultiModal2 和1 大体相同 9 | 调整了分类网络的全连接层 10 | """ 11 | class MultiModal2(nn.Module): 12 | def __init__(self,drop=0.25,label_num=7): 13 | super(MultiModal2,self).__init__() 14 | self.text_pretrained_model = BertModel.from_pretrained(setting.model_path) 15 | self.audio_pretrained_model = HubertModel.from_pretrained(setting.AudioModel_path) 16 | self.fc_dropout = nn.Dropout(drop) 17 | self.fc1 = nn.Linear(2*768,2400) 18 | self.fc2 = nn.Linear(2400,600) 19 | self.fc3 = nn.Linear(600,label_num) 20 | 21 | self.fc = nn.Linear(2*768,label_num) 22 | self.criterion = nn.CrossEntropyLoss() 23 | 24 | def forward(self, text_batch,audio_batch): # 直接把batch的字典给送进去 25 | 26 | ## Bert部分网络 27 | text_outputs= self.text_pretrained_model(input_ids=text_batch["input_ids"], 28 | attention_mask = text_batch["attention_mask"], 29 | token_type_ids = text_batch["token_type_ids"], 30 | return_dict = True 31 | ) 32 | text_feature = torch.mean(text_outputs.get('last_hidden_state'),1) 33 | ## Hubert 部分网络 34 | audio_outputs = self.audio_pretrained_model( 35 | input_values=audio_batch["input_values"], 36 | return_dict=True 37 | ) 38 | audio_feature = torch.mean(audio_outputs.get('last_hidden_state'),1) 39 | concat_feature = torch.concat((text_feature,audio_feature),dim=1) 40 | 41 | l1 = self.fc1(self.fc_dropout(concat_feature)) 42 | l2 = self.fc2(self.fc_dropout(l1)) 43 | preds = self.fc3(l2) 44 | 45 | # preds = self.fc3(self.fc_dropout(l2)) 46 | #preds = self.fc(self.fc_dropout(concat_feature)) 47 | return F.log_softmax(preds, dim=1) 48 | 49 | def cal_loss(self, preds, labels): 50 | # 将labels 变成one-hot编码 51 | # device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") 52 | one_hot_labels = torch.eye(len(setting.Emotion_list))[labels, :] 53 | preds_cpu = preds.cpu() 54 | return self.criterion(preds_cpu, one_hot_labels) 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | if __name__ == "__main__": 63 | model = MultiModal2() 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /Model/MultiModal3.py: -------------------------------------------------------------------------------- 1 | """ 2 | 本个multimodal 使用crossmodal attention技术 3 | """ 4 | 5 | import torch.nn as nn 6 | from transformers import BertModel,HubertModel 7 | from setting import setting 8 | import torch 9 | import torch.nn.functional as F 10 | from Model.transformer import TransformerEncoder 11 | 12 | 13 | class MultiModal3(nn.Module): 14 | def __init__(self,labels = 7): 15 | super(MultiModal3,self).__init__() 16 | self.training = True 17 | self.attn_dropout = 0.3 18 | self.attn_dropout_a = 0.1 19 | self.relu_dropout = 0.1 20 | self.res_dropout = 0.1 21 | self.embed_dropout = 0.1 22 | self.out_dropout = 0.1 23 | self.num_heads = 5 24 | self.attn_mask = False 25 | self.layers = 5 26 | self.outputdim = labels 27 | self.text_pretrained_model = BertModel.from_pretrained(setting.model_path) 28 | self.audio_pretrained_model = HubertModel.from_pretrained(setting.AudioModel_path) 29 | self.origin_d_text,self.origin_d_audio = 768,768 #经过两个预训练网络送出来的特征是768维度的 30 | self.d_text,self.d_audio = 30,30 # 送入之后的去做cross modal attention的我们用少一点的维度去训练 31 | self.combined_dim= self.d_text+self.d_audio 32 | # 1. Temporal convolutional layers 33 | self.proj_text = nn.Conv1d(self.origin_d_text, self.d_text, kernel_size=1, padding=0, bias=False) 34 | self.proj_audio= nn.Conv1d(self.origin_d_audio, self.d_audio, kernel_size=1, padding=0, bias=False) 35 | 36 | 37 | # 2. Cross Modal Attention 38 | 39 | self.trans_text_with_audio = self.get_network(self_type='ta') 40 | self.trans_audio_with_text = self.get_network(self_type='at') 41 | 42 | # 3. Self Attention 43 | self.trans_t_mem = self.get_network(self_type='t_mem', layers=3) 44 | self.trans_a_mem = self.get_network(self_type='a_mem', layers=3) 45 | 46 | self.fc = nn.Linear(self.combined_dim,self.combined_dim) 47 | self.fc0 = nn.Linear(self.combined_dim,self.combined_dim) 48 | self.fc1 = nn.Linear(self.combined_dim,200) 49 | self.fc2 = nn.Linear(200,self.outputdim) 50 | 51 | 52 | 53 | self.criterion = nn.CrossEntropyLoss() 54 | 55 | 56 | 57 | def get_network(self, self_type='t', layers=-1): 58 | if self_type in ['t', 'at', 'vt']: 59 | embed_dim, attn_dropout = self.d_text, self.attn_dropout 60 | elif self_type in ['a', 'ta', 'va']: 61 | embed_dim, attn_dropout = self.d_audio, self.attn_dropout_a 62 | 63 | elif self_type == 't_mem': 64 | embed_dim, attn_dropout = self.d_text, self.attn_dropout 65 | elif self_type == 'a_mem': 66 | embed_dim, attn_dropout = self.d_audio, self.attn_dropout 67 | else: 68 | raise ValueError("Unknown network type") 69 | 70 | return TransformerEncoder(embed_dim=embed_dim, 71 | num_heads=self.num_heads, 72 | layers=max(self.layers, layers), 73 | attn_dropout=attn_dropout, 74 | relu_dropout=self.relu_dropout, 75 | res_dropout=self.res_dropout, 76 | embed_dropout=self.embed_dropout, 77 | attn_mask=self.attn_mask) 78 | 79 | def forward(self, text_batch, audio_batch): # 直接把batch的字典给送进去 80 | 81 | ## Bert部分网络 82 | text_outputs = self.text_pretrained_model(input_ids=text_batch["input_ids"], 83 | attention_mask=text_batch["attention_mask"], 84 | token_type_ids=text_batch["token_type_ids"], 85 | return_dict=True 86 | ) 87 | text_feature = text_outputs.get('last_hidden_state',1) 88 | ## Hubert 部分网络 89 | audio_outputs = self.audio_pretrained_model( 90 | input_values=audio_batch["input_values"], 91 | return_dict=True 92 | ) 93 | audio_feature = audio_outputs.get('last_hidden_state',1) 94 | ## 此时text_feature 和audio_feature为 [batch_size,seqLen,embed_dim] 95 | 96 | 97 | text_feature = F.dropout(text_feature.transpose(1,2),p=self.embed_dropout,training=self.training) 98 | audio_feature = audio_feature.transpose(1,2) 99 | 100 | # 将feature 变成 [batch_size,embed_dim,seqLen] 然后送入卷积层 101 | proj_text_feature = self.proj_text(text_feature) 102 | proj_audio_feature = self.proj_audio(audio_feature) 103 | 104 | proj_text_feature = proj_text_feature.permute(2,0,1) 105 | proj_audio_feature = proj_audio_feature.permute(2,0,1) 106 | # now feature size 为[seqLen,batchsize,embedding] 然后送入attention模块 107 | 108 | text_with_audio = self.trans_text_with_audio(proj_text_feature,proj_audio_feature,proj_audio_feature) 109 | ta_selattn = self.trans_t_mem(text_with_audio) 110 | last_ta = ta_selattn[-1] ##取最后的output去预测 111 | audio_with_text = self.trans_audio_with_text(proj_audio_feature,proj_text_feature,proj_text_feature) 112 | at_selattn = self.trans_a_mem(audio_with_text) 113 | last_at = at_selattn[-1] 114 | 115 | last_hidden_state = torch.concat([last_ta,last_at],dim=1) 116 | 117 | # A residual block 118 | last_hs_proj = self.fc0(F.dropout(F.relu(self.fc(last_hidden_state)), p=self.out_dropout, training=self.training)) 119 | last_hs_proj += last_hidden_state 120 | 121 | output1 = F.dropout(self.fc1(last_hs_proj),p=0.2) 122 | preds = self.fc2(output1) 123 | return F.log_softmax(preds, dim=1) 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | def cal_loss(self, preds, labels): 140 | # 将labels 变成one-hot编码 141 | # device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") 142 | one_hot_labels = torch.eye(len(setting.Emotion_list))[labels, :] 143 | 144 | return self.criterion(preds, one_hot_labels.cuda()) 145 | -------------------------------------------------------------------------------- /Model/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiloQ/MELD-Sentiment-Analysis/daa4a978cd628a29e0dffb2630489e808f078c5d/Model/__init__.py -------------------------------------------------------------------------------- /Model/multiheadattention.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | from torch.nn import Parameter 4 | import torch.nn.functional as F 5 | 6 | 7 | 8 | class MultiHeadAttention(nn.Module): 9 | """Multi-headed attention. 10 | See "Attention Is All You Need" for more details. 11 | """ 12 | 13 | def __init__(self, embed_dim, num_heads, attn_dropout=0., 14 | bias=True, add_bias_kv=False, add_zero_attn=False): 15 | super().__init__() 16 | self.embed_dim = embed_dim 17 | self.num_heads = num_heads 18 | self.attn_dropout = attn_dropout 19 | self.head_dim = embed_dim // num_heads 20 | assert self.head_dim * num_heads == self.embed_dim, "embed_dim must be divisible by num_heads" 21 | self.scaling = self.head_dim ** -0.5 22 | 23 | self.in_proj_weight = Parameter(torch.Tensor(3 * embed_dim, embed_dim)) 24 | self.register_parameter('in_proj_bias', None) 25 | if bias: 26 | self.in_proj_bias = Parameter(torch.Tensor(3 * embed_dim)) 27 | self.out_proj = nn.Linear(embed_dim, embed_dim, bias=bias) 28 | 29 | if add_bias_kv: 30 | self.bias_k = Parameter(torch.Tensor(1, 1, embed_dim)) 31 | self.bias_v = Parameter(torch.Tensor(1, 1, embed_dim)) 32 | else: 33 | self.bias_k = self.bias_v = None 34 | 35 | self.add_zero_attn = add_zero_attn 36 | 37 | self.reset_parameters() 38 | 39 | def reset_parameters(self): 40 | nn.init.xavier_uniform_(self.in_proj_weight) 41 | nn.init.xavier_uniform_(self.out_proj.weight) 42 | if self.in_proj_bias is not None: 43 | nn.init.constant_(self.in_proj_bias, 0.) 44 | nn.init.constant_(self.out_proj.bias, 0.) 45 | if self.bias_k is not None: 46 | nn.init.xavier_normal_(self.bias_k) 47 | if self.bias_v is not None: 48 | nn.init.xavier_normal_(self.bias_v) 49 | 50 | def forward(self, query, key, value, attn_mask=None): 51 | """Input shape: Time x Batch x Channel 52 | Self-attention can be implemented by passing in the same arguments for 53 | query, key and value. Timesteps can be masked by supplying a T x T mask in the 54 | `attn_mask` argument. Padding elements can be excluded from 55 | the key by passing a binary ByteTensor (`key_padding_mask`) with shape: 56 | batch x src_len, where padding elements are indicated by 1s. 57 | """ 58 | qkv_same = query.data_ptr() == key.data_ptr() == value.data_ptr() 59 | kv_same = key.data_ptr() == value.data_ptr() 60 | 61 | tgt_len, bsz, embed_dim = query.size() 62 | assert embed_dim == self.embed_dim 63 | assert list(query.size()) == [tgt_len, bsz, embed_dim] 64 | assert key.size() == value.size() 65 | 66 | aved_state = None 67 | 68 | if qkv_same: 69 | # self-attention 70 | q, k, v = self.in_proj_qkv(query) 71 | elif kv_same: 72 | # encoder-decoder attention 73 | q = self.in_proj_q(query) 74 | 75 | if key is None: 76 | assert value is None 77 | k = v = None 78 | else: 79 | k, v = self.in_proj_kv(key) 80 | else: 81 | q = self.in_proj_q(query) 82 | k = self.in_proj_k(key) 83 | v = self.in_proj_v(value) 84 | q = q * self.scaling 85 | 86 | if self.bias_k is not None: 87 | assert self.bias_v is not None 88 | k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) 89 | v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) 90 | if attn_mask is not None: 91 | attn_mask = torch.cat([attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1) 92 | 93 | q = q.contiguous().view(tgt_len, bsz * self.num_heads, self.head_dim).transpose(0, 1) 94 | if k is not None: 95 | k = k.contiguous().view(-1, bsz * self.num_heads, self.head_dim).transpose(0, 1) 96 | if v is not None: 97 | v = v.contiguous().view(-1, bsz * self.num_heads, self.head_dim).transpose(0, 1) 98 | 99 | src_len = k.size(1) 100 | 101 | if self.add_zero_attn: 102 | src_len += 1 103 | k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) 104 | v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) 105 | if attn_mask is not None: 106 | attn_mask = torch.cat([attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1) 107 | 108 | attn_weights = torch.bmm(q, k.transpose(1, 2)) 109 | assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] 110 | 111 | if attn_mask is not None: 112 | try: 113 | attn_weights += attn_mask.unsqueeze(0) 114 | except: 115 | print(attn_weights.shape) 116 | print(attn_mask.unsqueeze(0).shape) 117 | assert False 118 | 119 | attn_weights = F.softmax(attn_weights.float(), dim=-1).type_as(attn_weights) 120 | # attn_weights = F.relu(attn_weights) 121 | # attn_weights = attn_weights / torch.max(attn_weights) 122 | attn_weights = F.dropout(attn_weights, p=self.attn_dropout, training=self.training) 123 | 124 | attn = torch.bmm(attn_weights, v) 125 | assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] 126 | 127 | attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) 128 | attn = self.out_proj(attn) 129 | 130 | # average attention weights over heads 131 | attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) 132 | attn_weights = attn_weights.sum(dim=1) / self.num_heads 133 | return attn, attn_weights 134 | 135 | def in_proj_qkv(self, query): 136 | return self._in_proj(query).chunk(3, dim=-1) 137 | 138 | def in_proj_kv(self, key): 139 | return self._in_proj(key, start=self.embed_dim).chunk(2, dim=-1) 140 | 141 | def in_proj_q(self, query, **kwargs): 142 | return self._in_proj(query, end=self.embed_dim, **kwargs) 143 | 144 | def in_proj_k(self, key): 145 | return self._in_proj(key, start=self.embed_dim, end=2 * self.embed_dim) 146 | 147 | def in_proj_v(self, value): 148 | return self._in_proj(value, start=2 * self.embed_dim) 149 | 150 | def _in_proj(self, input, start=0, end=None, **kwargs): 151 | weight = kwargs.get('weight', self.in_proj_weight) 152 | bias = kwargs.get('bias', self.in_proj_bias) 153 | weight = weight[start:end, :] 154 | if bias is not None: 155 | bias = bias[start:end] 156 | return F.linear(input, weight, bias) 157 | -------------------------------------------------------------------------------- /Model/position_embedding.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import math 4 | 5 | import numpy as np 6 | import torch 7 | import torch.nn as nn 8 | 9 | 10 | 11 | 12 | class SinusoidalPositionalEmbedding(nn.Module): 13 | def __init__(self, d_model: int, max_len: int = 5000): 14 | super().__init__() 15 | self.register_buffer('positional_encodings', get_positional_encoding(d_model, max_len), False) 16 | 17 | def forward(self, x: torch.Tensor): 18 | pe = self.positional_encodings[:x.shape[0]].detach().requires_grad_(False) 19 | 20 | return pe 21 | 22 | 23 | def get_positional_encoding(d_model: int, max_len: int = 5000): 24 | # Empty encodings vectors 25 | encodings = torch.zeros(max_len, d_model) 26 | # Position indexes 27 | position = torch.arange(0, max_len, dtype=torch.float32).unsqueeze(1) 28 | # $2 * i$ 29 | two_i = torch.arange(0, d_model, 2, dtype=torch.float32) 30 | # $10000^{\frac{2i}{d_{model}}}$ 31 | div_term = torch.exp(two_i * -(math.log(10000.0) / d_model)) 32 | # $PE_{p,2i} = sin\Bigg(\frac{p}{10000^{\frac{2i}{d_{model}}}}\Bigg)$ 33 | encodings[:, 0::2] = torch.sin(position * div_term) 34 | # $PE_{p,2i + 1} = cos\Bigg(\frac{p}{10000^{\frac{2i}{d_{model}}}}\Bigg)$ 35 | encodings[:, 1::2] = torch.cos(position * div_term) 36 | 37 | # Add batch dimension 38 | encodings = encodings.unsqueeze(1).requires_grad_(False) 39 | 40 | return encodings 41 | 42 | 43 | def _test_positional_encoding(): 44 | import matplotlib.pyplot as plt 45 | 46 | plt.figure(figsize=(15, 5)) 47 | pe = get_positional_encoding(20, 100) 48 | plt.plot(np.arange(100), pe[:, 0, 4:8].numpy()) 49 | plt.legend(["dim %d" % p for p in [4, 5, 6, 7]]) 50 | plt.title("Positional encoding") 51 | plt.show() 52 | 53 | 54 | if __name__ == '__main__': 55 | _test_positional_encoding() 56 | -------------------------------------------------------------------------------- /Model/transformer.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch import nn 3 | import torch.nn.functional as F 4 | from Model.position_embedding import SinusoidalPositionalEmbedding 5 | from Model.multiheadattention import MultiHeadAttention 6 | 7 | 8 | import math 9 | 10 | 11 | class TransformerEncoder(nn.Module): 12 | """ 13 | Transformer encoder consisting of *args.encoder_layers* layers. Each layer 14 | is a :class:`TransformerEncoderLayer`. 15 | Args: 16 | embed_tokens (torch.nn.Embedding): input embedding 17 | num_heads (int): number of heads 18 | layers (int): number of layers 19 | attn_dropout (float): dropout applied on the attention weights 20 | relu_dropout (float): dropout applied on the first layer of the residual block 21 | res_dropout (float): dropout applied on the residual block 22 | attn_mask (bool): whether to apply mask on the attention weights 23 | """ 24 | 25 | def __init__(self, embed_dim, num_heads, layers, attn_dropout=0.0, relu_dropout=0.0, res_dropout=0.0, 26 | embed_dropout=0.0, attn_mask=False): 27 | super().__init__() 28 | self.dropout = embed_dropout # Embedding dropout 29 | self.attn_dropout = attn_dropout 30 | self.embed_dim = embed_dim 31 | self.embed_scale = math.sqrt(embed_dim) 32 | self.embed_positions = SinusoidalPositionalEmbedding(embed_dim) 33 | 34 | self.attn_mask = attn_mask 35 | 36 | self.layers = nn.ModuleList([]) 37 | for layer in range(layers): 38 | new_layer = TransformerEncoderLayer(embed_dim, 39 | num_heads=num_heads, 40 | attn_dropout=attn_dropout, 41 | relu_dropout=relu_dropout, 42 | res_dropout=res_dropout, 43 | attn_mask=attn_mask) 44 | self.layers.append(new_layer) 45 | 46 | self.register_buffer('version', torch.Tensor([2])) 47 | self.normalize = True 48 | if self.normalize: 49 | self.layer_norm = LayerNorm(embed_dim) 50 | 51 | def forward(self, x_in, x_in_k = None, x_in_v = None): 52 | """ 53 | Args: 54 | x_in (FloatTensor): embedded input of shape `(src_len, batch, embed_dim)` 55 | x_in_k (FloatTensor): embedded input of shape `(src_len, batch, embed_dim)` 56 | x_in_v (FloatTensor): embedded input of shape `(src_len, batch, embed_dim)` 57 | Returns: 58 | dict: 59 | - **encoder_out** (Tensor): the last encoder layer's output of 60 | shape `(src_len, batch, embed_dim)` 61 | - **encoder_padding_mask** (ByteTensor): the positions of 62 | padding elements of shape `(batch, src_len)` 63 | """ 64 | # embed tokens and positions 65 | x = self.embed_scale * x_in 66 | if self.embed_positions is not None: 67 | # xin_temp = x_in.transpose(0, 1)[:, :, 0] 68 | a = self.embed_positions(x_in.transpose(0, 1)[:, :, 0]).transpose(0, 1) 69 | x += self.embed_positions(x_in.transpose(0, 1)[:, :, 0]).transpose(0, 1) # Add positional embedding 70 | x = F.dropout(x, p=self.dropout, training=self.training) 71 | 72 | if x_in_k is not None and x_in_v is not None: 73 | # embed tokens and positions 74 | x_k = self.embed_scale * x_in_k 75 | x_v = self.embed_scale * x_in_v 76 | if self.embed_positions is not None: 77 | x_k += self.embed_positions(x_in_k.transpose(0, 1)[:, :, 0]).transpose(0, 1) # Add positional embedding 78 | x_v += self.embed_positions(x_in_v.transpose(0, 1)[:, :, 0]).transpose(0, 1) # Add positional embedding 79 | x_k = F.dropout(x_k, p=self.dropout, training=self.training) 80 | x_v = F.dropout(x_v, p=self.dropout, training=self.training) 81 | 82 | # encoder layers 83 | intermediates = [x] 84 | for layer in self.layers: 85 | if x_in_k is not None and x_in_v is not None: 86 | x = layer(x, x_k, x_v) 87 | else: 88 | x = layer(x) 89 | intermediates.append(x) 90 | 91 | if self.normalize: 92 | x = self.layer_norm(x) 93 | 94 | return x 95 | 96 | def max_positions(self): 97 | """Maximum input length supported by the encoder.""" 98 | if self.embed_positions is None: 99 | return self.max_source_positions 100 | return min(self.max_source_positions, self.embed_positions.max_positions()) 101 | 102 | 103 | class TransformerEncoderLayer(nn.Module): 104 | """Encoder layer block. 105 | In the original paper each operation (multi-head attention or FFN) is 106 | postprocessed with: `dropout -> add residual -> layernorm`. In the 107 | tensor2tensor code they suggest that learning is more robust when 108 | preprocessing each layer with layernorm and postprocessing with: 109 | `dropout -> add residual`. We default to the approach in the paper, but the 110 | tensor2tensor approach can be enabled by setting 111 | *args.encoder_normalize_before* to ``True``. 112 | Args: 113 | embed_dim: Embedding dimension 114 | """ 115 | 116 | def __init__(self, embed_dim, num_heads=4, attn_dropout=0.1, relu_dropout=0.1, res_dropout=0.1, 117 | attn_mask=False): 118 | super().__init__() 119 | self.embed_dim = embed_dim 120 | self.num_heads = num_heads 121 | 122 | self.self_attn = MultiHeadAttention( 123 | embed_dim=self.embed_dim, 124 | num_heads=self.num_heads, 125 | attn_dropout=attn_dropout 126 | ) 127 | self.attn_mask = attn_mask 128 | 129 | self.relu_dropout = relu_dropout 130 | self.res_dropout = res_dropout 131 | self.normalize_before = True 132 | 133 | self.fc1 = Linear(self.embed_dim, 4*self.embed_dim) # The "Add & Norm" part in the paper 134 | self.fc2 = Linear(4*self.embed_dim, self.embed_dim) 135 | self.layer_norms = nn.ModuleList([LayerNorm(self.embed_dim) for _ in range(2)]) 136 | 137 | def forward(self, x, x_k=None, x_v=None): 138 | """ 139 | Args: 140 | x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` 141 | encoder_padding_mask (ByteTensor): binary ByteTensor of shape 142 | `(batch, src_len)` where padding elements are indicated by ``1``. 143 | x_k (Tensor): same as x 144 | x_v (Tensor): same as x 145 | Returns: 146 | encoded output of shape `(batch, src_len, embed_dim)` 147 | """ 148 | residual = x 149 | x = self.maybe_layer_norm(0, x, before=True) 150 | mask = buffered_future_mask(x, x_k) if self.attn_mask else None 151 | if x_k is None and x_v is None: 152 | x, _ = self.self_attn(query=x, key=x, value=x, attn_mask=mask) 153 | else: 154 | x_k = self.maybe_layer_norm(0, x_k, before=True) 155 | x_v = self.maybe_layer_norm(0, x_v, before=True) 156 | x, _ = self.self_attn(query=x, key=x_k, value=x_v, attn_mask=mask) 157 | x = F.dropout(x, p=self.res_dropout, training=self.training) 158 | x = residual + x 159 | x = self.maybe_layer_norm(0, x, after=True) 160 | 161 | residual = x 162 | x = self.maybe_layer_norm(1, x, before=True) 163 | x = F.relu(self.fc1(x)) 164 | x = F.dropout(x, p=self.relu_dropout, training=self.training) 165 | x = self.fc2(x) 166 | x = F.dropout(x, p=self.res_dropout, training=self.training) 167 | x = residual + x 168 | x = self.maybe_layer_norm(1, x, after=True) 169 | return x 170 | 171 | def maybe_layer_norm(self, i, x, before=False, after=False): 172 | assert before ^ after 173 | if after ^ self.normalize_before: 174 | return self.layer_norms[i](x) 175 | else: 176 | return x 177 | 178 | def fill_with_neg_inf(t): 179 | """FP16-compatible function that fills a tensor with -inf.""" 180 | return t.float().fill_(float('-inf')).type_as(t) 181 | 182 | 183 | def buffered_future_mask(tensor, tensor2=None): 184 | dim1 = dim2 = tensor.size(0) 185 | if tensor2 is not None: 186 | dim2 = tensor2.size(0) 187 | future_mask = torch.triu(fill_with_neg_inf(torch.ones(dim1, dim2)), 1+abs(dim2-dim1)) 188 | if tensor.is_cuda: 189 | future_mask = future_mask.cuda() 190 | return future_mask[:dim1, :dim2] 191 | 192 | 193 | def Linear(in_features, out_features, bias=True): 194 | m = nn.Linear(in_features, out_features, bias) 195 | nn.init.xavier_uniform_(m.weight) 196 | if bias: 197 | nn.init.constant_(m.bias, 0.) 198 | return m 199 | 200 | 201 | def LayerNorm(embedding_dim): 202 | m = nn.LayerNorm(embedding_dim) 203 | return m 204 | 205 | 206 | if __name__ == '__main__': 207 | encoder = TransformerEncoder(300, 4, 2) 208 | 209 | x = torch.tensor(torch.rand(20, 2, 300)) 210 | 211 | print(encoder(x).shape) 212 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # MultiModal Sentiment Analysis Pytorch(多模态情绪识别探索) 2 | 未完待续...... 3 | 4 | 5 | ## Introduction 6 | 7 | Sentiment-Analysis是NLP方向的一个经典分类问题,而使用单一的文本信息去判断情感效果往往不会太好, 8 | 而在多模态学习的火热的当前背景下,结合多种模态信息来综合考虑情感的分类成为可能。目前本项目先考虑文本和语音两种模态信息。 9 | 10 | 11 | ## Dataset 12 | 13 | 本项目使用MELD数据集,MELD数据选自《老友记》的对话,是一个多模态数据集。 14 | 包含了文本和其对应的语音和视频。 15 | 16 | MELD论文来源:MELD: A Multimodal Multi-Party Dataset for Emotion Recognition in Conversation 17 | 18 | 数据集获取方式:网上很多 19 | 20 | 21 | ## 模型选择和特征抽取 22 | 23 | 本项目使用pytorch框架,重点使用huggingface里的transformers库 24 | huggingface社区中模型选择丰富,无论是NLP模型还是语音模型。 25 | 26 | 27 | ### 文本特征的抽取 28 | 29 | 文本特征选择BERT模型,具体使用huggingface中的bert-base-uncased 30 | 31 | ### 语音特征的抽取 32 | 33 | 语音领域对应NLP中BERT模型的是 HuBERT。 34 | 关于HuBERT,一种在语音方向的基于BERT的self-supervised预训练模型,思想很妙, 35 | 具体读者可查阅HuBERT论文。 36 | 37 | 38 | ## 多模态的特征融合 39 | 40 | 当文本和语音的关于情绪的特征被抽取出来之后,我们有很多方法来做特征融合 41 | 42 | 我个人使用了如下的特征融合方式 43 | 1. 在multimodal1和multimodal2 中,我们将bert和hubert提取的模态特征进行concat之后送入分类网络 44 | 2. 在multimodal3中,我们使用cross modal attention,将文本模态和语音模态的特征提取出来之后互相进行attention,然后再self attention 然后再 concat。 或者进行一些其他的模型拼补。 45 | 46 | 47 | ## 环境配置以及运行 48 | 49 | 先运行download文件,将预训练模型和相关的配置 下载下来 50 | 然后运行main文件即可 51 | 52 | 53 | ## 关于运行时候的目录问题 54 |
55 | 这个为项目的一级目录结构,然后我们进入data里面看一下data的目录结构
56 |
57 | 这个是我服务器上最后的data目录,下面我来讲讲这里面文件夹都是干啥的。 58 | 59 | 1. emorynlp 这个是里面有三个csv文件存的文本信息,用于文本模态的数据 60 | 2. MELD 存放音视频模态的数据,等会再讲 61 | 3. MELD_Dyadic 我这个项目里没用 62 | 4. mp4towav.py 因为MELD数据集只有视频,我写的这个文件产生下面的三个prepareAudio.sh 然后运行.sh ,把视频中音频提取出来保存成mp3 63 | ,读者也可尝试更改此文件 使其能省略生成.sh这一中间步骤直接生成音频,我自己尝试一直有bug,好奇怪,只能出此下策。 64 | 5. pickles 没啥用 65 | 6. saved_data 这个是我在utils文件夹底下data里面的一个函数,把pytorch里面的Dataset直接存下来(把音频构建成dataset的格式有很多的预处理,相当于直接保存的预处理结果),这样以后重复运行的时候就可以省很多时间了。 66 |
67 | 68 | 然后我们进入MELD文件夹
69 |
70 | 其他都没啥用,就看三个蓝色文件夹,文件夹下面是存的视频, 71 | 比如train_splits,里面有几十个视频,和一个wav文件夹,wav文件夹里面是这几十个视频对应的音频。 72 | 读者可以自己调整文件的存储路径,只要把代码里的路径给对应上即可。 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /data/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiloQ/MELD-Sentiment-Analysis/daa4a978cd628a29e0dffb2630489e808f078c5d/data/.DS_Store -------------------------------------------------------------------------------- /data/emorynlp/emorynlp_dev_final.csv: -------------------------------------------------------------------------------- 1 | Utterance,Speaker,Emotion,Scene_ID,Utterance_ID,Season,Episode,Start_Time,End_Time 2 | Coffee.,['Rachel Green'],Neutral,1,1,1,15,00:00:03.795,00:00:05.004 3 | Thank you.,['Joey Tribbiani'],Neutral,1,2,1,15,00:00:05.171,00:00:07.423 4 | Cappuccino.,['Rachel Green'],Neutral,1,3,1,15,00:00:07.590,00:00:08.757 5 | Grazie.,['Ross Geller'],Neutral,1,4,1,15,00:00:08.925,00:00:11.677 6 | And a nice hot cider for Monica.,['Rachel Green'],Neutral,1,5,1,15,00:01:27.253,00:01:33.383 7 | "Aww, thank you. Uh Rach?",['Monica Geller'],Scared,1,6,1,15,00:01:29.798,00:01:33.383 8 | Yeah?,['Rachel Green'],Neutral,1,7,1,15,00:01:34.177,00:01:35.219 9 | Why does my cinamon stick have an eraser?,['Monica Geller'],Neutral,1,8,1,15,00:04:11.209,00:04:15.879 10 | Oh! That's why. I'm sorry!,['Rachel Green'],Neutral,1,9,1,15,00:04:12.877,00:04:15.879 11 | "OK, try this salmon mousse.",['Monica Geller'],Joyful,6,1,1,15,00:04:16.047,00:04:21.218 12 | Mmmm. Good.,['Joey Tribbiani'],Joyful,6,2,1,15,00:04:19.550,00:04:21.218 13 | Is it better than the other salmon mousse?,['Monica Geller'],Joyful,6,3,1,15,00:05:51.851,00:05:54.811 14 | It's creamier.,['Joey Tribbiani'],Peaceful,6,4,1,15,00:05:54.979,00:05:57.606 15 | "Yeah, well, is that better?",['Monica Geller'],Mad,6,5,1,15,00:05:59.609,00:06:01.526 16 | "I don't know. We're talking about whipped fish, Monica. I'm just happy I'm keeping it down, y'know?",['Joey Tribbiani'],Joyful,6,6,1,15,00:07:14.142,00:07:24.818 17 | My God! What happened to you?,['Rachel Green'],Scared,6,8,1,15,00:07:15.852,00:07:21.606 18 | "Eight and a half hours of aptitude tests, intelligence tests, personality tests... and what do I learn? ""You are ideally suited for a career in data processing for a large multinational corporation.""",['Chandler Bing'],Mad,6,9,1,15,00:07:30.950,00:07:45.714 19 | That's so great! 'Cause you already know how to do that!,['Phoebe Buffay'],Joyful,6,10,1,15,00:07:43.337,00:07:50.385 20 | "Oh Chandler, I know, I know... oh, hey! You can see your nipples through this shirt!",['Rachel Green'],Joyful,6,12,1,15,00:08:00.855,00:08:09.154 21 | "Here you go, maybe this'll cheer you up.",['Monica Geller'],Peaceful,6,13,1,15,00:08:10.781,00:08:15.577 22 | "Ooh, you know, I had a grape about five hours ago, so I'd better split this with you.",['Chandler Bing'],Mad,6,14,1,15,00:08:16.496,00:08:20.832 23 | It's supposed to be that small. It's a pre-appetizer. The French call it an amouz-bouche.,['Monica Geller'],Joyful,6,15,1,15,00:08:19.415,00:08:24.920 24 | Well.... it is amouz-ing...,['Chandler Bing'],Joyful,6,16,1,15,00:08:22.168,00:08:24.920 25 | "Hello? Oh, hi Wendy! Yeah, eight o'clock. What did we say? Ten dollars an hour?... OK, great. All right, I'll see you then. Bye.",['Monica Geller'],Joyful,6,18,1,15,00:08:31.427,00:08:52.155 26 | Ten dollars an hour for what?,['Phoebe Buffay'],Neutral,6,19,1,15,00:08:35.473,00:08:43.188 27 | Waitressing?,['Rachel Green'],Mad,6,21,1,15,00:08:40.353,00:08:43.188 28 | Uh-oh.,['Joey Tribbiani'],Neutral,6,22,1,15,00:08:43.356,00:08:45.190 29 | Well... of course I thought of you! But... but...,['Monica Geller'],Sad,6,23,1,15,00:08:57.161,00:09:04.751 30 | "But, but?",['Rachel Green'],Mad,6,24,1,15,00:08:58.871,00:09:04.751 31 | "But, you see, it's just... this night has to go just perfect, you know? And, well, Wendy's more of a... professional waitress.",['Monica Geller'],Mad,6,25,1,15,00:09:04.919,00:09:19.349 32 | Oh! I see. And I've sort of been maintaining my amateur status so that I can waitress in the Olympics.,['Rachel Green'],Mad,6,26,1,15,00:09:19.892,00:09:26.565 33 | "You know, I don't mean to brag, but I waited tables at Innsbruck in '76. Amouz-bouche?",['Chandler Bing'],Joyful,6,27,1,15,00:09:24.564,00:09:34.823 34 | Talk to me.,['Celia'],Neutral,7,1,1,15,00:09:30.403,00:09:34.823 35 | "OK.... um, a weird thing happened to me on the train this morning...",['Ross Geller'],Scared,7,2,1,15,00:09:39.036,00:10:05.687 36 | No no no. Talk... dirty.,['Celia'],Joyful,7,3,1,15,00:09:58.055,00:10:05.687 37 | "Wha... what, here?",['Ross Geller'],Scared,7,4,1,15,00:10:01.767,00:10:05.687 38 | Yes...,['Celia'],Neutral,7,5,1,15,00:10:05.855,00:10:09.608 39 | Ah....,['Ross Geller'],Neutral,7,6,1,15,00:10:13.029,00:10:16.239 40 | Say something..... hot.,['Celia'],Neutral,7,7,1,15,00:10:16.407,00:10:19.701 41 | Er.... um.....,['Ross Geller'],Scared,7,8,1,15,00:10:18.034,00:10:19.701 42 | What?,['Celia'],Neutral,7,9,1,15,00:10:19.869,00:10:21.286 43 | Um... uh.... vulva.,['Ross Geller'],Joyful,7,10,1,15,00:10:22.830,00:10:27.083 44 | Well?,['Chandler Bing'],Neutral,9,1,1,15,00:10:24.749,00:10:27.083 45 | "Wow! It's huge! It's so much bigger than the cubicle. Oh, this is a cube.",['Phoebe Buffay'],Joyful,9,2,1,15,00:14:42.464,00:15:02.650 46 | Look at this!,['Chandler Bing'],Joyful,9,3,1,15,00:14:47.553,00:15:00.106 47 | Oh! You have a window!,['Phoebe Buffay'],Joyful,9,4,1,15,00:14:56.061,00:15:02.650 48 | Yes indeedy! With a beautiful view of...,['Chandler Bing'],Joyful,9,5,1,15,00:15:02.818,00:15:07.780 49 | Oh look! That guy's peeing!,['Phoebe Buffay'],Joyful,9,6,1,15,00:15:06.113,00:15:13.661 50 | "OK, that's enough of the view. Check this out, look at this. Sit down, sit down.",['Chandler Bing'],Joyful,9,7,1,15,00:15:21.712,00:15:27.675 51 | OK.,['Phoebe Buffay'],Neutral,9,8,1,15,00:15:25.090,00:15:27.675 52 | "This is great! Helen, could you come in here for a moment?",['Chandler Bing'],Powerful,9,9,1,15,00:15:27.843,00:15:35.350 53 | "Thank you Helen, that'll be all.",['Chandler Bing'],Neutral,9,11,1,15,00:15:30.137,00:15:35.350 54 | "Last time I do that, I promise.",['Chandler Bing'],Mad,9,13,1,15,00:15:40.898,00:15:46.819 55 | "Wendy, we had a deal! Yeah, you promised! Wendy! Wendy! Wendy!",['Monica Geller'],Mad,10,1,1,15,00:15:44.860,00:15:54.202 56 | Who was that?,['Rachel Green'],Neutral,10,2,1,15,00:15:52.368,00:15:54.202 57 | Wendy bailed. I have no waitress.,['Monica Geller'],Mad,10,3,1,15,00:15:54.370,00:15:59.290 58 | Oh... that's too bad. Bye bye.,['Rachel Green'],Neutral,10,4,1,15,00:15:56.664,00:16:05.213 59 | Ten dollars an hour.,['Monica Geller'],Neutral,10,5,1,15,00:15:59.458,00:16:05.213 60 | No.,['Rachel Green'],Neutral,10,6,1,15,00:16:03.587,00:16:05.213 61 | Twelve dollars an hour.,['Monica Geller'],Neutral,10,7,1,15,00:16:07.049,00:16:10.218 62 | "Mon. I wish I could, but I've made plans to walk around.",['Rachel Green'],Neutral,10,8,1,15,00:16:14.390,00:16:23.856 63 | "You know, Rachel, when you ran out of your wedding, I was there for you. I put a roof over your head, and if that means nothing to you... twenty dollars an hour.",['Monica Geller'],Scared,10,9,1,15,00:16:18.936,00:16:32.407 64 | Done.,['Rachel Green'],Neutral,10,10,1,15,00:16:20.521,00:16:23.856 65 | What a tool!,['Joey Tribbiani'],Mad,12,1,1,15,00:16:25.192,00:16:28.319 66 | You don't want to work for a guy like that.,['Rachel Green'],Powerful,12,2,1,15,00:19:16.029,00:19:18.656 67 | Yeah!,['Ross Geller'],Powerful,12,3,1,15,00:19:18.824,00:19:21.159 68 | "I know... it's just... I thought this was, you know... it.",['Monica Geller'],Sad,12,4,1,15,00:20:41.949,00:20:48.621 69 | "Look, you'll get there. You're an amazing chef.",['Ross Geller'],Powerful,12,5,1,15,00:20:48.789,00:20:50.748 70 | Yeah! You know all those yummy noises? I wasn't faking.,['Phoebe Buffay'],Joyful,12,6,1,15,00:20:50.916,00:20:53.709 71 | "So, er... how did it go with Celia?",['Joey Tribbiani'],Scared,12,8,1,15,00:20:57.297,00:21:04.387 72 | "Oh, I was unbelievable.",['Ross Geller'],Powerful,12,9,1,15,00:21:02.052,00:21:04.387 73 | "All right, Ross!",['Joey Tribbiani'],Powerful,12,10,1,15,00:21:04.554,00:21:07.848 74 | "I was the James Michener of dirty talk. It was the most elaborate filth you have ever heard. I mean, there were characters, plot lines, themes, a motif... at one point there were villagers.",['Ross Geller'],Joyful,12,11,1,15,00:21:08.016,00:21:24.240 75 | Whoa! And the... huh-huh?,['Joey Tribbiani'],Joyful,12,12,1,15,00:21:10.143,00:21:13.187 76 | "Well, ahem... you know, by the time we'd finished with all the dirty talk, it was kinda late... and we were both kind of exhausted, so uh...",['Ross Geller'],Scared,12,13,1,15,00:21:19.695,00:21:34.875 77 | You cuddled.,['Joey Tribbiani'],Joyful,12,14,1,15,00:21:21.488,00:21:24.240 78 | "Yeah, which was nice.",['Ross Geller'],Joyful,12,15,1,15,00:21:25.993,00:21:32.123 79 | You guys wanna try and catch a late movie or something?,['Phoebe Buffay'],Neutral,12,16,1,15,00:21:35.043,00:21:40.840 80 | "Maybe, but shouldn't we wait for Chandler?",['Rachel Green'],Neutral,12,17,1,15,00:21:41.174,00:21:43.134 81 | "Yeah, where the hell is he?",['Joey Tribbiani'],Scared,12,18,1,15,00:21:43.844,00:21:45.678 82 | How's this?,['Phoebe Buffay'],Neutral,14,1,1,15,00:21:46.138,00:21:48.180 83 | Eeeee!,['Steve (drug addict)'],Joyful,14,2,1,15,00:21:48.348,00:21:51.475 84 | Sorry. How about over here?,['Phoebe Buffay'],Neutral,14,3,1,15,00:21:52.728,00:21:54.854 85 | Aaaaah!,['Steve (drug addict)'],Joyful,14,4,1,15,00:21:55.022,00:21:59.608 86 | "See, that just means it's working. Does this hurt?",['Phoebe Buffay'],Neutral,14,5,1,15,00:22:17.252,00:22:21.589 87 | No.,['Steve (drug addict)'],Neutral,14,6,1,15,00:22:19.629,00:22:21.589 88 | What about this?,['Phoebe Buffay'],Neutral,14,7,1,15,00:22:21.757,00:22:23.924 89 | Aaaaahhh!!,['Steve (drug addict)'],Mad,14,8,1,15,00:22:24.092,00:22:26.594 90 | There you go!,['Phoebe Buffay'],Neutral,14,9,1,15,00:22:26.762,00:22:27.970 91 | I can't believe you would actually say that. I would much rather be Mr. Peanut than Mr. Salty.,['Chandler Bing'],Mad,1,1,1,20,00:00:03.461,00:00:09.842 92 | "No way! Mr.Salty is a sailor, all right, he's got to be, like, thetoughest snack there is.",['Joey Tribbiani'],Peaceful,1,2,1,20,00:00:10.010,00:00:15.848 93 | "I don't know, you don't wanna mess with corn nuts. They're craaazy.",['Ross Geller'],Peaceful,1,3,1,20,00:00:13.221,00:00:20.769 94 | Oh my God. You guys! You gotta come see this! There's some creep out there with a telescope!,['Monica Geller'],Joyful,1,4,1,20,00:00:21.396,00:00:29.778 95 | I can't believe it! He's looking right at us!,['Ross Geller'],Mad,1,5,1,20,00:00:29.946,00:00:34.992 96 | "Oh, that is so sick.",['Rachel Green'],Scared,1,6,1,20,00:00:32.657,00:00:34.992 97 | I feel violated. And not in a good way.,['Chandler Bing'],Scared,1,7,1,20,00:00:35.160,00:00:41.290 98 | "How can people do that?... Oh, you guys, look! Ugly Naked Guy got gravity boots!",['Phoebe Buffay'],Mad,1,8,1,20,00:00:41.458,00:00:48.505 99 | Wow... Wow!,['Rachel Green'],Joyful,3,1,1,20,00:00:43.251,00:00:45.044 100 | Yeah.,['Barry Farber'],Neutral,3,2,1,20,00:00:45.837,00:00:48.505 101 | "I'm not crazy, right? I mean, it was never like that.",['Rachel Green'],Scared,3,3,1,20,00:04:45.493,00:04:55.544 102 | "Nooo, it wasn't.",['Barry Farber'],Neutral,3,4,1,20,00:04:48.204,00:04:50.455 103 | "Ooh, and it's so nice having this little sink here...",['Rachel Green'],Peaceful,3,5,1,20,00:04:56.212,00:05:04.678 104 | "Oh, Danielle! I wasn't expecting the machine... Give me a call when you get a chance. Bye-bye. Oh God!",['Chandler Bing'],Scared,4,1,1,20,00:05:00.800,00:05:17.274 105 | That's what you've been working on for the past two hours?!,['Monica Geller'],Neutral,4,2,1,20,00:05:19.819,00:05:28.535 106 | "Hey, I've been honing!",['Chandler Bing'],Neutral,4,3,1,20,00:05:21.904,00:05:28.535 107 | What was with the dishes?,['Ross Geller'],Neutral,4,4,1,20,00:05:25.116,00:05:28.535 108 | "Oh, uh.. I want her to think I might be in a restaurant.. y'know? I might have some kind of life, like I haven't been sitting around here honing for the past few hours.",['Chandler Bing'],Neutral,4,5,1,20,00:05:29.162,00:05:42.966 109 | "Look look! He's doing it again, the guy with the telescope!",['Monica Geller'],Neutral,4,6,1,20,00:05:43.301,00:05:47.429 110 | Oh my God! Go away! Stop looking in here!,['Phoebe Buffay'],Mad,4,7,1,20,00:05:45.720,00:05:52.934 111 | "Great, now he's waving back.",['Monica Geller'],Neutral,4,8,1,20,00:05:48.264,00:05:52.934 112 | "Man, we gotta do something about that guy. This morning, I caught him looking into our apartment. It creeps me out! I feel like I can't do stuff!",['Joey Tribbiani'],Scared,4,9,1,20,00:05:53.102,00:06:04.112 113 | What kinda stuff?,['Monica Geller'],Neutral,4,10,1,20,00:05:57.148,00:05:58.815 114 | "Will you grow up? I'm not talking about sexy stuff, but, like, when I'm cooking naked.",['Joey Tribbiani'],Neutral,4,11,1,20,00:06:01.486,00:06:11.870 115 | You cook naked?,['Phoebe Buffay'],Neutral,4,12,1,20,00:06:05.031,00:06:07.240 116 | "Yeah, toast, oatmeal... nothing that spatters.",['Joey Tribbiani'],Neutral,4,13,1,20,00:06:08.993,00:06:11.870 117 | What are you looking at me for? I didn't know that.,['Chandler Bing'],Neutral,4,15,1,20,00:06:17.043,00:06:27.719 118 | What's the matter?,['Barry Farber'],Scared,5,1,1,20,00:06:18.544,00:06:21.713 119 | "Oh, it's just... Oh, Barry, this was not good.",['Rachel Green'],Sad,5,2,1,20,00:06:30.139,00:06:35.060 120 | "No, it was. It was very very good.",['Barry Farber'],Joyful,5,3,1,20,00:06:31.808,00:06:35.060 121 | "Well, what about Mindy?",['Rachel Green'],Neutral,5,4,1,20,00:06:35.228,00:06:38.188 122 | "Oh, way, way better than Mindy.",['Barry Farber'],Peaceful,5,5,1,20,00:06:38.856,00:06:41.942 123 | "No, not that, I mean, what about you and Mindy?",['Rachel Green'],Joyful,5,6,1,20,00:06:43.277,00:06:46.947 124 | "Well, if you want, I'll justI'll just break it off with her.",['Barry Farber'],Scared,5,7,1,20,00:06:47.573,00:06:51.993 125 | "No. No-no-no-no, no. I mean, don't do that. Not, I mean not for me.",['Rachel Green'],Scared,5,8,1,20,00:06:50.660,00:06:58.375 126 | "Dr. Farber, Bobby Rush is here for his adjustment.",['Bernice'],Neutral,5,9,1,20,00:06:52.161,00:06:58.375 127 | "Thanks, Bernice. Let's go away this weekend.",['Barry Farber'],Powerful,5,10,1,20,00:06:54.789,00:06:58.375 128 | "Oh, Barry..! Come on, this is all way too..",['Rachel Green'],Scared,5,11,1,20,00:06:58.543,00:07:05.340 129 | "We can, we can go to Aruba! When I went there on what would have been our honeymoon, it was, uh... it was really nice. You would've liked it.",['Barry Farber'],Joyful,5,12,1,20,00:07:03.047,00:07:14.266 130 | I had a bra.,['Rachel Green'],Neutral,5,14,1,20,00:07:05.508,00:07:07.134 131 | "Hey, Dr. Farber.",['Bobby Rush'],Neutral,5,16,1,20,00:07:07.969,00:07:11.096 132 | "All right Miss Green, everything looks fine... Yep, I think we're starting to see some real progress here.",['Barry Farber'],Neutral,5,18,1,20,00:07:16.602,00:07:37.956 133 | What?!,['Rachel Green'],Neutral,5,20,1,20,00:07:29.991,00:07:30.991 134 | "I'm twelve, I'm not stupid.",['Bobby Rush'],Mad,5,21,1,20,00:07:31.159,00:07:34.411 135 | Brrrrrrr!,['Monica Geller'],Neutral,7,1,1,20,00:07:34.579,00:07:37.956 136 | Hell is filled with people like you.,['Chandler Bing'],Mad,7,3,1,20,00:08:11.866,00:08:16.995 137 | He's back! The peeper's back!,['Joey Tribbiani'],Scared,7,4,1,20,00:08:13.534,00:08:16.995 138 | Get down!,['Joey Tribbiani'],Scared,7,6,1,20,00:08:17.163,00:08:19.998 139 | Get down?,['Rachel Green'],Scared,7,7,1,20,00:08:20.166,00:08:23.960 140 | ...And boogie!,['Chandler Bing'],Scared,7,8,1,20,00:08:24.921,00:08:27.422 141 | "Thanks, but I gotta go to work and get my eyes scratched out by Mindy.",['Rachel Green'],Neutral,7,9,1,20,00:11:49.417,00:12:01.344 142 | "Relax. Y'know, she may not even know.",['Monica Geller'],Scared,7,10,1,20,00:12:01.512,00:12:06.850 143 | "Please. I haven't heard from her in seven months, and now she calls me? I mean, what else is it about? Oh! She was my best friend, you guys! We went to camp together... she taught me how to kiss..",['Rachel Green'],Joyful,7,11,1,20,00:12:03.389,00:12:16.651 144 | Yeah?,['Joey Tribbiani'],Neutral,7,12,1,20,00:12:07.017,00:12:09.102 145 | "And now, y'know, I'm like... I'm like the other woman! I feel so..",['Rachel Green'],Sad,7,13,1,20,00:12:18.195,00:12:24.284 146 | ..Naughty!,['Joey Tribbiani'],Joyful,7,14,1,20,00:12:21.365,00:12:24.284 147 | "Right, I'll see you guys later...",['Rachel Green'],Neutral,7,15,1,20,00:12:26.328,00:12:28.788 148 | "Okay, I'm gonna go to the bathroom. Will you watch my phone?",['Chandler Bing'],Neutral,7,18,1,20,00:12:36.630,00:12:42.343 149 | Why don't you just take it with you?,['Monica Geller'],Neutral,7,19,1,20,00:12:42.511,00:12:44.471 150 | "Hey, we haven't been on a second date, she needs to hear me pee?",['Chandler Bing'],Scared,7,20,1,20,00:12:44.638,00:12:49.517 151 | Why don't you just call her?,['Monica Geller'],Neutral,7,21,1,20,00:12:47.850,00:12:49.517 152 | "I can't call her, I left a message! I have some pride.",['Chandler Bing'],Scared,7,22,1,20,00:12:49.685,00:12:52.896 153 | Do you?,['Monica Geller'],Neutral,7,23,1,20,00:12:53.063,00:12:54.898 154 | Don't you have to pee?,['Monica Geller'],Neutral,7,25,1,20,00:13:01.447,00:13:05.158 155 | 'S'why I'm dancing...,['Chandler Bing'],Joyful,7,26,1,20,00:13:03.115,00:13:05.158 156 | "Four letters: ""Circle or hoop"".",['Ross Geller'],Neutral,9,1,1,20,00:13:05.326,00:13:09.370 157 | "Ring dammit, ring!",['Chandler Bing'],Joyful,9,2,1,20,00:13:07.787,00:13:13.249 158 | Thanks.,['Ross Geller'],Neutral,9,3,1,20,00:13:09.580,00:13:13.249 159 | "Hey, you know our phone's not working?",['Joey Tribbiani'],Scared,9,4,1,20,00:13:30.935,00:13:33.228 160 | What?!,['Chandler Bing'],Scared,9,5,1,20,00:13:38.818,00:13:40.819 161 | "I tried to call you from the coffee shop, and there was no answer.",['Joey Tribbiani'],Neutral,9,6,1,20,00:16:31.156,00:16:44.419 162 | "I turned it off. Mother of God, I turned it off!",['Chandler Bing'],Mad,9,7,1,20,00:16:44.586,00:16:48.965 163 | Just like you told her you did! ... Just pointing out the irony.,['Monica Geller'],Joyful,9,8,1,20,00:16:46.380,00:16:50.633 164 | "Hey, so listen, I went across the street and talked to the doorman- I got the peeper's name! Can I use the phone?",['Joey Tribbiani'],Neutral,9,9,1,20,00:16:52.761,00:17:01.394 165 | Nngghhh!!!!!!!,['Chandler Bing'],Mad,9,10,1,20,00:16:55.681,00:16:58.433 166 | "Can I use your phone? Yeah, the number for a Sidney Marks, please.",['Joey Tribbiani'],Neutral,9,11,1,20,00:17:01.562,00:17:11.904 167 | """Heating device.""",['Ross Geller'],Neutral,9,12,1,20,00:17:03.814,00:17:05.481 168 | Radiator.,['Phoebe Buffay'],Neutral,9,13,1,20,00:17:09.236,00:17:11.904 169 | Five letters.,['Ross Geller'],Neutral,9,14,1,20,00:17:12.281,00:17:13.823 170 | Rdtor.,['Phoebe Buffay'],Neutral,9,15,1,20,00:17:14.992,00:17:16.200 171 | "Yeah, is Sidney there? Oh, this is? Sidney's a woman.",['Joey Tribbiani'],Neutral,9,16,1,20,00:17:16.368,00:17:28.880 172 | So she's a woman! So what?,['Monica Geller'],Neutral,9,17,1,20,00:17:18.162,00:17:28.880 173 | Joey!!,['Monica Geller'],Mad,9,19,1,20,00:17:24.376,00:17:26.627 174 | "Yeah, my neighbor... Yeah, the brunette... She says you looked very pretty the other day in the green dress.",['Joey Tribbiani'],Neutral,9,20,1,20,00:17:55.240,00:18:08.753 175 | The green dress? Really?,['Monica Geller'],Joyful,9,21,1,20,00:17:57.034,00:17:59.911 176 | "Yeah, she said you looked like Ingrid Bergman that day.",['Joey Tribbiani'],Neutral,9,22,1,20,00:18:01.997,00:18:08.753 177 | Nooo!,['Monica Geller'],Joyful,9,23,1,20,00:18:06.168,00:18:08.753 178 | You okay?,['Monica Geller'],Neutral,11,1,1,20,00:18:10.130,00:18:12.507 179 | Yeah.,['Rachel Green'],Neutral,11,2,1,20,00:18:12.674,00:18:15.343 180 | Really?,['Monica Geller'],Neutral,11,3,1,20,00:18:15.719,00:18:18.054 181 | "Yeah! Y'know, ever since I ran out on Barry at the wedding, I have wondered whether I made the right choice. And now I know.",['Rachel Green'],Sad,11,4,1,20,00:20:54.002,00:21:07.640 182 | Aww...,['Monica Geller'],Peaceful,11,5,1,20,00:20:55.963,00:20:57.296 183 | Big day.,['Joey Tribbiani'],Neutral,11,7,1,20,00:20:58.090,00:21:01.592 184 | "All right, I'll give you this, Mr. Peanut is a better dresser. I mean he's got the monocle, he's got the top hat...",['Joey Tribbiani'],Joyful,12,1,1,20,00:21:11.144,00:21:33.833 185 | You know he's gay?,['Phoebe Buffay'],Joyful,12,2,1,20,00:21:16.942,00:21:30.621 186 | I just wanna clarify this: are you outing Mr. Peanut?,['Ross Geller'],Joyful,12,3,1,20,00:21:34.001,00:21:43.092 187 | Chandler?,['Danielle'],Neutral,12,4,1,20,00:21:38.964,00:21:43.092 188 | "Danielle! Hi! Uh- everybody, this is Danielle, Danielle, everybody.",['Chandler Bing'],Joyful,12,5,1,20,00:21:44.303,00:21:49.765 189 | Hi. Hi.,['#ALL#'],Neutral,12,6,1,20,00:21:47.222,00:21:49.765 190 | What are you doing here?,['Chandler Bing'],Neutral,12,7,1,20,00:21:49.933,00:21:53.728 191 | "Well, I've been calling you, but it turns out I had your number wrong. And when I finally got the right one from Information, there was no answer. So I thought I'd just come down here, and make sure you were okay.",['Danielle'],Neutral,12,8,1,20,00:21:51.310,00:22:02.611 192 | "...I'm, I'm okay.",['Chandler Bing'],Neutral,12,9,1,20,00:21:53.895,00:21:55.938 193 | "Listen uh, maybe we could get together later?",['Danielle'],Neutral,12,10,1,20,00:22:02.779,00:22:08.117 194 | "That sounds good. I'll call you- or you call me, whatever...",['Chandler Bing'],Neutral,12,11,1,20,00:22:05.574,00:22:11.620 195 | You got it.,['Danielle'],Neutral,12,12,1,20,00:22:08.618,00:22:11.620 196 | Okay.,['Chandler Bing'],Neutral,12,13,1,20,00:22:11.788,00:22:12.955 197 | "G'bye, everybody.",['Danielle'],Neutral,12,14,1,20,00:22:13.123,00:22:14.498 198 | Bye.,['#ALL#'],Neutral,12,15,1,20,00:22:14.666,00:22:16.584 199 | Whoo-hoo!,['Phoebe Buffay'],Joyful,12,16,1,20,00:22:18.420,00:22:20.046 200 | "Yeah, there you go!",['Monica Geller'],Joyful,12,17,1,20,00:22:20.213,00:22:23.924 201 | Second date!,['Ross Geller'],Joyful,12,18,1,20,00:22:22.174,00:22:23.924 202 | ...I dunno.,['Chandler Bing'],Scared,12,19,1,20,00:22:24.092,00:22:25.301 203 | You don't know?!,['Rachel Green'],Mad,12,20,1,20,00:22:25.469,00:22:29.221 204 | "Stop saying you're not talented, you're very talented. It's just with the bird dead and all, there's very little act left. Oh, honey, give me a break, will ya? Oooh, ooh, I'll talk to you later.",['Estelle Leonard'],Neutral,3,2,2,10,00:08:11.699,00:08:42.562 205 | "Well, there's my favorite client. So tell me darling, how was the audition?",['Estelle Leonard'],Joyful,3,3,2,10,00:08:42.772,00:08:47.442 206 | "Well, I think it went pretty well. I.. I got a callback for Thursday.",['Joey Tribbiani'],Joyful,3,4,2,10,00:08:44.815,00:08:51.655 207 | "Joey, have you ever seen me ecstatic?",['Estelle Leonard'],Neutral,3,5,2,10,00:08:51.864,00:08:54.950 208 | No.,['Joey Tribbiani'],Neutral,3,6,2,10,00:08:55.243,00:08:58.662 209 | "Well, here it is.",['Estelle Leonard'],Joyful,3,7,2,10,00:09:02.250,00:09:06.127 210 | "Oh, isn't Lori a doll?",['Estelle Leonard'],Peaceful,3,9,2,10,00:09:06.337,00:09:09.673 211 | "Oh, I see. Well, I'm just gonna put in a call here and we'll find out what's goin' on and straighten it out. Yeah, hi, Lori please. Hi darling. So how 'bout Joey Tribbiani for the part of the cab driver, isn't he terrific? Uh-huuuuh. Uh-huuuuh. OK, doll. Talk to you later. Yeah, you're gonna have to sleep with her.",['Estelle Leonard'],Neutral,3,11,2,10,00:09:30.820,00:10:05.103 212 | Hey.,['Chandler Bing'],Neutral,5,2,2,10,00:09:34.824,00:09:37.659 213 | Hey.,['Joey Tribbiani'],Neutral,5,3,2,10,00:09:37.827,00:09:40.954 214 | "Whoa, whoa, so I'm guessing you didn't get the part, or... uh, Italy called and said it was hungry.",['Chandler Bing'],Sad,5,4,2,10,00:14:53.100,00:15:13.536 215 | "Well, the part's mine if I want it.",['Joey Tribbiani'],Joyful,5,5,2,10,00:15:09.199,00:15:13.536 216 | Oh my God!,['Chandler Bing'],Joyful,5,6,2,10,00:15:10.910,00:15:13.536 217 | "Yeah, if I'm willing to sleep with the casting lady.",['Joey Tribbiani'],Neutral,5,7,2,10,00:15:16.832,00:15:20.835 218 | Oh my... God?,['Chandler Bing'],Scared,5,8,2,10,00:15:18.083,00:15:20.835 219 | "Ten years I've been waiting for a break like this Chandler, ten years! I mean, Days of Our Lives. That's actually on television.",['Joey Tribbiani'],Sad,5,9,2,10,00:15:21.086,00:15:32.513 220 | "So, what're you gonna do?",['Chandler Bing'],Neutral,5,10,2,10,00:15:22.463,00:15:28.593 221 | "Well, I guess I could sleep with her... I mean, how could I do that?",['Joey Tribbiani'],Sad,5,11,2,10,00:15:33.432,00:15:37.560 222 | I've never slept with someone for a part.,['Joey Tribbiani'],Sad,5,13,2,10,00:15:37.811,00:15:43.232 223 | Well is she...,['Chandler Bing'],Neutral,5,14,2,10,00:15:39.438,00:15:43.232 224 | Sorry.,['Joey Tribbiani'],Neutral,5,15,2,10,00:15:44.026,00:15:46.194 225 | It's alright. Is she good-looking?,['Chandler Bing'],Peaceful,5,16,2,10,00:15:46.403,00:15:54.202 226 | "Yeah, she's totally good looking. I mean, if I met her in a bar, or something, I'd be buying her breakfast. You know, after having slept with her.",['Joey Tribbiani'],Joyful,5,17,2,10,00:15:49.823,00:16:03.795 227 | "Y'know, maybe this isn't such a big deal. Y'know, I mean, the way that I see it is you get a great job and you get to have sex. Y'know, I mean, throw in a tree and a fat guy and you've got Christmas.",['Chandler Bing'],Joyful,5,18,2,10,00:15:57.790,00:16:20.561 228 | "I just... I just don't think that I want it that way though, y'know? I mean, let's say I do make it, alright? I'm always gonna look back and wonder if it was because of my talent or because of.. y'know, the Little General.",['Joey Tribbiani'],Scared,5,19,2,10,00:16:24.024,00:16:37.370 229 | Didn't you used to call it the Little Major?,['Chandler Bing'],Peaceful,5,20,2,10,00:16:34.451,00:16:42.750 230 | "Yeah, but after Denise DeMarco, I had to promote it.",['Joey Tribbiani'],Peaceful,5,21,2,10,00:16:40.124,00:16:45.753 231 | Can I get you something from the bar?,['Waiter'],Neutral,6,2,2,10,00:16:51.719,00:16:53.261 232 | "Yes, I would like something. No, no thank you.",['Monica Geller'],Sad,6,3,2,10,00:16:53.470,00:16:58.307 233 | "No, no really. I.. I wouldn't feel right about it. Just some water.",['Monica Geller'],Sad,6,5,2,10,00:17:02.479,00:17:06.983 234 | So the light went out in my refrigerator...,['Bobby Rush'],Neutral,6,6,2,10,00:17:05.566,00:17:11.237 235 | Hi.,['Russ'],Neutral,9,2,2,10,00:17:07.651,00:17:11.237 236 | "Oh, hey.",['Chandler Bing'],Neutral,9,3,2,10,00:17:12.948,00:17:13.990 237 | Hi.,['Phoebe Buffay'],Neutral,9,4,2,10,00:17:14.241,00:17:16.576 238 | "I guess you guys heard, Rachel dumped me.",['Russ'],Sad,9,5,2,10,00:18:21.475,00:18:24.227 239 | "Yeah, I'm sorry man.",['Chandler Bing'],Neutral,9,6,2,10,00:18:24.394,00:18:29.982 240 | "Oh, all she said was that I remind her too much of somebody. You have any idea who she's talking about?",['Russ'],Neutral,9,7,2,10,00:21:59.109,00:22:05.614 241 | "Oh I do, it's.... it's Bob Saget. She hates him.",['Phoebe Buffay'],Neutral,9,8,2,10,00:22:03.780,00:22:10.244 242 | Oh.,['Russ'],Neutral,9,9,2,10,00:22:07.534,00:22:10.244 243 | Hey.,['Julie'],Neutral,9,10,2,10,00:22:12.205,00:22:14.040 244 | Hey!,['Chandler Bing'],Neutral,9,11,2,10,00:22:14.207,00:22:16.500 245 | "Hey, Julie! Hey, how are you doing?",['Phoebe Buffay'],Peaceful,9,12,2,10,00:22:16.668,00:22:21.714 246 | Hey. Watcha guys doin?,['Phoebe Buffay'],Joyful,1,2,2,20,00:00:07.132,00:00:11.844 247 | Monica's making us watch Old Yeller.,['Richard Burke'],Sad,1,3,2,20,00:00:08.508,00:00:11.844 248 | "Why are you guys so upset? It's Old Yeller, it's a happy movie.",['Phoebe Buffay'],Scared,1,4,2,20,00:00:13.972,00:00:20.310 249 | What?,['Rachel Green'],Neutral,1,5,2,20,00:00:18.643,00:00:20.310 250 | What're you talkin' about?,['Ross Geller'],Neutral,1,6,2,20,00:00:20.478,00:00:22.771 251 | "C'mon, happy family gets a dog, frontier fun.",['Phoebe Buffay'],Joyful,1,7,2,20,00:05:45.887,00:05:50.974 252 | "Yeah but Phoebs, what about the end?",['Ross Geller'],Neutral,1,8,2,20,00:06:00.860,00:06:08.325 253 | That's not the end.,['Rachel Green'],Neutral,1,10,2,20,00:06:05.990,00:06:08.325 254 | What about the part where he has rabies?,['Monica Geller'],Scared,1,12,2,20,00:06:19.420,00:06:22.464 255 | "Well, how do you find clothes that fit?",['Chandler Bing'],Joyful,2,5,2,20,00:07:58.186,00:08:11.656 256 | "Oh, hey, Monica, we've got a question.",['Joey Tribbiani'],Neutral,2,6,2,20,00:08:45.399,00:08:48.527 257 | "Ok. Hey, why don't you ask Richard?",['Monica Geller'],Neutral,2,10,2,20,00:08:54.033,00:08:58.203 258 | "Ok, that's Eric.",['Chandler Bing'],Neutral,2,13,2,20,00:08:55.576,00:08:58.203 259 | Glad to be of help. Matches.,['Richard Burke'],Joyful,2,14,2,20,00:08:58.871,00:09:01.540 260 | I don't know.,['Joey Tribbiani'],Scared,2,16,2,20,00:09:01.707,00:09:02.791 261 | "Ok, this could be tough.",['Chandler Bing'],Neutral,2,21,2,20,00:09:02.959,00:09:04.668 262 | "Ooh, you almost had it.",['Chandler Bing'],Joyful,2,23,2,20,00:09:04.835,00:09:08.213 263 | "No no, you're fine, you're fine.",['Ross Geller'],Peaceful,3,2,2,20,00:09:08.381,00:09:12.759 264 | Hello,['Carol Willick'],Neutral,3,3,2,20,00:09:09.840,00:09:12.759 265 | Hi.,['Ross Geller'],Neutral,3,4,2,20,00:09:12.927,00:09:15.512 266 | Hey.,['Susan Bunch'],Neutral,3,5,2,20,00:09:15.763,00:09:17.013 267 | Hi honey.,['Carol Willick'],Joyful,3,6,2,20,00:09:26.065,00:09:28.567 268 | What?,['Carol Willick'],Scared,3,8,2,20,00:09:28.734,00:09:31.778 269 | What?,['Susan Bunch'],Joyful,3,9,2,20,00:09:32.154,00:09:34.114 270 | "Uhh, we know, he already did it last week.",['Carol Willick'],Joyful,3,11,2,20,00:19:31.003,00:19:39.886 271 | You can watch our tape if you want.,['Susan Bunch'],Powerful,3,12,2,20,00:19:46.185,00:19:56.485 272 | Great. That would be fine.,"['Carol Willick', 'Susan Bunch']",Powerful,3,16,2,20,00:19:52.900,00:19:56.485 273 | "Oh shout, that would have been fun.",['Susan Bunch'],Joyful,3,18,2,20,00:19:56.695,00:19:59.530 274 | Hey.,['Phoebe Buffay'],Neutral,4,2,2,20,00:19:59.698,00:20:01.073 275 | "Hey Phoebs, whatcha got there?",['Rachel Green'],Neutral,4,3,2,20,00:20:01.325,00:20:04.785 276 | Hey.,['Chandler Bing'],Neutral,4,7,2,20,00:20:02.951,00:20:04.785 277 | Hey.,['Joey Tribbiani'],Neutral,4,8,2,20,00:20:05.913,00:20:08.748 278 | Hey.,['Rachel Green'],Neutral,4,9,2,20,00:20:08.999,00:20:12.043 279 | "Hey. Where is he, where's Richard? Did you ditch him?",['Monica Geller'],Neutral,4,10,2,20,00:20:12.211,00:20:19.634 280 | So'd you guys have fun?,['Monica Geller'],Neutral,4,12,2,20,00:20:14.046,00:20:15.880 281 | Your boyfriend is so cool.,['Chandler Bing'],Joyful,4,13,2,20,00:20:16.131,00:20:19.634 282 | Really?,['Monica Geller'],Neutral,4,14,2,20,00:20:19.801,00:20:22.303 283 | "Wow, he must like you the best.",['Rachel Green'],Joyful,4,16,2,20,00:20:22.512,00:20:24.347 284 | No problem. Hey Chandler,['Joey Tribbiani'],Neutral,4,19,2,20,00:20:24.514,00:20:27.350 285 | I think they get it.,['Chandler Bing'],Neutral,4,20,2,20,00:20:26.266,00:20:30.603 286 | Ok.,['Joey Tribbiani'],Neutral,4,21,2,20,00:20:27.517,00:20:30.603 287 | There's the man.,['Chandler Bing'],Neutral,4,22,2,20,00:20:30.771,00:20:35.316 288 | He-he-eyy.,['Joey Tribbiani'],Joyful,4,23,2,20,00:20:33.190,00:20:35.316 289 | Ok. He kept my dollar.,['Joey Tribbiani'],Sad,4,25,2,20,00:20:35.943,00:20:42.698 290 | Did you like it?,['Monica Geller'],Neutral,8,3,2,20,00:20:38.070,00:20:42.698 291 | I have to say Tupolo Honey by Van Morrison.,['Ross Geller'],Peaceful,2,2,3,1,00:00:05.880,00:01:14.448 292 | Nooo Way! The most romantic song ever is The Way We Were.,['Rachel Green'],Peaceful,2,3,3,1,00:00:14.848,00:01:18.994 293 | "What song was that, Pheebs?",['Rachel Green'],Neutral,2,5,3,1,00:01:11.946,00:01:14.448 294 | "Hold me close, young Tony Dan-za.",['Phoebe Buffay'],Neutral,2,6,3,1,00:01:14.616,00:01:18.994 295 | Hi Monica!,['Phoebe Buffay'],Joyful,2,8,3,1,00:01:16.159,00:01:18.994 296 | Hey Mon!,['Ross Geller'],Joyful,2,9,3,1,00:01:19.162,00:01:24.333 297 | Hey Mon!,['Rachel Green'],Joyful,2,10,3,1,00:01:26.336,00:01:28.295 298 | "Oh my God, has she slept at all?",['Phoebe Buffay'],Mad,2,12,3,1,00:01:38.014,00:01:44.978 299 | Nope.,['Ross Geller'],Neutral,2,13,3,1,00:01:41.559,00:01:42.976 300 | "No, it's been three nights in a row.",['Rachel Green'],Neutral,2,14,3,1,00:01:43.144,00:01:47.064 301 | "Yeah, she finally stopped crying yesterday, but then she found one of Richard's cigar butts out on the terrace, so.",['Ross Geller'],Peaceful,2,15,3,1,00:01:45.146,00:01:52.361 302 | Morning.,['Chandler Bing'],Neutral,3,2,3,1,00:01:47.232,00:01:49.066 303 | "Morning, hey, you made pancakes?",['Joey Tribbiani'],Joyful,3,3,3,1,00:01:49.234,00:01:52.361 304 | "Yeah, like there's any way I could ever do that.",['Chandler Bing'],Scared,3,4,3,1,00:02:14.217,00:02:22.307 305 | "Monica and Rachel had syrup, now I can get my man to cheer up. Good morning Joey.",['Janice Litman Goralnik'],Joyful,3,5,3,1,00:02:20.056,00:02:29.439 306 | Good morning.,['Joey Tribbiani'],Joyful,3,6,3,1,00:02:22.934,00:02:26.019 307 | "Oh, I wish. Look, honey, you have that report to finish, and I gotta go see my lawyer.",['Janice Litman Goralnik'],Peaceful,3,8,3,1,00:02:37.198,00:02:44.705 308 | "I-I-I gotta go, I gotta go. Okay, not without a kiss.",['Janice Litman Goralnik'],Joyful,3,10,3,1,00:02:48.209,00:02:52.546 309 | "Well, maybe I won't kiss you, and then you'll have to stay.",['Chandler Bing'],Powerful,3,11,3,1,00:02:50.837,00:02:56.383 310 | Kiss her! Kiss her!,['Joey Tribbiani'],Joyful,3,12,3,1,00:02:52.714,00:02:54.089 311 | "I'll see you later, sweetie. Bye Joey.",['Janice Litman Goralnik'],Joyful,3,13,3,1,00:02:54.257,00:02:56.383 312 | B-bye Janice. So when ya' dumpin' her.,['Joey Tribbiani'],Neutral,3,14,3,1,00:02:56.551,00:03:03.223 313 | "Nope, not this time.",['Chandler Bing'],Neutral,3,15,3,1,00:02:59.304,00:03:03.223 314 | "Come on, quite yankin' me.",['Joey Tribbiani'],Joyful,3,16,3,1,00:03:00.638,00:03:03.223 315 | I'm not yanking you.,['Chandler Bing'],Neutral,3,17,3,1,00:03:03.391,00:03:05.434 316 | This is Janice.,['Joey Tribbiani'],Neutral,3,18,3,1,00:03:07.604,00:03:09.146 317 | "Yeah, I know. She makes me happy.",['Chandler Bing'],Peaceful,3,19,3,1,00:03:09.314,00:03:14.318 318 | "Okay. All right. You look me in the eye and tell me, without blinking, that you're not breaking up with her. No blinking.",['Joey Tribbiani'],Neutral,3,20,3,1,00:03:23.203,00:03:34.755 319 | I'm not breaking up with her!,['Chandler Bing'],Peaceful,3,21,3,1,00:03:24.954,00:03:31.752 320 | "God, look what I found in the drain.",['Monica Geller'],Scared,4,2,3,1,00:03:26.206,00:03:31.752 321 | What?!,['Rachel Green'],Scared,4,3,3,1,00:03:28.249,00:03:31.752 322 | It's some of Richard's hair! What do I do with this?,['Monica Geller'],Scared,4,4,3,1,00:03:48.019,00:03:55.525 323 | Getting it away from me would be job one.,['Ross Geller'],Neutral,4,5,3,1,00:03:55.693,00:04:00.405 324 | "Ooh. Oh. It looks like, like a tiny little person drowning in your cereal.",['Phoebe Buffay'],Neutral,4,7,3,1,00:04:04.827,00:04:22.261 325 | "God, what is wrong with me.",['Monica Geller'],Sad,4,8,3,1,00:04:07.038,00:04:22.261 326 | You need to get some sleep.,['Ross Geller'],Neutral,4,9,3,1,00:04:09.374,00:04:22.261 327 | I need to get some Richard.,['Monica Geller'],Sad,4,10,3,1,00:04:10.792,00:04:22.261 328 | "Monica, you broke up with him for a reason.",['Rachel Green'],Neutral,4,11,3,1,00:04:27.976,00:04:35.065 329 | "Maybe, because you told him not to.",['Phoebe Buffay'],Neutral,4,13,3,1,00:04:32.855,00:04:35.065 330 | What are you the memory woman?,['Monica Geller'],Mad,4,14,3,1,00:04:35.233,00:04:39.236 331 | Their not breaking up. Chandler and Janice. Their not breaking up. He didn't blink or anything.,['Joey Tribbiani'],Neutral,4,15,3,1,00:04:45.660,00:04:54.584 332 | Cute! This is Janice! You remember Janice?,['Joey Tribbiani'],Mad,4,17,3,1,00:04:49.706,00:04:51.915 333 | "Yes, Joey, I remember, she's annoying, but you know what she's-she's his girlfriend now. I mean what can we do?",['Rachel Green'],Neutral,4,18,3,1,00:04:58.673,00:05:10.183 334 | There you go! That's the spirit I'm looking for! What can we do? Huh? All right who's first? Huh? Ross?,['Joey Tribbiani'],Joyful,4,19,3,1,00:05:10.351,00:05:18.567 335 | "Well I'm thinking that Chandler's our friend and Janice makes him happy, so I say we just all be adult about it and accept her.",['Ross Geller'],Neutral,4,20,3,1,00:05:14.772,00:05:24.364 336 | "Yeah, we'll call that Plan B. All right?",['Joey Tribbiani'],Neutral,4,21,3,1,00:05:16.024,00:05:21.403 337 | "Honey, I was wondering....",['Rachel Green'],Peaceful,5,2,3,1,00:05:18.735,00:05:21.403 338 | Hmm?,['Ross Geller'],Peaceful,5,3,3,1,00:05:21.571,00:05:24.364 339 | "Do you still have that, um, Navy uniform?",['Rachel Green'],Joyful,5,4,3,1,00:05:48.765,00:05:56.438 340 | "Nooo, I had to return it to the costume place.",['Ross Geller'],Sad,5,5,3,1,00:05:52.602,00:06:00.609 341 | Hmm.,['Rachel Green'],Peaceful,5,6,3,1,00:05:57.857,00:06:00.609 342 | I think I have an old band uniform from high school.,['Ross Geller'],Neutral,5,7,3,1,00:06:00.777,00:06:04.196 343 | "You remember not having sex in high school, right?",['Rachel Green'],Joyful,5,8,3,1,00:06:05.114,00:06:07.324 344 | Yeah.,['Ross Geller'],Sad,5,9,3,1,00:06:07.492,00:06:09.368 345 | "Well honey, what about you?",['Rachel Green'],Sad,5,10,3,1,00:06:13.206,00:06:14.623 346 | What?,['Ross Geller'],Neutral,5,11,3,1,00:06:14.791,00:06:15.874 347 | "I mean do you have any fun, you know, fantasy type things?",['Rachel Green'],Peaceful,5,12,3,1,00:06:16.084,00:06:28.178 348 | No.,['Ross Geller'],Neutral,5,13,3,1,00:06:17.293,00:06:22.297 349 | Come on you gotta have one!,['Rachel Green'],Joyful,5,14,3,1,00:06:23.299,00:06:28.178 350 | Nope.,['Ross Geller'],Neutral,5,15,3,1,00:06:26.302,00:06:28.178 351 | "Ross, you know what...",['Rachel Green'],Joyful,5,16,3,1,00:06:29.138,00:06:32.849 352 | What?,['Ross Geller'],Scared,5,17,3,1,00:06:31.224,00:06:32.849 353 | "...if you tell me, I might do it.",['Rachel Green'],Joyful,5,18,3,1,00:06:33.017,00:06:36.728 354 | "Okay, umm. Did you ever see, um, Return Of The Jedi?",['Ross Geller'],Scared,5,19,3,1,00:06:43.152,00:06:52.160 355 | Yeah.,['Rachel Green'],Neutral,5,20,3,1,00:06:44.404,00:06:46.154 356 | "Do you remember the scene with, um, Jabba the Hut? Well Jabba had as, as his prisoner, um, Princess Leia.",['Ross Geller'],Peaceful,5,21,3,1,00:06:58.167,00:07:20.856 357 | Oooh!,['Rachel Green'],Joyful,5,22,3,1,00:07:01.170,00:07:03.839 358 | "Princess Leia, was wearing this, um, gold bikini thing. It was pretty cool.",['Ross Geller'],Joyful,5,23,3,1,00:07:09.720,00:07:25.694 359 | Hey!,['Chandler Bing'],Joyful,7,3,3,1,00:07:13.683,00:07:14.891 360 | Wheel!,['Joey Tribbiani'],Joyful,7,4,3,1,00:07:16.310,00:07:18.687 361 | Of!,['Chandler Bing'],Joyful,7,5,3,1,00:07:19.188,00:07:20.856 362 | Fortune! This guy is so stupid. It's Count Rushmore!!,['Joey Tribbiani'],Mad,7,6,3,1,00:08:52.198,00:09:10.590 363 | "I say, 'I am there!' Cool! Aw, is Ross going to?",['Joey Tribbiani'],Neutral,7,8,3,1,00:09:24.188,00:09:29.359 364 | "No, Janice.",['Chandler Bing'],Neutral,7,9,3,1,00:09:26.399,00:09:28.108 365 | "Jan-ice. 'Cause I, just, I feel bad for Ross, you know, we-we always go together, we're like the three hocke-teers.",['Joey Tribbiani'],Sad,7,10,3,1,00:09:28.276,00:09:42.163 366 | "You know, I may be way out on a limb here, but do you, do you, have a problem with Janice?",['Chandler Bing'],Neutral,7,11,3,1,00:09:33.864,00:09:47.210 367 | "No, Yeeees. God, how do I say this. . Oh, hi, you know that girl from the Greek restaurant with the hair ?",['Joey Tribbiani'],Mad,7,12,3,1,00:09:47.378,00:10:00.140 368 | "Ooh, that girl that I hate, eww, drives me crazy, eww, eww, oh!",['Chandler Bing'],Mad,7,13,3,1,00:09:55.011,00:10:03.351 369 | "Look, I don't hate Janice, she's-she's just a lot to take, you know.",['Joey Tribbiani'],Neutral,7,14,3,1,00:10:03.519,00:10:09.774 370 | "Well, there you go.",['Chandler Bing'],Neutral,7,15,3,1,00:10:05.521,00:10:09.774 371 | "Well, I'm crazy about her now. I think this could be the real thing. Capital 'R'! Capital 'T'! Don't worry, those are the right letters.",['Chandler Bing'],Mad,7,17,3,1,00:10:16.866,00:10:29.711 372 | "Look, what do you want me to say?",['Joey Tribbiani'],Neutral,7,18,3,1,00:10:27.043,00:10:33.632 373 | I want you to say that you like her!,['Chandler Bing'],Mad,7,19,3,1,00:10:30.463,00:10:36.217 374 | "I can't. It's like this chemical thing, you know. Every time she starts laughing, I just wanna pull my arm off just so that I can have something to throw at her.",['Joey Tribbiani'],Mad,7,20,3,1,00:10:34.425,00:10:48.396 375 | "Thanks for trying. Oh, and by the way there is no Count Rushmore!",['Chandler Bing'],Mad,7,21,3,1,00:10:50.691,00:10:57.489 376 | "Yeah, then-then who's the guy that painted the faces on the mountain?",['Joey Tribbiani'],Mad,7,22,3,1,00:10:52.234,00:11:00.909 377 | How could you have told her?,['Ross Geller'],Scared,8,2,3,1,00:10:53.486,00:10:57.489 378 | "Ross, I didn't think it would that big of a deal.",['Rachel Green'],Mad,8,3,3,1,00:11:06.749,00:11:11.461 379 | "Oh, she didn't think it would be that big of deal.",['Ross Geller'],Mad,8,4,3,1,00:11:08.584,00:11:13.505 380 | "Okay, who are you talking to when you do that?",['Rachel Green'],Scared,8,5,3,1,00:11:13.673,00:11:21.596 381 | "Look, that was supposed to be like a private, personal thing between us.",['Ross Geller'],Mad,8,6,3,1,00:11:17.259,00:11:26.017 382 | "That's different, okay. That's like, uh 'Who dated a stripper?' or 'Who did it on the back of the Staton Island Ferry?'.",['Ross Geller'],Mad,8,8,3,1,00:11:28.187,00:11:37.821 383 | Were both of those Joey?,['Rachel Green'],Neutral,8,9,3,1,00:11:31.273,00:11:34.150 384 | Not even with your best friend.,['Rachel Green'],Neutral,8,11,3,1,00:11:34.318,00:11:37.821 385 | Noo!,['Ross Geller'],Mad,8,12,3,1,00:11:38.698,00:11:39.781 386 | "Hmph. So what you, you tell each other everything?",['Ross Geller'],Scared,8,14,3,1,00:12:03.139,00:12:09.561 387 | Pretty much.,['Rachel Green'],Joyful,8,15,3,1,00:12:08.477,00:12:09.561 388 | Did you talk about the night of five times? Do you tell people about the night of five times?,['Ross Geller'],Neutral,8,16,3,1,00:12:13.065,00:12:22.157 389 | "Uh, honey, yeah that was with Carol.",['Rachel Green'],Joyful,8,17,3,1,00:12:22.324,00:12:28.079 390 | "I know, but it's still worth mentioning, I think.",['Ross Geller'],Scared,8,18,3,1,00:12:24.827,00:12:28.079 391 | "Relax every muscle in your body. Listen to the plinky-plunky music. Okay, now close you eyes, and think of a happy place. Okay, tell me your happy place.",['Phoebe Buffay'],Powerful,9,2,3,1,00:12:29.707,00:12:48.057 392 | "Richard's living room, drinking wine.",['Monica Geller'],Joyful,9,3,3,1,00:12:33.377,00:12:34.878 393 | "All right. No, no, no, not a Richard thing, just put down the glass. And get out!",['Phoebe Buffay'],Scared,9,4,3,1,00:12:43.012,00:12:56.065 394 | "I'm sorry, but that's my happy place.",['Monica Geller'],Powerful,9,5,3,1,00:12:46.390,00:12:50.685 395 | "All right, I'll try not to.",['Monica Geller'],Scared,9,7,3,1,00:12:48.225,00:12:56.065 396 | "Okay, all right, so, your in a meadow, millions of stars in the sky....",['Phoebe Buffay'],Peaceful,9,8,3,1,00:13:05.534,00:13:13.917 397 | Do you think breaking up with him was a huge mistake?,['Monica Geller'],Scared,9,9,3,1,00:13:11.040,00:13:16.127 398 | "All right, there are no questions in the happy place. Okay, just, the warm breeze, and the moonlight flowing through the trees....",['Phoebe Buffay'],Peaceful,9,10,3,1,00:13:14.084,00:13:26.387 399 | "I'll bet he's totally over me, I'll bet he's fine.",['Monica Geller'],Powerful,9,11,3,1,00:13:26.555,00:13:32.769 400 | "Okay, this isn't working. I'm still awake and now I have to pee.",['Monica Geller'],Powerful,9,13,3,1,00:13:45.908,00:13:49.452 401 | "So, I hear, you hate me!",['Janice Litman Goralnik'],Mad,10,2,3,1,00:13:47.910,00:13:49.452 402 | "I, ah, I never said hate, I was very careful about that.",['Joey Tribbiani'],Scared,10,3,3,1,00:13:49.620,00:14:00.421 403 | A little birdie told me something about you wanting to rip your arm off and throw it at me.,['Janice Litman Goralnik'],Mad,10,4,3,1,00:13:51.664,00:14:05.844 404 | And you got a 'hate' from that?! Your taking a big leap there...,['Joey Tribbiani'],Scared,10,5,3,1,00:14:07.304,00:14:11.558 405 | "All right, fine, fine, fine, fine, fine, We've got to do something about our little situation here Joey. So, this is my idea you and me spending some quality time together.",['Janice Litman Goralnik'],Sad,10,6,3,1,00:14:11.725,00:14:26.030 406 | But what does that gonna do...,['Joey Tribbiani'],Peaceful,10,7,3,1,00:14:13.769,00:14:17.605 407 | For Chandler!,['Janice Litman Goralnik'],Powerful,10,8,3,1,00:14:17.773,00:14:19.399 408 | Okay. I'm in.,['Joey Tribbiani'],Joyful,10,9,3,1,00:14:19.567,00:14:23.486 409 | Okay. All right. This is what we're gonna call it 'Joey and Janice's DAY OF FUN!',['Janice Litman Goralnik'],Joyful,10,10,3,1,00:14:24.697,00:14:36.749 410 | Does it have to be a whole day?,['Joey Tribbiani'],Powerful,10,11,3,1,00:14:26.198,00:14:36.749 411 | "Yes, because that's how long it takes to love me.",['Janice Litman Goralnik'],Peaceful,10,12,3,1,00:14:37.626,00:14:43.631 412 | "Yeah, I know, I sleep in the next room.",['Joey Tribbiani'],Peaceful,10,13,3,1,00:14:44.174,00:14:48.303 413 | We're baack!,['Janice Litman Goralnik'],Joyful,12,2,3,1,00:14:52.558,00:14:54.559 414 | Hey!,['Joey Tribbiani'],Joyful,12,3,3,1,00:14:54.727,00:14:57.645 415 | What are you guys doing together?,['Chandler Bing'],Neutral,12,4,3,1,00:14:57.813,00:15:00.815 416 | Joey and Janice's DAY OF FUN!!!,['Janice Litman Goralnik'],Joyful,12,5,3,1,00:15:00.983,00:15:04.527 417 | Really.,['Chandler Bing'],Neutral,12,6,3,1,00:15:03.319,00:15:04.527 418 | "Yeah, yeah. We went to a Mets game, we got Chinese food, and you know, I love this woman. You have got competition buddy.",['Joey Tribbiani'],Peaceful,12,7,3,1,00:17:35.345,00:17:48.232 419 | "I just came by to give you a kiss, I have to go pick up the baby, so. I'll see you later sweetheart, you too Chandler.",['Janice Litman Goralnik'],Joyful,12,8,3,1,00:17:48.400,00:18:02.997 420 | You still can't stand her can you?,['Chandler Bing'],Neutral,12,9,3,1,00:17:49.735,00:17:52.528 421 | "I'm sorry man, I tired, I really did.",['Joey Tribbiani'],Sad,12,10,3,1,00:18:03.165,00:18:18.429 422 | "But, hey, look, you know the good thing is, is that we spent the whole day together and I survived, and what's even more amazing, so did she. It was bat day at Shea Stadium.",['Joey Tribbiani'],Joyful,12,12,3,1,00:18:20.557,00:18:34.278 423 | "Well, I guess that's something.",['Chandler Bing'],Peaceful,12,13,3,1,00:18:22.768,00:18:25.103 424 | "No man, that's huge! Now, I know I can stand to be around her, which means I get to hang out with you, which is kinda the whole point, anyway.",['Joey Tribbiani'],Neutral,12,14,3,1,00:18:36.448,00:18:48.167 425 | Okay.,['Chandler Bing'],Neutral,12,15,3,1,00:18:37.825,00:18:39.659 426 | "Oh, hey, Chandler, we, ah, we stopped by the coffee shop and ran into Ross.",['Joey Tribbiani'],Neutral,12,16,3,1,00:18:45.290,00:18:57.552 427 | Oh God!,['Chandler Bing'],Scared,12,17,3,1,00:18:48.794,00:18:57.552 428 | "Hey, if it makes you feel any better, I do it too.",['Joey Tribbiani'],Neutral,12,18,3,1,00:19:02.099,00:19:07.103 429 | Really?,['Chandler Bing'],Neutral,12,19,3,1,00:19:04.560,00:19:07.103 430 | "Oh yeah, I always picture your Mom when I'm having sex.",['Joey Tribbiani'],Joyful,12,20,3,1,00:19:08.188,00:19:14.569 431 | "Hi, Dad, what are you doing here?",['Monica Geller'],Joyful,13,4,3,1,00:19:32.421,00:19:45.391 432 | "I don't, I just, I just like the smell of them. So, uh, what are you really doing here Dad?",['Monica Geller'],Neutral,13,6,3,1,00:19:49.855,00:20:04.827 433 | "Well, I just wanted to make sure you were okay.",['Jack Geller'],Peaceful,13,7,3,1,00:20:01.742,00:20:07.205 434 | I saw Richard.,['Jack Geller'],Powerful,13,9,3,1,00:20:04.995,00:20:07.205 435 | Oh.,['Monica Geller'],Scared,13,10,3,1,00:20:08.832,00:20:10.625 436 | "So, how are you doing?",['Jack Geller'],Neutral,13,11,3,1,00:20:10.792,00:20:17.215 437 | "I'm fine, just a little tired, I'm okay. How's Richard doing?",['Monica Geller'],Sad,13,12,3,1,00:20:13.629,00:20:22.094 438 | You don't wanna know.,['Jack Geller'],Neutral,13,13,3,1,00:20:15.464,00:20:17.215 439 | "No, I really, really do.",['Monica Geller'],Peaceful,13,14,3,1,00:20:17.466,00:20:22.094 440 | "Well, he's doing terrible!",['Jack Geller'],Powerful,13,15,3,1,00:20:18.967,00:20:22.094 441 | Really!,['Monica Geller'],Joyful,13,16,3,1,00:20:22.262,00:20:25.097 442 | Worse than when he broke up with Barbara.,['Jack Geller'],Sad,13,17,3,1,00:20:28.185,00:20:37.485 443 | You're not just saying that are you?,['Monica Geller'],Neutral,13,18,3,1,00:20:38.654,00:20:43.199 444 | "No, the man is a mess.",['Jack Geller'],Powerful,13,19,3,1,00:20:44.076,00:20:50.539 445 | Was he crying?,['Monica Geller'],Neutral,13,20,3,1,00:20:46.954,00:20:50.539 446 | No.,['Jack Geller'],Neutral,13,21,3,1,00:20:50.707,00:20:52.416 447 | Maybe.,['Jack Geller'],Neutral,13,23,3,1,00:20:53.961,00:20:55.544 448 | I think so.,['Monica Geller'],Joyful,13,24,3,1,00:20:55.712,00:20:58.923 449 | Yes! Yes! Yes! Yes! Awww!,['The Guys'],Joyful,1,2,3,9,00:00:02.293,00:00:06.672 450 | "Hey, it's your Thanksgiving too, y'know, instead of watching football, you could help.",['Phoebe Buffay'],Neutral,1,3,3,9,00:00:03.795,00:00:11.301 451 | We will.,['The Guys'],Peaceful,1,4,3,9,00:00:06.840,00:00:08.757 452 | "Okay, Rachel, you wanna put the marshmellows in concentric circles.",['Monica Geller'],Neutral,1,5,3,9,00:00:11.469,00:00:17.975 453 | "No Mon, you want to put them in concentric circles. I want to do this.",['Rachel Green'],Neutral,1,6,3,9,00:00:14.305,00:00:22.438 454 | Every year.,['Monica Geller'],Neutral,1,8,3,9,00:00:19.436,00:00:22.438 455 | We should defiantly play football more often. Maybe there's a like league we could join or something.,['Rachel Green'],Joyful,5,2,3,9,00:21:41.383,00:21:52.935 456 | Isn't there a national football league.,['Phoebe Buffay'],Neutral,5,3,3,9,00:21:44.886,00:21:46.971 457 | "Yes. Yes, there is, they play on Sundays and Monday nights.",['Chandler Bing'],Neutral,5,4,3,9,00:21:49.891,00:21:56.605 458 | Oh shoot! I work Monday nights.,['Rachel Green'],Sad,5,5,3,9,00:21:53.854,00:21:56.605 459 | "Umm, this stuffing is amazing. Do you think we should bring them some?",['Phoebe Buffay'],Joyful,5,6,3,9,00:21:56.773,00:22:05.948 460 | "When they're hungry enough, they'll come in.",['Joey Tribbiani'],Neutral,5,7,3,9,00:22:06.116,00:22:11.245 461 | Let go!,['Monica Geller'],Mad,6,2,3,9,00:22:08.368,00:22:11.245 462 | No! You let go!,['Ross Geller'],Mad,6,3,3,9,00:22:13.206,00:22:16.250 463 | No!,['Monica Geller'],Mad,6,4,3,9,00:22:16.418,00:22:20.254 464 | Hey! It's starting to snow.,['Ross Geller'],Joyful,6,8,3,9,00:22:21.340,00:22:28.804 465 | Gimme the this!,['Ross Geller'],Mad,6,10,3,9,00:22:25.927,00:22:28.804 466 | Let go!,['Monica Geller'],Mad,6,11,3,9,00:22:33.060,00:22:36.228 467 | So who's idea was it to put everybody in the diner on skates?,['Rachel Green'],Neutral,1,2,3,21,00:00:02.711,00:00:05.713 468 | "Oh, some idiot customer put a suggestion in the suggestion box.",['Monica Geller'],Mad,1,3,3,21,00:04:57.714,00:05:02.926 469 | "Oh my God, they took my idea!",['Phoebe Buffay'],Joyful,1,4,3,21,00:05:35.668,00:05:43.800 470 | That was you?!,['Monica Geller'],Neutral,1,5,3,21,00:05:38.004,00:05:43.800 471 | "Yeah! Okay, here you go.",['Phoebe Buffay'],Neutral,1,6,3,21,00:05:41.507,00:05:43.800 472 | "Rachel, I made you a cocoa.",['Gunther'],Neutral,1,7,3,21,00:05:43.968,00:05:46.970 473 | "Oh my God, are you guys okay?",['Phoebe Buffay'],Scared,1,9,3,21,00:05:50.224,00:05:59.566 474 | Are you all right?,['Gunther'],Neutral,1,10,3,21,00:05:53.686,00:06:07.407 475 | Oh my.,['Joey Tribbiani'],Sad,1,11,3,21,00:05:58.566,00:05:59.566 476 | Hey.,['Chandler Bing'],Joyful,2,2,3,21,00:06:04.614,00:06:07.407 477 | Hey!,['Ross Geller'],Joyful,2,6,3,21,00:06:07.575,00:06:08.950 478 | Hey.,['Chandler Bing'],Joyful,2,7,3,21,00:06:09.118,00:06:11.995 479 | I'm gonna be on TV!!,['Ross Geller'],Joyful,2,8,3,21,00:06:12.163,00:06:16.458 480 | No way!,['Chandler Bing'],Joyful,2,9,3,21,00:06:15.166,00:06:16.458 481 | Oh my God! Who's gonna watch that?!,['Chandler Bing'],Powerful,2,11,3,21,00:06:26.386,00:06:31.681 482 | Thanks. You ready to go?,['Ross Geller'],Joyful,2,12,3,21,00:06:27.845,00:06:31.681 483 | Yeah.,['Chandler Bing'],Joyful,2,13,3,21,00:06:31.849,00:06:33.058 484 | Saw a girl with that vest.,['Joey Tribbiani'],Peaceful,2,14,3,21,00:06:33.267,00:06:36.144 485 | Thanks.,['Chandler Bing'],Powerful,2,15,3,21,00:06:36.312,00:06:38.146 486 | Hi!,['Peter Becker'],Joyful,3,2,3,21,00:06:38.314,00:06:41.024 487 | Wow! Skates!,['Peter Becker'],Joyful,3,4,3,21,00:06:43.861,00:06:46.113 488 | Well...,['Peter Becker'],Neutral,3,7,3,21,00:06:46.280,00:06:51.827 489 | "Yeah, sure, that'd be great.",['Peter Becker'],Joyful,3,9,3,21,00:06:51.994,00:06:54.037 490 | Regular or decaf?,['Monica Geller'],Neutral,3,11,3,21,00:06:54.205,00:06:58.625 491 | "Ah, which ever is closest.",['Peter Becker'],Peaceful,3,12,3,21,00:06:59.127,00:07:02.921 492 | Okay.,['Monica Geller'],Peaceful,3,13,3,21,00:07:03.089,00:07:04.714 493 | So ask me what I did today.,['Peter Becker'],Neutral,3,14,3,21,00:07:04.882,00:07:07.300 494 | So what did you do today Pete?,['Monica Geller'],Neutral,3,15,3,21,00:07:12.140,00:07:23.567 495 | What?! Oh.,['Monica Geller'],Joyful,3,17,3,21,00:07:14.142,00:07:16.476 496 | Can you believe he just offered me a restaurant?,['Monica Geller'],Joyful,4,2,3,21,00:07:47.133,00:07:53.054 497 | And you're still not attracted to him at all?,['Rachel Green'],Neutral,4,5,3,21,00:10:50.691,00:10:53.818 498 | "Oh, please.",['Monica Geller'],Sad,4,8,3,21,00:10:53.986,00:10:56.154 499 | What? Honey.,['Monica Geller'],Scared,4,10,3,21,00:10:56.322,00:10:59.449 500 | "Oh God, I'm so sorry.",['Monica Geller'],Sad,4,12,3,21,00:10:59.617,00:11:01.493 501 | I know.,['Rachel Green'],Neutral,4,13,3,21,00:11:02.870,00:11:04.537 502 | Ow!!,['Rachel Green'],Mad,4,15,3,21,00:11:04.705,00:11:08.166 503 | Oh God!,['Monica Geller'],Sad,4,16,3,21,00:11:08.376,00:11:10.543 504 | "Hey, you guys! Guess what?",['Ross Geller'],Joyful,4,17,3,21,00:11:10.711,00:11:12.796 505 | Got a job on a river boat?,['Rachel Green'],Joyful,4,18,3,21,00:11:24.809,00:11:28.770 506 | Right.,['Ross Geller'],Powerful,4,21,3,21,00:11:26.435,00:11:28.770 507 | You like it right?,['Ross Geller'],Powerful,4,23,3,21,00:11:38.197,00:11:42.617 508 | "Yeah, come here!",['Rachel Green'],Joyful,4,25,3,21,00:11:42.868,00:11:45.328 509 | What-what was it you were gonna tell us?,['Monica Geller'],Joyful,4,26,3,21,00:12:35.129,00:12:41.843 510 | Yeah. Oh! Was how you invented the cotton gin?!,['Rachel Green'],Joyful,4,27,3,21,00:14:17.606,00:14:24.946 511 | "Okay, good bye!",['Ross Geller'],Mad,4,28,3,21,00:14:22.236,00:14:24.946 512 | "Umm, oh, about three months.",['Phoebe Buffay'],Neutral,5,3,3,21,00:14:25.114,00:14:30.535 513 | Hey!!,['Joey Tribbiani'],Joyful,5,5,3,21,00:14:26.907,00:14:30.535 514 | Hey!,['Chandler Bing'],Joyful,5,6,3,21,00:14:31.203,00:14:32.620 515 | I got you something! Open it! Open it!,['Joey Tribbiani'],Joyful,5,7,3,21,00:14:40.462,00:14:46.634 516 | Okay. It's a chicken.,['Chandler Bing'],Mad,5,8,3,21,00:14:43.716,00:14:46.634 517 | "It's cute, huh?",['Joey Tribbiani'],Joyful,5,9,3,21,00:14:46.802,00:14:48.761 518 | "Whoa-whoa-whoa, you guys, do you know anything about chicks?",['Phoebe Buffay'],Joyful,5,10,3,21,00:16:30.447,00:16:37.120 519 | Fowl? No. Women? Nooo.,['Chandler Bing'],Sad,5,11,3,21,00:16:34.118,00:16:37.120 520 | "Oh, well no problem there.",['Joey Tribbiani'],Joyful,5,13,3,21,00:16:37.371,00:16:39.247 521 | Easy Lenny.,['Chandler Bing'],Powerful,5,14,3,21,00:16:39.415,00:16:40.999 522 | Oww!,['Rachel Green'],Scared,8,2,3,21,00:16:46.130,00:16:48.089 523 | Wow! That aspirin dance really works!,['Ross Geller'],Joyful,8,3,3,21,00:16:50.718,00:16:55.847 524 | Oww!,['Rachel Green'],Sad,8,4,3,21,00:16:53.721,00:16:55.847 525 | "Oh my God, is that still...",['Ross Geller'],Neutral,8,5,3,21,00:16:56.098,00:16:58.850 526 | "I'm fine, I'm fine.",['Rachel Green'],Scared,8,6,3,21,00:17:02.896,00:17:04.814 527 | No you're not.,['Ross Geller'],Mad,8,7,3,21,00:17:06.025,00:17:08.484 528 | Yes I am!,['Rachel Green'],Neutral,8,8,3,21,00:17:09.361,00:17:13.406 529 | Rach!,['Ross Geller'],Neutral,8,9,3,21,00:17:11.655,00:17:13.406 530 | "Look, I'm fine. Watch. Look at that. Whoa-whoa!",['Rachel Green'],Scared,8,10,3,21,00:17:31.884,00:17:34.135 531 | Rach...,['Ross Geller'],Neutral,8,15,3,21,00:17:36.555,00:17:37.805 532 | Rachel...,['Ross Geller'],Neutral,8,17,3,21,00:17:37.973,00:17:40.391 533 | "Look, either help me or go.",['Rachel Green'],Mad,8,18,3,21,00:17:40.559,00:17:44.479 534 | Fine. I'll go.,['Ross Geller'],Scared,8,19,3,21,00:17:44.646,00:17:47.315 535 | Sure. I'll help you.,['Ross Geller'],Neutral,8,21,3,21,00:17:47.483,00:17:49.442 536 | Ohh.,['Ross Geller'],Neutral,9,3,3,21,00:17:49.610,00:17:51.402 537 | Okay. Let's use this brush.,['Rachel Green'],Neutral,9,4,3,21,00:18:01.622,00:18:08.169 538 | Okay. This stuff?,['Ross Geller'],Neutral,9,5,3,21,00:18:06.335,00:18:08.169 539 | Yeah.,['Rachel Green'],Neutral,9,6,3,21,00:18:08.337,00:18:11.923 540 | All right.,['Ross Geller'],Neutral,9,7,3,21,00:18:12.091,00:18:15.885 541 | Oke-dokey.,['Ross Geller'],Neutral,9,9,3,21,00:18:17.638,00:18:21.099 542 | Oh-ho!,['Rachel Green'],Neutral,9,10,3,21,00:18:21.266,00:18:22.517 543 | Sorry.,['Ross Geller'],Peaceful,9,11,3,21,00:18:22.684,00:18:26.938 544 | Hey! That's just poking me in the eye!,['Rachel Green'],Mad,9,12,3,21,00:19:49.855,00:19:59.280 545 | "Sorry, I'm sorry. Close, close, close...",['Ross Geller'],Sad,9,13,3,21,00:19:57.779,00:19:59.280 546 | "Okay, just sweep it.",['Rachel Green'],Powerful,9,14,3,21,00:19:59.448,00:20:03.201 547 | I'm sweeping...,['Ross Geller'],Neutral,9,15,3,21,00:20:04.077,00:20:09.248 548 | Right.,['Rachel Green'],Neutral,9,16,3,21,00:20:11.043,00:20:13.628 549 | "Sweep, sweep....",['Ross Geller'],Neutral,9,17,3,21,00:20:16.548,00:20:20.218 550 | "Okay, now make it even, 'cause we don't...",['Rachel Green'],Powerful,9,18,3,21,00:20:25.265,00:20:32.480 551 | What? What?,['Ross Geller'],Scared,9,19,3,21,00:20:28.060,00:20:29.518 552 | Blow it.,['Rachel Green'],Mad,9,25,3,21,00:20:29.686,00:20:32.480 553 | Sophisticated like a hooker?,['Rachel Green'],Mad,9,27,3,21,00:20:32.648,00:20:38.277 554 | Hey!,['Monica Geller'],Joyful,10,2,3,21,00:20:36.735,00:20:38.277 555 | Hey!,['Phoebe Buffay'],Joyful,10,3,3,21,00:20:38.445,00:20:43.157 556 | "Hey, guess what I'm doing tonight.",['Monica Geller'],Joyful,10,4,3,21,00:20:43.742,00:20:47.578 557 | What?,['Phoebe Buffay'],Sad,10,5,3,21,00:20:45.827,00:20:47.578 558 | I'm checking out the restaurant with Pete.,['Monica Geller'],Joyful,10,6,3,21,00:20:50.707,00:20:54.835 559 | "Ohh, Monica, I am so excited for you.",['Phoebe Buffay'],Joyful,10,7,3,21,00:20:55.003,00:21:00.967 560 | I know.,['Monica Geller'],Neutral,10,8,3,21,00:20:57.381,00:21:00.967 561 | "Ooh, I have to tell you something.",['Phoebe Buffay'],Neutral,10,9,3,21,00:21:11.603,00:21:17.775 562 | What?,['Monica Geller'],Neutral,10,10,3,21,00:21:13.689,00:21:15.147 563 | But I can't tell you.,['Phoebe Buffay'],Powerful,10,11,3,21,00:21:15.357,00:21:17.775 564 | No.,['Phoebe Buffay'],Neutral,10,15,3,21,00:21:17.943,00:21:20.361 565 | Does it have to do with Joey?,['Monica Geller'],Scared,10,16,3,21,00:21:23.657,00:21:47.930 566 | No.,['Phoebe Buffay'],Neutral,10,17,3,21,00:21:32.666,00:21:33.874 567 | Does it involve travel?,['Monica Geller'],Neutral,12,2,3,21,00:21:46.638,00:21:47.930 568 | Noo!,['Phoebe Buffay'],Neutral,12,3,3,21,00:21:58.317,00:21:59.525 569 | Does it involve clogs?,['Monica Geller'],Neutral,12,4,3,21,00:21:59.693,00:22:03.904 570 | "Oh, wait, wait. Clogs, or claws?",['Phoebe Buffay'],Neutral,12,5,3,21,00:22:01.903,00:22:05.906 571 | Clogs.,['Monica Geller'],Neutral,12,6,3,21,00:22:04.364,00:22:05.906 572 | No.,['Phoebe Buffay'],Neutral,12,7,3,21,00:22:06.074,00:22:07.700 573 | Claws?!,['Monica Geller'],Scared,12,8,3,21,00:22:09.453,00:22:11.078 574 | No.,['Phoebe Buffay'],Peaceful,12,9,3,21,00:22:12.456,00:22:14.915 575 | No!,['Phoebe Buffay'],Joyful,12,11,3,21,00:22:22.424,00:22:24.800 576 | What is it?! What about Pete?,['Monica Geller'],Neutral,12,12,3,21,00:22:25.552,00:22:28.304 577 | I don't know!,['Phoebe Buffay'],Neutral,12,13,3,21,00:22:29.306,00:22:33.059 578 | I can't!!,['Phoebe Buffay'],Neutral,12,15,3,21,00:22:33.769,00:22:35.770 579 | "Okay, I gotta go.",['Monica Geller'],Neutral,12,16,3,21,00:22:41.026,00:22:43.027 580 | Hi!,['Ross Geller'],Joyful,1,2,4,1,00:00:02.252,00:00:05.546 581 | Hi!,"['Bonnie', 'Rachel Green']",Joyful,1,3,4,1,00:00:05.714,00:00:06.922 582 | Rachel was just helping me out. My head got all sunburned.,['Bonnie'],Neutral,1,4,4,1,00:00:45.670,00:00:52.718 583 | Awww.,['Ross Geller'],Peaceful,1,5,4,1,00:00:46.963,00:00:48.464 584 | Thanks a million.,['Bonnie'],Neutral,1,6,4,1,00:00:50.258,00:00:52.718 585 | "Oh, you're welcome a million.",['Rachel Green'],Peaceful,1,7,4,1,00:00:53.094,00:00:58.724 586 | "Okay, I'll see you in our room.",['Bonnie'],Neutral,1,8,4,1,00:00:59.059,00:01:01.643 587 | Yeah.,['Ross Geller'],Peaceful,1,9,4,1,00:01:14.449,00:01:15.532 588 | Oh my God.,['Rachel Green'],Scared,1,10,4,1,00:01:15.700,00:01:23.874 589 | I know.,['Ross Geller'],Neutral,1,11,4,1,00:01:21.206,00:01:23.874 590 | "Okay, I gotta go.",['Ross Geller'],Scared,1,13,4,1,00:01:24.042,00:01:26.919 591 | Whoa! What?! Why?!,['Rachel Green'],Scared,1,14,4,1,00:01:27.629,00:01:31.465 592 | "Well, I-I gotta go break up with Bonnie.",['Ross Geller'],Powerful,1,15,4,1,00:01:45.105,00:01:47.356 593 | Here?! Now?!,['Rachel Green'],Scared,1,16,4,1,00:01:47.524,00:01:49.024 594 | Whoa-ho.,['Rachel Green'],Scared,1,20,4,1,00:01:49.192,00:01:54.279 595 | "Whoa-oh, okay! Yeah, why am I telling you that?",['Ross Geller'],Scared,1,21,4,1,00:04:20.969,00:04:24.388 596 | I don't know.,['Rachel Green'],Neutral,1,22,4,1,00:04:26.557,00:04:30.102 597 | "Yeah, yeah. It wasn't every morning.",['Ross Geller'],Neutral,1,24,4,1,00:04:28.351,00:04:34.273 598 | "Oh, making it worse!",['Rachel Green'],Mad,1,25,4,1,00:04:32.188,00:04:34.273 599 | Okay.,['Ross Geller'],Neutral,1,26,4,1,00:04:34.440,00:04:36.191 600 | How close?,['Phoebe Buffay'],Scared,2,5,4,1,00:04:36.359,00:04:39.278 601 | I don't even know how that would work!,['Phoebe Buffay'],Powerful,2,7,4,1,00:05:30.580,00:05:32.331 602 | "Well, we were...",['Phoebe Abbott'],Joyful,2,8,4,1,00:05:32.498,00:05:35.042 603 | I'm not asking!,['Phoebe Buffay'],Peaceful,2,9,4,1,00:05:35.209,00:05:45.385 604 | Wait!,['Phoebe Abbott'],Sad,2,14,4,1,00:05:41.382,00:05:45.385 605 | I don't ever want to see you again!,['Phoebe Buffay'],Sad,2,15,4,1,00:05:45.928,00:05:57.689 606 | "Umm, where's my purse?",['Phoebe Buffay'],Scared,2,17,4,1,00:05:53.102,00:05:54.644 607 | Shoot! We're out of soda.,['Monica Geller'],Mad,3,2,4,1,00:05:54.812,00:05:57.689 608 | "Oh, I'll go out and get you some.",['Chandler Bing'],Joyful,3,3,4,1,00:06:36.270,00:06:39.481 609 | Really?!,['Monica Geller'],Scared,3,4,4,1,00:06:39.649,00:06:42.651 610 | I found a dried up seashores.,['Chandler Bing'],Neutral,3,8,4,1,00:06:43.486,00:06:48.365 611 | "Sweety, what are you talking about?",['Monica Geller'],Scared,3,9,4,1,00:06:47.156,00:07:11.221 612 | "No. I'm just, I wanna, I need to be alone.",['Phoebe Buffay'],Powerful,3,12,4,1,00:07:21.357,00:07:27.446 613 | Monica!,['Phoebe Buffay'],Joyful,3,14,4,1,00:07:24.235,00:07:27.446 614 | Oh.,['Monica Geller'],Neutral,3,15,4,1,00:07:28.114,00:07:33.243 615 | It's over.,['Ross Geller'],Mad,4,2,4,1,00:07:33.411,00:07:37.247 616 | "Oh, was it awful?",['Rachel Green'],Joyful,4,3,4,1,00:07:37.415,00:07:44.296 617 | I wrote you a letter.,['Rachel Green'],Neutral,4,6,4,1,00:07:40.376,00:07:51.970 618 | Ohh! Thank you! I like mail.,['Ross Geller'],Joyful,4,7,4,1,00:07:43.171,00:07:59.769 619 | Oh. Oh-oh.,['Ross Geller'],Neutral,5,2,4,1,00:07:50.595,00:07:51.970 620 | Hey! What happened to you? Why didn't you come up?,['Rachel Green'],Powerful,5,3,4,1,00:17:43.395,00:17:49.442 621 | Done!,['Ross Geller'],Scared,5,4,4,1,00:17:45.647,00:17:49.442 622 | You just finished?,['Rachel Green'],Mad,5,5,4,1,00:17:49.818,00:17:54.614 623 | "So umm, does it?",['Rachel Green'],Scared,5,7,4,1,00:17:53.155,00:17:54.614 624 | I'm sorry.,['Ross Geller'],Scared,5,8,4,1,00:17:54.782,00:17:58.242 625 | Does it?,['Rachel Green'],Scared,5,9,4,1,00:17:58.410,00:18:00.495 626 | Are you sure?,['Rachel Green'],Joyful,5,14,4,1,00:18:00.662,00:18:04.082 627 | "Oh, sure! I'm sure.",['Ross Geller'],Scared,5,15,4,1,00:18:04.249,00:18:07.543 628 | I know.,['Rachel Green'],Joyful,5,16,4,1,00:18:09.379,00:18:15.426 629 | Ennnh.,['Monica Geller'],Neutral,6,3,4,1,00:18:14.009,00:18:15.426 630 | I've got canned goods.,['Chandler Bing'],Neutral,6,4,4,1,00:18:16.178,00:18:21.307 631 | "Excellent hole, Joe.",['Chandler Bing'],Neutral,6,6,4,1,00:18:19.973,00:18:21.307 632 | Oh no! No!! My hole!!,['Joey Tribbiani'],Powerful,6,8,4,1,00:18:22.476,00:18:25.186 633 | Ow!! Ow!!!,['Monica Geller'],Powerful,6,9,4,1,00:18:26.480,00:18:28.189 634 | What?! What?!! What is it?!,['Joey Tribbiani'],Scared,6,10,4,1,00:18:28.357,00:18:35.613 635 | It's like two miles!,['Monica Geller'],Peaceful,6,13,4,1,00:18:29.608,00:18:35.613 636 | "Yeah, and I'm a little tired from digging the hole.",['Joey Tribbiani'],Peaceful,6,14,4,1,00:20:44.701,00:20:49.580 637 | Oh damn the jellyfish. Damn all the jellyfish!,['Monica Geller'],Neutral,6,15,4,1,00:21:09.393,00:21:14.438 638 | We've got to do something!,['Chandler Bing'],Peaceful,6,16,4,1,00:21:11.561,00:21:14.438 639 | What?! What is it?!,['Monica Geller'],Peaceful,6,18,4,1,00:21:12.813,00:21:14.438 640 | You're gonna have to pee on it.,['Joey Tribbiani'],Neutral,6,19,4,1,00:21:30.539,00:21:35.167 641 | What?!! Gross!!,['Monica Geller'],Neutral,6,20,4,1,00:21:31.957,00:21:35.167 642 | Well forget it! It doesn't hurt that baaad!!!!,['Monica Geller'],Neutral,6,23,4,1,00:21:53.895,00:21:57.815 643 | Hey!,['Ross Geller'],Peaceful,7,4,4,1,00:21:58.734,00:22:00.818 644 | How was the beach?,['Rachel Green'],Peaceful,7,5,4,1,00:22:06.074,00:22:10.244 645 | "Nothing, I don't know.",['Monica Geller'],Sad,7,6,4,1,00:22:08.368,00:22:10.244 646 | What happened?,['Ross Geller'],Neutral,7,7,4,1,00:22:12.456,00:22:15.249 647 | Nothing. I'm gonna take a shower.,['Monica Geller'],Neutral,7,8,4,1,00:22:15.417,00:22:18.085 648 | Me too!!,['Chandler Bing'],Neutral,7,9,4,1,00:22:18.253,00:22:19.754 649 | Me too.,['Joey Tribbiani'],Neutral,7,10,4,1,00:22:20.339,00:22:23.257 650 | It does. It really and truly does.,['Ross Geller'],Scared,7,13,4,1,00:22:23.425,00:22:26.635 651 | It so does not!!!,['Ross Geller'],Powerful,7,15,4,1,00:22:26.803,00:22:27.887 652 | No?,['Joey Tribbiani'],Neutral,8,5,4,1,00:22:29.848,00:22:32.683 653 | "It's between us and the sea, Ross!",['Joey Tribbiani'],Mad,8,10,4,1,00:22:40.984,00:22:42.985 654 | "So, thank you for the delicious dinner.",['Cheryl'],Joyful,1,2,4,6,00:00:02.502,00:00:06.588 655 | You're welcome for a delicious dinner.,['Ross Geller'],Powerful,1,3,4,6,00:00:06.840,00:00:08.757 656 | Hey what are you guys looking at?,['Phoebe Buffay'],Neutral,1,5,4,6,00:00:24.733,00:00:27.067 657 | Ross and the most beautiful girl in the world.,['Chandler Bing'],Scared,1,6,4,6,00:12:03.264,00:12:06.766 658 | "Yeah, come to papa.",['Phoebe Buffay'],Joyful,1,7,4,6,00:12:06.976,00:12:09.269 659 | I know!,['Ross Geller'],Powerful,1,9,4,6,00:12:11.564,00:12:13.815 660 | "Okay, but that's, like, the easiest era.",['Chandler Bing'],Powerful,1,14,4,6,00:12:29.498,00:12:31.791 661 | Fine by me; hope she wins.,['Ross Geller'],Joyful,1,17,4,6,00:12:32.501,00:12:33.918 662 | Huh...,['Ross Geller'],Joyful,3,2,4,6,00:12:34.170,00:12:36.880 663 | "Um, would you like to come in?",['Cheryl'],Peaceful,3,3,4,6,00:12:44.513,00:12:52.061 664 | Did homo-erectus hunt with wooden tools?,['Ross Geller'],Joyful,3,4,4,6,00:12:46.515,00:12:52.061 665 | According to recent findings!,['Cheryl'],Neutral,3,5,4,6,00:12:49.101,00:12:52.061 666 | Here Mitzi! Here Mitzi!,['Cheryl'],Scared,3,7,4,6,00:12:53.898,00:13:05.450 667 | Mitzi is.....,['Ross Geller'],Scared,3,8,4,6,00:13:01.947,00:13:05.450 668 | What?,['Cheryl'],Scared,3,11,4,6,00:13:05.701,00:13:08.495 669 | I'd rather not.,['Cheryl'],Peaceful,3,13,4,6,00:13:08.662,00:13:14.250 670 | "Oh, yeah, why not?",['Ross Geller'],Scared,3,14,4,6,00:13:09.830,00:13:14.250 671 | "Oh, is everything in the car?",['Monica Geller'],Neutral,4,2,4,6,00:13:14.543,00:13:17.378 672 | Yes. Did you settle the bill?,['Phoebe Buffay'],Neutral,4,3,4,6,00:13:17.713,00:13:21.216 673 | No. I hate this part.,['Monica Geller'],Powerful,4,4,4,6,00:13:21.425,00:13:24.219 674 | "Oh, look what we almost left.",['Phoebe Buffay'],Peaceful,4,5,4,6,00:13:24.428,00:13:29.766 675 | "No, that's not mine.",['Monica Geller'],Neutral,4,6,4,6,00:13:27.056,00:13:29.766 676 | "Oh, good. Thank you.",['Mrs. Burkart'],Joyful,4,10,4,6,00:13:30.392,00:13:33.061 677 | Dear?,['Mrs. Burkart'],Joyful,4,12,4,6,00:13:33.229,00:13:36.606 678 | Just the matter of ...payment?,['Monica Geller'],Neutral,4,13,4,6,00:13:36.899,00:13:38.775 679 | Jack used to handle the finances!,['Mrs. Burkart'],Sad,4,14,4,6,00:13:38.984,00:13:42.237 680 | "But Mon, you have to get our money!",['Phoebe Buffay'],Neutral,6,2,4,6,00:14:48.804,00:14:52.974 681 | What?,['Monica Geller'],Neutral,6,5,4,6,00:14:51.265,00:14:52.974 682 | Okay. So what do you.... you think she's faking?,['Monica Geller'],Sad,6,7,4,6,00:19:46.435,00:19:55.818 683 | "Phoebe, she sounded pretty upset to me.",['Monica Geller'],Sad,6,9,4,6,00:20:02.826,00:20:06.370 684 | She seems fine now.,['Phoebe Buffay'],Peaceful,6,12,4,6,00:20:04.536,00:20:06.370 685 | ...emblem of the land I love. The home of....,['Mrs. Burkart'],Joyful,6,13,4,6,00:20:32.856,00:20:40.321 686 | Yeah.,['Joey Tribbiani'],Neutral,7,4,4,6,00:20:36.652,00:20:40.321 687 | "Wow. Thanks. So, uh, what happened?",['Joey Tribbiani'],Joyful,7,6,4,6,00:20:41.823,00:20:44.700 688 | What kind of smell?,['Joey Tribbiani'],Powerful,7,10,4,6,00:20:43.158,00:20:47.828 689 | I don't know. Soap?,['Ross Geller'],Scared,7,11,4,6,00:20:44.910,00:20:47.828 690 | Yeah.,['Ross Geller'],Peaceful,7,13,4,6,00:20:48.038,00:20:49.288 691 | "You wanna see her again, right?",['Joey Tribbiani'],Sad,7,14,4,6,00:20:49.790,00:20:51.832 692 | Yeah.,['Ross Geller'],Peaceful,7,15,4,6,00:20:52.042,00:20:56.587 693 | "Yeah, okay you're right.",['Ross Geller'],Joyful,7,17,4,6,00:20:59.341,00:21:01.175 694 | Yeah.,['Joey Tribbiani'],Neutral,7,18,4,6,00:21:01.426,00:21:03.386 695 | Yeah!,['Joey Tribbiani'],Peaceful,7,20,4,6,00:21:03.553,00:21:04.929 696 | "It's, uh... it's endearing, really.",['Ross Geller'],Peaceful,7,21,4,6,00:21:05.681,00:21:09.684 697 | Any luck?,['Rachel Green'],Joyful,8,3,4,6,00:21:10.435,00:21:13.729 698 | "Aw, honey, that's so sweet.",['Rachel Green'],Joyful,8,7,4,6,00:21:14.022,00:21:22.697 699 | Yeah? You don't think it's just pathetic?,['Chandler Bing'],Peaceful,8,8,4,6,00:21:24.616,00:21:39.422 700 | Oh! Pathetic!,['Rachel Green'],Powerful,8,9,4,6,00:21:36.211,00:21:39.422 701 | Where?,['Chandler Bing'],Powerful,8,11,4,6,00:21:46.638,00:21:48.639 702 | "Our place, the hall! I...",['Joey Tribbiani'],Joyful,8,12,4,6,00:21:50.058,00:21:53.394 703 | "You didn't get the money, did you?",['Phoebe Buffay'],Powerful,9,4,4,6,00:21:53.603,00:21:56.856 704 | Come on along and listen to...,['Mrs. Burkart'],Scared,9,7,4,6,00:21:57.065,00:21:59.400 705 | "Okay, Widow!",['Phoebe Buffay'],Scared,9,8,4,6,00:21:59.651,00:22:02.570 706 | ...the lullabye of...,['Mrs. Burkart'],Sad,9,9,4,6,00:22:04.448,00:22:07.825 707 | All right. I'll get my bag.,['Mrs. Burkart'],Mad,9,11,4,6,00:22:09.870,00:22:25.593 708 | Good.,['Phoebe Buffay'],Joyful,9,12,4,6,00:22:23.592,00:22:25.593 709 | Hey!,['Ross Geller'],Joyful,1,2,4,10,00:00:02.794,00:00:04.586 710 | Hey!,"['Chandler Bing', 'Joey Tribbiani', 'Phoebe Buffay']",Joyful,1,3,4,10,00:00:04.963,00:00:06.755 711 | "I'm sorry I'm late, did I miss anything?",['Ross Geller'],Neutral,1,4,4,10,00:00:44.669,00:00:50.632 712 | Joey stuffing 15 Oreos in his mouth.,['Phoebe Buffay'],Joyful,1,5,4,10,00:00:55.472,00:00:57.806 713 | 15? Your personal best!,['Ross Geller'],Peaceful,1,6,4,10,00:00:58.808,00:01:00.726 714 | Where were you?,['Phoebe Buffay'],Powerful,1,7,4,10,00:01:01.561,00:01:03.437 715 | "Oh, yeah! How did you meet her?",['Chandler Bing'],Peaceful,1,10,4,10,00:02:09.838,00:02:12.965 716 | "Oh, which museum?",['Phoebe Buffay'],Powerful,1,11,4,10,00:02:13.550,00:02:15.384 717 | "No, answer his.",['Phoebe Buffay'],Peaceful,1,12,4,10,00:02:15.844,00:02:17.761 718 | "Done! I did it! Heh, who's stupid now?",['Joey Tribbiani'],Powerful,1,17,4,10,00:02:29.691,00:02:41.368 719 | I didn't think you were gay. I do now.,['Drew'],Peaceful,3,3,4,10,00:02:41.619,00:02:44.746 720 | "See my friend-my friend, Rachel, she wants to be set up.",['Chandler Bing'],Scared,3,4,4,10,00:05:29.370,00:05:38.420 721 | "Ahh, I just got out of a big relationship, I'm not looking for any thing serious.",['Drew'],Scared,3,5,4,10,00:05:38.796,00:05:46.970 722 | "Whoa-whoa-whoa-whoa! Is this, hot Rachel, that you took to the Christmas party, Rachel?",['Mike'],Joyful,3,7,4,10,00:05:43.634,00:05:51.558 723 | "Oh, by the way, that is her full name.",['Chandler Bing'],Neutral,3,8,4,10,00:05:51.976,00:05:56.730 724 | Oh wow! I'm free for her!,['Mike'],Joyful,3,9,4,10,00:05:55.063,00:05:59.399 725 | "Oh, wait a second! I didn't say I wasn't free!",['Drew'],Neutral,3,10,4,10,00:05:56.939,00:06:02.444 726 | "Hold on, y'know I just got a box of Cubans, maybe I bring them by your office around uh, five?",['Drew'],Powerful,3,12,4,10,00:06:00.401,00:06:08.533 727 | "Well, I don't really know what that is, but let's!!",['Chandler Bing'],Joyful,3,15,4,10,00:06:18.461,00:06:29.638 728 | "Oh, wow! I should get going. I-I got a date tonight.",['Ross Geller'],Joyful,5,2,4,10,00:08:57.995,00:09:10.465 729 | Oh yeah! With who?,['Chandler Bing'],Scared,5,3,4,10,00:09:00.706,00:09:10.465 730 | You know that girl I told you about who lives up in Poughkeepsie?,['Ross Geller'],Peaceful,5,4,4,10,00:09:08.130,00:09:15.136 731 | Yeah.,['Chandler Bing'],Powerful,5,5,4,10,00:09:10.716,00:09:11.841 732 | "If she's no fun, why do you want to date her at all?",['Phoebe Buffay'],Joyful,5,7,4,10,00:09:35.658,00:09:47.085 733 | Hey!,['Joey Tribbiani'],Joyful,5,9,4,10,00:09:38.077,00:09:39.828 734 | Hey!,['Ross Geller'],Joyful,5,10,4,10,00:09:40.788,00:09:42.372 735 | "Hey, man!",['Chandler Bing'],Peaceful,5,11,4,10,00:09:44.208,00:09:47.085 736 | "Hey! Ooh, how was your first day working at the restaurant?",['Phoebe Buffay'],Peaceful,5,12,4,10,00:10:07.273,00:10:13.737 737 | Damn!,['Joey Tribbiani'],Powerful,5,13,4,10,00:10:08.608,00:10:11.693 738 | Hey.,['Joey Tribbiani'],Neutral,6,2,4,10,00:10:11.902,00:10:13.737 739 | Hey.,['Monica Geller'],Neutral,6,3,4,10,00:10:20.703,00:10:22.078 740 | "Hey, what happened to your fancy chef's jacket?",['Joey Tribbiani'],Neutral,6,4,4,10,00:10:22.288,00:10:26.249 741 | You got it! Oh-oh!,['Joey Tribbiani'],Scared,6,6,4,10,00:10:24.582,00:10:27.792 742 | What are you doing?!,['Monica Geller'],Mad,6,7,4,10,00:10:26.667,00:10:27.792 743 | It's still a tiny bit on fire there.,['Joey Tribbiani'],Scared,6,8,4,10,00:10:31.714,00:10:35.634 744 | Thanks. I think you got it!,['Monica Geller'],Neutral,6,9,4,10,00:10:33.507,00:10:39.179 745 | Chandler!! You have the best taste in men!,['Rachel Green'],Joyful,7,2,4,10,00:10:37.303,00:10:47.145 746 | "Well, like father, like son.",['Chandler Bing'],Joyful,7,3,4,10,00:10:43.726,00:10:47.145 747 | "Well, y'know, possibly. You didn't tell him that, though? Right?",['Rachel Green'],Scared,7,6,4,10,00:11:01.369,00:11:09.793 748 | "Ummmmmmmm, no.",['Chandler Bing'],Scared,7,7,4,10,00:11:06.540,00:11:09.793 749 | You told this guy that I was looking for a fling?! You don't tell the guy that!,['Rachel Green'],Mad,7,8,4,10,00:11:09.960,00:11:20.095 750 | "Hey, Joey, could you pass the cheese?",['Monica Geller'],Joyful,8,2,4,10,00:11:14.048,00:11:17.592 751 | "Hey, dragon! Here's your tips from Monday and Tuesday.",['A Waiter'],Peaceful,8,4,4,10,00:11:46.080,00:11:52.377 752 | There's like-there's like 300 bucks in this one!,['Joey Tribbiani'],Joyful,8,5,4,10,00:11:49.083,00:11:55.296 753 | "Yeah, people get pretty generous around the holidays. And it never hurts to wear tight trousers.",['The Waiter'],Scared,8,6,4,10,00:11:53.504,00:12:01.594 754 | Because we can remember them.,['The Waiter'],Neutral,8,8,4,10,00:11:55.548,00:11:58.007 755 | "Well, sure, that too.",['The Waiter'],Powerful,8,10,4,10,00:11:58.217,00:12:01.594 756 | "Okay, forget the specials for a minute. Umm, all right here's the thing, for the last two weeks I have umm, tried really hard to create a positive atmosphere...",['Monica Geller'],Peaceful,8,11,4,10,00:12:19.405,00:12:38.006 757 | Can't hear you!,['The Waiter'],Powerful,8,12,4,10,00:12:23.534,00:12:27.912 758 | No ma'am.,['Joey Tribbiani'],Joyful,8,14,4,10,00:12:29.415,00:12:31.499 759 | "Hey! He has a name, it's Dragon. Do you wanna know your name? Check your hat. We did the hat right?",['The Waiter'],Neutral,8,15,4,10,00:13:15.294,00:13:28.431 760 | What the hell happened?!,['Monica Geller'],Scared,9,2,4,10,00:13:18.714,00:13:21.090 761 | "Joey, we had a deal. That-that's why you're here! I've got to fire you!",['Monica Geller'],Mad,9,4,4,10,00:13:45.115,00:13:56.751 762 | What kinda things have you been saying?,['Monica Geller'],Neutral,9,6,4,10,00:13:48.994,00:13:56.751 763 | "Well nothing yet, they really hate you and I want to fit in.",['Joey Tribbiani'],Neutral,9,7,4,10,00:14:11.433,00:14:16.312 764 | "Happy, happy Chanukah, Chandler and Monica. Very merry...",['Phoebe Buffay'],Joyful,10,2,4,10,00:14:17.231,00:14:20.650 765 | "Oh, y'know, y'know what Pheebs?",['Chandler Bing'],Neutral,10,3,4,10,00:14:20.901,00:14:25.905 766 | What?,['Phoebe Buffay'],Neutral,10,4,4,10,00:14:24.029,00:14:25.905 767 | "I'm not Jewish, so...",['Chandler Bing'],Neutral,10,5,4,10,00:14:26.448,00:14:29.534 768 | Bad dream?,['Chandler Bing'],Neutral,10,7,4,10,00:14:29.785,00:14:31.786 769 | I wasn't sleeping.,['Ross Geller'],Neutral,10,8,4,10,00:14:32.037,00:14:37.417 770 | "Oh yeah, then uh, what was Phoebe's song about?",['Chandler Bing'],Neutral,10,9,4,10,00:14:35.791,00:14:42.964 771 | "The one with the cat. I gotta go, I've got another date.",['Ross Geller'],Neutral,10,10,4,10,00:14:41.046,00:14:51.681 772 | "So, did you pick one yet?",['Phoebe Buffay'],Neutral,10,11,4,10,00:14:44.341,00:14:47.093 773 | "Y'know, you're right. Thank you.",['Ross Geller'],Neutral,10,14,4,10,00:14:48.679,00:14:51.681 774 | "Umm, well I had a similar problem when I lived in Prague.",['Phoebe Buffay'],Neutral,10,15,4,10,00:15:21.337,00:15:27.592 775 | Prague?,['Chandler Bing'],Neutral,10,16,4,10,00:15:24.298,00:15:27.592 776 | There's sooo much you don't know.,['Phoebe Buffay'],Neutral,10,17,4,10,00:15:28.636,00:15:31.679 777 | I did! I absolutely did!,['Chandler Bing'],Scared,11,3,4,10,00:15:45.027,00:15:48.655 778 | You idiot!!,['Rachel Green'],Mad,11,4,4,10,00:15:46.528,00:15:48.655 779 | "I'm sure you're right, but why?",['Chandler Bing'],Scared,11,5,4,10,00:15:48.864,00:15:53.952 780 | "Oh, man. I'm sorry, I'm so-so sorry.",['Chandler Bing'],Sad,11,7,4,10,00:15:56.664,00:16:00.750 781 | "Y'know, you should never be allowed to talk to people!",['Rachel Green'],Mad,11,8,4,10,00:16:08.342,00:16:14.472 782 | I know! I know!,['Chandler Bing'],Sad,11,9,4,10,00:16:11.428,00:16:14.472 783 | "Oh! See just I'm right back where I started! Aww, this sucks! Being alone, sucks!",['Rachel Green'],Mad,11,10,4,10,00:16:15.307,00:16:24.148 784 | Really?,['Rachel Green'],Joyful,11,12,4,10,00:16:17.184,00:16:20.144 785 | "Yeah! You graduated Magma Ku Laude, right?",['Chandler Bing'],Neutral,11,13,4,10,00:16:27.027,00:16:33.908 786 | No.,['Rachel Green'],Neutral,11,14,4,10,00:16:29.154,00:16:33.908 787 | Cute guys in little shorts? Sure.,['Rachel Green'],Joyful,11,16,4,10,00:16:35.327,00:16:40.415 788 | "Well, actually it's a hockey team, so it's angry Canadians with no teeth.",['Chandler Bing'],Joyful,11,17,4,10,00:16:52.177,00:17:02.103 789 | Well that sounds fun too.,['Rachel Green'],Joyful,11,18,4,10,00:16:54.555,00:17:02.103 790 | Have you ever been with a woman?,['Chandler Bing'],Peaceful,11,20,4,10,00:16:57.307,00:17:02.103 791 | "What?! Chandler, what is the matter with you?!",['Rachel Green'],Mad,11,21,4,10,00:17:13.866,00:17:21.205 792 | So there is no good time to ask that question.,['Chandler Bing'],Scared,11,22,4,10,00:17:15.159,00:17:21.205 793 | I need more swordfish. Can you get me some more swordfish?,['Monica Geller'],Powerful,13,2,4,10,00:17:30.549,00:17:51.402 794 | I don't speak English.,['Kitchen Worker'],Mad,13,3,4,10,00:17:34.303,00:17:41.684 795 | You did a minute ago!,['Monica Geller'],Powerful,13,4,4,10,00:17:38.432,00:17:46.647 796 | "Well, I don't know what to tell ya!",['Kitchen Worker'],Mad,13,5,4,10,00:17:44.938,00:17:51.402 797 | Fine!,['Monica Geller'],Mad,13,6,4,10,00:17:47.900,00:17:51.402 798 | "Okay! Very funny! Somebody let me out please?! Come on, I'm cold! And covered in marinara sauce! Come on! Let me out!",['Monica Geller'],Mad,13,8,4,10,00:17:57.451,00:18:28.981 799 | "You found that handle, did ya?",['The Waiter'],Powerful,13,9,4,10,00:18:08.754,00:18:13.091 800 | That's not funny.,['Monica Geller'],Mad,13,10,4,10,00:18:11.840,00:18:13.091 801 | Well that's not true.,['The Waiter'],Powerful,13,11,4,10,00:18:13.592,00:18:15.676 802 | Hey! Chef Geller! Y'know that little speech you made the other day? Well I got a problem with it!,['Joey Tribbiani'],Powerful,13,13,4,10,00:18:43.956,00:18:53.923 803 | You do?,['Monica Geller'],Mad,13,14,4,10,00:18:46.834,00:18:48.709 804 | "You bet I do! I just ah, wasn't listening then, that's all.",['Joey Tribbiani'],Powerful,13,15,4,10,00:18:56.593,00:19:03.432 805 | Well if you want a problem? I'll give you a problem!,['Monica Geller'],Powerful,13,16,4,10,00:18:59.721,00:19:08.980 806 | What are you gonna do? You're gonna fire me?,['Joey Tribbiani'],Scared,13,17,4,10,00:19:09.982,00:19:15.903 807 | You bet your ass I'm gonna fire you! Get out of my kitchen! Get out!! All right! Anybody else got a problem? How 'bout you Chuckles? You think this is funny now?,['Monica Geller'],Mad,13,18,4,10,00:19:12.401,00:19:36.841 808 | No.,['The Waiter'],Scared,13,19,4,10,00:19:16.572,00:19:18.364 809 | How about if I dance around all covered in sauce? Huh? You think it's funny now?,['Monica Geller'],Mad,13,20,4,10,00:19:25.956,00:19:36.841 810 | "No, it's really good.",['The Waiter'],Joyful,13,21,4,10,00:19:28.500,00:19:29.959 811 | "Good! Now, take those salads to table 4, And you! Get the swordfish! And you! Get a haircut!",['Monica Geller'],Powerful,13,22,4,10,00:19:37.885,00:19:49.187 812 | "Last stop, Montreal. This stop is Montreal.",['The Conductor'],Neutral,14,2,4,10,00:19:45.809,00:19:56.944 813 | What?,['Ross Geller'],Neutral,14,3,4,10,00:19:47.519,00:19:49.187 814 | "I made a bet with myself that you have beautiful eyes. Now that I see them, I win.",['Woman On Train'],Joyful,14,4,4,10,00:19:52.107,00:20:11.709 815 | What?,['Ross Geller'],Neutral,14,5,4,10,00:19:59.823,00:20:01.282 816 | We're at my stop. But would you like to have coffee?,['Woman On Train'],Joyful,14,6,4,10,00:20:09.291,00:20:20.426 817 | Are we really in Montreal?!,['Ross Geller'],Joyful,14,7,4,10,00:20:14.796,00:20:20.426 818 | "Yes we are. So, coffee?",['Woman On Train'],Joyful,14,8,4,10,00:20:17.174,00:20:20.426 819 | "Coffee sounds great. Wait, so, so you live in Montreal?",['Ross Geller'],Joyful,14,9,4,10,00:20:26.808,00:20:39.528 820 | "Oh, no. But it's just a two hour ferry ride to Nova Scotia.",['Woman On Train'],Neutral,14,10,4,10,00:20:28.644,00:20:43.449 821 | Thanks.,['Monica Geller'],Neutral,15,3,4,10,00:20:31.939,00:20:33.439 822 | Yep! Looks like it's gonna be a leeeeean Christmas at the Dragon house this year.,['Joey Tribbiani'],Joyful,15,4,4,10,00:20:49.748,00:20:58.965 823 | Enough!,['Monica Geller'],Mad,15,5,4,10,00:20:53.418,00:20:54.460 824 | Lean-lean-lean!,['Joey Tribbiani'],Sad,15,6,4,10,00:20:54.670,00:20:58.965 825 | So what did he decide? Does your Uncle Nathan get an invite or not?,['Emily Waltham'],Scared,2,2,4,21,00:01:37.305,00:02:31.817 826 | "Ohh, God, nobody likes him, and he's so cheap, he'd never fly to London in a million years. Yeah, invite him? Hey, did I do these neat enough?",['Ross Geller'],Scared,2,3,4,21,00:02:32.026,00:02:43.537 827 | "Yeah, they're fine.",['Emily Waltham'],Joyful,2,4,4,21,00:02:34.237,00:02:38.323 828 | Yeah?,['Ross Geller'],Peaceful,2,5,4,21,00:02:38.533,00:02:39.700 829 | "If anyone asks, we'll just say Ben addressed them. Oh! So you invited Rachel then?",['Emily Waltham'],Powerful,2,6,4,21,00:02:44.873,00:02:53.088 830 | Sure. Why not?,['Ross Geller'],Peaceful,2,7,4,21,00:02:47.167,00:02:49.543 831 | Really?,['Emily Waltham'],Scared,2,8,4,21,00:02:50.837,00:02:53.088 832 | Yeah?,['Ross Geller'],Peaceful,2,9,4,21,00:02:53.756,00:02:54.840 833 | I don't think I'd be comfortable with any of my old lovers there.,['Emily Waltham'],Powerful,2,10,4,21,00:02:55.216,00:03:01.555 834 | "Oh, no-no, y'know I absolutely adore Rachel it's just that, well it might be a awkward for you. But it's absolutely your decision. More tea?",['Emily Waltham'],Sad,2,12,4,21,00:03:05.018,00:03:14.526 835 | Yeah sure.,['Ross Geller'],Peaceful,2,13,4,21,00:03:08.021,00:03:11.857 836 | Earl Grey?,['Emily Waltham'],Mad,2,14,4,21,00:03:12.317,00:03:14.526 837 | "Huh? Yeah, fine, invite whoever you want.",['Ross Geller'],Peaceful,2,15,4,21,00:03:14.986,00:03:20.073 838 | "I don't want to be single, okay? I just... I just- I just wanna be married again!",['Ross Geller'],Mad,3,2,4,21,00:03:18.364,00:03:32.336 839 | And I just want a million dollars!,['Chandler Bing'],Peaceful,3,4,4,21,00:03:20.283,00:03:32.336 840 | Rachel?!,['Monica Geller'],Scared,3,5,4,21,00:03:27.207,00:03:32.336 841 | "Okay, everybody, this is Rachel, another Lincoln High survivor. This is everybody, this is Chandler, and Phoebe, and Joey, and- you remember my brother Ross?",['Monica Geller'],Powerful,3,8,4,21,00:03:47.310,00:03:57.194 842 | "Hi, sure!",['Rachel Green'],Peaceful,3,9,4,21,00:03:51.105,00:03:53.857 843 | Hi.,['Ross Geller'],Neutral,3,10,4,21,00:03:54.067,00:03:55.150 844 | I knew.,['Rachel Green'],Neutral,4,3,4,21,00:03:55.360,00:03:57.194 845 | You did! Oh.... I always figured you just thought I was Monica's geeky older brother.,['Ross Geller'],Powerful,4,4,4,21,00:04:03.284,00:04:14.544 846 | I did.,['Rachel Green'],Peaceful,4,5,4,21,00:04:07.247,00:04:10.499 847 | "Oh. Listen, do you think- and try not to let my intense vulnerability become any kind of a factor here-but do you think it would be okay if I asked you out? Sometime? Maybe?",['Ross Geller'],Powerful,4,6,4,21,00:04:11.626,00:04:29.518 848 | "Yeah, maybe...",['Rachel Green'],Powerful,4,7,4,21,00:04:15.380,00:04:17.381 849 | "Okay... okay, maybe I will...",['Ross Geller'],Powerful,4,8,4,21,00:04:19.008,00:04:24.554 850 | "See, I see.... big passion in your future.",['Ross Geller'],Powerful,5,2,4,21,00:04:30.270,00:04:42.531 851 | Really?,['Rachel Green'],Neutral,5,3,4,21,00:04:32.480,00:04:33.772 852 | I do.,['Ross Geller'],Neutral,5,4,4,21,00:04:34.482,00:04:38.235 853 | "Oh Ross, you're so great.",['Rachel Green'],Joyful,5,5,4,21,00:04:36.317,00:04:42.531 854 | It's never gonna happen.,['Joey Tribbiani'],Neutral,5,7,4,21,00:04:40.488,00:04:42.531 855 | "Hey, I have a question. Well, actually, it's not so much a question as.. more of a general wondering... ment.",['Ross Geller'],Neutral,6,2,4,21,00:04:57.046,00:05:13.478 856 | Okay.,['Rachel Green'],Neutral,6,3,4,21,00:05:00.425,00:05:02.467 857 | "Okay. Umm, for a while now, I've been wanting to, um....",['Ross Geller'],Neutral,6,4,4,21,00:05:14.314,00:05:23.905 858 | Ohhh!!!!,['Rachel Green'],Scared,6,5,4,21,00:05:16.316,00:05:17.899 859 | "Yes, yes, that's right...",['Ross Geller'],Neutral,6,6,4,21,00:05:18.067,00:05:23.905 860 | "Oh, look at the little cat! Look at it!",['Rachel Green'],Joyful,6,7,4,21,00:05:24.115,00:05:29.036 861 | What? Ow!,['Ross Geller'],Scared,6,8,4,21,00:05:26.701,00:05:29.036 862 | "All right, listen, missy. If you want this cart, you're gonna have to take me with it!",['Rachel Green'],Mad,7,2,4,21,00:05:35.668,00:05:48.055 863 | Yes! Did you see that?,['Rachel Green'],Joyful,7,4,4,21,00:05:37.462,00:05:42.924 864 | "You were incredible! Brand new woman, ladies and gentlemen.",['Ross Geller'],Joyful,7,5,4,21,00:05:52.101,00:05:58.023 865 | I could not have done this without you.,['Rachel Green'],Powerful,7,6,4,21,00:05:55.480,00:06:00.650 866 | "Ok, um, uh, more clothes in the dryer? I'm fine, I'm fine.",['Ross Geller'],Peaceful,7,8,4,21,00:06:06.991,00:06:14.664 867 | You had no right to tell me you ever had feelings for me.,['Ross Geller'],Mad,8,2,4,21,00:06:09.452,00:06:17.542 868 | What?,['Rachel Green'],Sad,8,3,4,21,00:06:11.245,00:06:13.205 869 | I was doing great with Julie before I found out about you.,['Ross Geller'],Mad,8,4,4,21,00:06:18.086,00:06:21.463 870 | "Hey, I was doin' great before I found out about you. You think it's easy for me to see you with Julie?",['Rachel Green'],Mad,8,5,4,21,00:06:20.046,00:06:26.176 871 | "The point is I... I don't need this right now, OK. It, it's too late, I'm with somebody else, I'm happy. This ship has sailed.",['Ross Geller'],Mad,8,7,4,21,00:06:26.386,00:06:36.978 872 | "Alright, fine, you go ahead and you do that, alright Ross.",['Rachel Green'],Mad,8,9,4,21,00:06:31.349,00:06:36.978 873 | Fine.,['Ross Geller'],Mad,8,10,4,21,00:06:34.519,00:06:36.978 874 | 'Cause I don't need your stupid ship.,['Rachel Green'],Mad,8,11,4,21,00:06:37.188,00:06:40.524 875 | Good.,['Ross Geller'],Mad,8,12,4,21,00:06:38.731,00:06:40.524 876 | Good.,['Rachel Green'],Mad,8,13,4,21,00:06:43.486,00:06:44.778 877 | Well neither do I!,['Rachel Green'],Peaceful,9,4,4,21,00:06:44.946,00:07:04.005 878 | Is this about Mark?,['Ross Geller'],Scared,9,5,4,21,00:06:47.490,00:07:32.284 879 | Oh my God.,['Rachel Green'],Scared,9,6,4,21,00:07:02.839,00:07:32.284 880 | "Okay, it's not, it's not.",['Ross Geller'],Mad,9,7,4,21,00:07:28.197,00:07:32.284 881 | "Oh my God. I cannot keep having this same fight over and over again, Ross, no, you're, you're, you're making this too hard.",['Rachel Green'],Powerful,9,8,4,21,00:07:49.051,00:07:58.643 882 | "Oh I'm, I'm making this too hard. Okay, what do you want me to do.",['Ross Geller'],Peaceful,9,9,4,21,00:07:55.975,00:08:00.979 883 | "I don't know, I don't know. Urrrgh! Look, maybe we should take a break.",['Rachel Green'],Scared,9,10,4,21,00:07:58.853,00:08:05.108 884 | No. A break from us.,['Rachel Green'],Sad,9,12,4,21,00:08:01.189,00:08:05.108 885 | Do I know why we're rushing?,['Chloe'],Scared,10,2,4,21,00:08:05.318,00:08:08.278 886 | That's so great for you guys!,['Chloe'],Joyful,10,4,4,21,00:08:08.529,00:08:11.156 887 | Yeah!,['Ross Geller'],Scared,10,5,4,21,00:08:11.657,00:08:12.908 888 | "Good luck, with your girlfriend.",['Chloe'],Joyful,10,7,4,21,00:08:13.868,00:08:24.252 889 | "Oh, thank you. Hey, hey. Rachel!!!!",['Ross Geller'],Scared,10,8,4,21,00:08:20.333,00:08:24.252 890 | "Hi. Ohhh, you got my message.",['Rachel Green'],Joyful,10,9,4,21,00:08:24.462,00:08:27.380 891 | "Yeah, oh hey, you are right on time.",['Ross Geller'],Scared,10,10,4,21,00:08:28.841,00:08:35.388 892 | So what do you say? Can I be your girlfriend again?,['Rachel Green'],Peaceful,10,11,4,21,00:08:44.190,00:08:49.861 893 | "Yes, you can, very much.",['Ross Geller'],Powerful,10,12,4,21,00:08:47.401,00:08:49.861 894 | Ahhhh!!,['Ross Geller'],Scared,10,14,4,21,00:08:50.071,00:08:51.613 895 | "Y'know what, I want you to leave! Get outta here!",['Rachel Green'],Mad,11,2,4,21,00:08:52.573,00:08:57.327 896 | No!!,['Ross Geller'],Mad,11,3,4,21,00:08:55.451,00:08:57.327 897 | Just get out! Now!!,['Rachel Green'],Mad,11,4,4,21,00:08:57.537,00:08:59.371 898 | Okay! All right! How was she?,['Rachel Green'],Neutral,11,6,4,21,00:09:00.039,00:09:03.291 899 | Uh-oh.,['Chandler Bing'],Scared,11,8,4,21,00:09:02.250,00:09:03.291 900 | What?,['Ross Geller'],Neutral,11,10,4,21,00:09:07.421,00:09:09.005 901 | Was she good?,['Rachel Green'],Neutral,11,11,4,21,00:09:09.215,00:09:10.257 902 | Don't answer that.,['Joey Tribbiani'],Neutral,11,13,4,21,00:09:12.426,00:09:16.012 903 | She was...,['Ross Geller'],Scared,11,16,4,21,00:09:17.223,00:09:18.265 904 | Awful! Horrible!,['Joey Tribbiani'],Mad,11,18,4,21,00:09:18.474,00:09:20.183 905 | She was not good. Not good.,['Chandler Bing'],Neutral,11,19,4,21,00:09:20.351,00:09:24.020 906 | She was nothing compared to you.,['Joey Tribbiani'],Neutral,11,20,4,21,00:09:22.979,00:09:28.733 907 | "She, she was different.",['Ross Geller'],Peaceful,11,22,4,21,00:09:24.188,00:09:28.733 908 | Ewwwww!,['Joey Tribbiani'],Neutral,11,24,4,21,00:09:27.233,00:09:28.733 909 | Uh-oh.,['Chandler Bing'],Scared,11,25,4,21,00:09:30.236,00:09:32.070 910 | Good different?,['Rachel Green'],Neutral,11,27,4,21,00:09:32.238,00:09:34.364 911 | Nobody likes change.,['Ross Geller'],Neutral,11,28,4,21,00:09:34.532,00:09:37.951 912 | "What? Okay, okay, okay, okay.",['Ross Geller'],Neutral,11,30,4,21,00:09:35.908,00:09:37.951 913 | You seem to really like her.,['Rachel Green'],Joyful,14,2,4,21,00:09:38.202,00:09:42.539 914 | "Ross, that girl just spent the entire evening talking to your friends, asking to hear stories about you, looking through Monica's photo albums, I mean you don't do that if you're just in it for two weeks.",['Rachel Green'],Neutral,14,4,4,21,00:10:26.042,00:10:41.973 915 | You think?,['Ross Geller'],Neutral,14,5,4,21,00:10:28.002,00:10:33.131 916 | "Yeah, you got like 14 hours until she has to be at the airport, and you're sitting here in the hallway with a 28-year-old cheerleader with a fat lip.",['Rachel Green'],Neutral,14,6,4,21,00:10:42.683,00:10:54.653 917 | "Hey, you're right.",['Ross Geller'],Joyful,14,7,4,21,00:10:44.477,00:10:48.563 918 | Yeah.,['Rachel Green'],Joyful,14,8,4,21,00:10:48.856,00:10:51.107 919 | Who's this from?,['Rachel Green'],Neutral,16,2,4,21,00:10:51.317,00:10:54.653 920 | "Oh, that's Ross's.",['Chandler Bing'],Joyful,16,3,4,21,00:10:58.199,00:11:00.283 921 | Oh... Oh my God. He remembered.,['Rachel Green'],Powerful,16,4,4,21,00:11:11.837,00:11:16.966 922 | Remembered what?,['Phoebe Buffay'],Neutral,16,5,4,21,00:11:14.215,00:11:16.966 923 | "Oh, it's so pretty. This must have cost him a fortune.",['Phoebe Buffay'],Joyful,16,7,4,21,00:13:23.886,00:13:27.806 924 | I can't believe he did this.,['Monica Geller'],Joyful,16,8,4,21,00:13:26.347,00:13:27.806 925 | "Come on, Ross? Remember back in college, when he fell in love with Carol and bought her that ridiculously expensive crystal duck?",['Chandler Bing'],Joyful,16,9,4,21,00:13:28.015,00:13:35.396 926 | What did you just say?,['Rachel Green'],Scared,16,11,4,21,00:13:29.391,00:13:32.101 927 | F-hah.... flennin....,['Chandler Bing'],Scared,16,12,4,21,00:13:32.311,00:13:35.396 928 | Oh.... my God.,['Rachel Green'],Joyful,16,13,4,21,00:13:36.607,00:13:37.690 929 | "Rach, I got a message from you.",['Ross Geller'],Joyful,21,2,4,21,00:13:44.073,00:13:55.291 930 | "Oh my God. Oh my God Ross, no, hang up the phone, give me the phone Ross, give me the phone, give me the phone, give me the. . .",['Rachel Green'],Scared,21,4,4,21,00:15:23.213,00:15:32.138 931 | You're over me?,['Ross Geller'],Sad,21,5,4,21,00:15:25.132,00:15:27.592 932 | Ohhhhhhhh God.,['Rachel Green'],Peaceful,21,6,4,21,00:15:27.760,00:15:32.138 933 | "Wha... you're uh, you're, you're over me?",['Ross Geller'],Sad,21,7,4,21,00:15:37.853,00:15:44.150 934 | "Ohh, ohh.",['Rachel Green'],Sad,21,8,4,21,00:15:39.980,00:15:41.731 935 | "When, when were you... under me?",['Ross Geller'],Scared,21,9,4,21,00:15:41.899,00:15:45.443 936 | "Well, basically, lately, I've uh, I've uh, sort of had feelings for you.",['Rachel Green'],Scared,21,10,4,21,00:15:50.574,00:16:03.461 937 | "OK, I need to lie down.",['Ross Geller'],Scared,21,12,4,21,00:15:55.329,00:16:03.461 938 | "He broke up with Julie. Well, go hug her, for god's sakes.",['Joey Tribbiani'],Mad,22,2,4,21,00:16:07.549,00:16:13.262 939 | Really?,['Rachel Green'],Neutral,22,3,4,21,00:16:09.093,00:16:10.134 940 | "Really. It's always been you, Rach.",['Ross Geller'],Neutral,22,4,4,21,00:16:10.511,00:16:13.262 941 | "Oh, god.",['Rachel Green'],Scared,22,5,4,21,00:16:14.974,00:16:16.975 942 | Ohhh.,"['Chandler Bing', 'Joey Tribbiani']",Sad,22,7,4,21,00:16:18.268,00:16:20.144 943 | "Y'know, hey! You're the one who ended it, remember?",['Ross Geller'],Mad,25,2,4,21,00:17:26.045,00:17:38.097 944 | "Yeah, because I was mad at you, not because I stopped loving you!",['Rachel Green'],Scared,25,3,4,21,00:17:27.671,00:17:42.310 945 | You still love me?,['Ross Geller'],Scared,25,4,4,21,00:17:36.513,00:17:38.097 946 | Noo.,['Rachel Green'],Mad,25,5,4,21,00:17:38.307,00:17:42.310 947 | "What does this mean? What do you, I mean do you wanna, get back together?",['Ross Geller'],Scared,25,7,4,21,00:17:43.604,00:17:52.445 948 | "Noo! Maybe! I, I don't know.",['Rachel Green'],Scared,25,8,4,21,00:17:45.105,00:17:52.445 949 | What?!,['Ross Geller'],Mad,25,9,4,21,00:17:48.025,00:17:52.445 950 | "I just, I feel, I-I just...",['Rachel Green'],Neutral,25,10,4,21,00:17:52.654,00:17:57.617 951 | It's better! You can't go to a museum in your underwear!,['Joey Tribbiani'],Joyful,29,3,4,21,00:21:37.379,00:21:44.135 952 | "Well, You could, but... probably just the one time.",['Chandler Bing'],Joyful,29,4,4,21,00:21:45.220,00:21:47.555 953 | "I bet we could get videos of all the sites, get a VCR in our hotel room... we'd never even have to go outside!",['Joey Tribbiani'],Joyful,29,5,4,21,00:21:49.641,00:21:55.604 954 | "If we do that, we gotta get Die Hard.",['Chandler Bing'],Joyful,29,6,4,21,00:21:56.189,00:21:58.190 955 | Oh-ho! I bet the British version is gooooood!,['Joey Tribbiani'],Joyful,29,7,4,21,00:22:00.027,00:22:03.070 956 | -------------------------------------------------------------------------------- /data/mp4towav.py: -------------------------------------------------------------------------------- 1 | """ 2 | 本文件基于使用ffmpeg将 3 | MELD数据集中的mp4文件转换为 wav文件 4 | 采样率先不管,等后面构建dataset时候再处理 5 | """ 6 | import os 7 | from librosa.util import find_files 8 | from ffmpy3 import FFmpeg 9 | import re 10 | import subprocess 11 | import pathlib 12 | 13 | # mp4转wav 14 | 15 | train_path = r"./MELD/train_splits" #放mp4的文件夹 16 | train_outwav_path = r"./MELD/train_splits/wav/" #输出wav的文件夹 17 | dev_path = r"./MELD/dev_splits_complete" 18 | dev_outwav_path = r"./MELD/dev_splits_complete/wav/" 19 | test_path = r"./MELD/output_repeated_splits_test" 20 | test_outwav_path = r"./MELD/output_repeated_splits_test/wav/" 21 | 22 | 23 | if not pathlib.Path(train_outwav_path).exists(): 24 | os.mkdir(train_outwav_path) 25 | if not pathlib.Path(dev_outwav_path).exists(): 26 | os.mkdir(dev_outwav_path) 27 | if not pathlib.Path(test_outwav_path).exists(): 28 | os.mkdir(test_outwav_path) 29 | 30 | 31 | 32 | dic = {"train":(train_path,train_outwav_path), 33 | "dev":(dev_path,dev_outwav_path), 34 | "test":(test_path,test_outwav_path)} 35 | 36 | 37 | for key,value in dic.items(): 38 | 39 | sh_path = "./prepareAudio_"+key+".sh" 40 | 41 | 42 | 43 | filepath = value[0]# 存放mp4视频的path 44 | output_wav_dir = value[1] #输出wav的path 45 | 46 | mp4s = find_files(filepath,ext="mp4") #存放了mp4的绝对路径名 47 | abspath = "/data/qzy/meld-sentiment-analysis/data" 48 | mp4s = [mp4.replace(abspath,".") for mp4 in mp4s] #把mp4文件名替换成相对路径名 49 | 50 | 51 | for mp4 in mp4s: 52 | temp_wav_dir = os.path.basename(mp4).replace("mp4", "wav") 53 | output_file = output_wav_dir + temp_wav_dir 54 | ff = FFmpeg( 55 | inputs={mp4: None}, 56 | # outputs={output_file: '-vn -ar 16000 -ac 2 -ab 192 -f wav'}, 57 | outputs={output_file:None}, 58 | 59 | ) 60 | # subprocess.run(re.split(r"\s+", ff.cmd)) #我就奇怪了为啥这样运行不了 61 | 62 | ##改成把所有的命令存到sh文件中,再运行sh文件 63 | with open(sh_path,"a") as f: 64 | f.write(ff.cmd+";") 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /data/pickles/download-features.txt: -------------------------------------------------------------------------------- 1 | Please download the features from http://bit.ly/MELD-features 2 | -------------------------------------------------------------------------------- /download.py: -------------------------------------------------------------------------------- 1 | from transformers import AutoConfig, AutoTokenizer, AutoModelForSequenceClassification 2 | from setting import setting 3 | from transformers import HubertForSequenceClassification,Wav2Vec2FeatureExtractor,HubertModel 4 | 5 | """ 6 | Download and save the pretrained model 7 | """ 8 | 9 | 10 | ## text Part 11 | config = AutoConfig.from_pretrained(setting.model_name, num_labels=3) 12 | model = AutoModelForSequenceClassification.from_pretrained(setting.model_name, config=config)#因为想做一句/一段话的情感分类,所以是sequence 13 | tokenizer = AutoTokenizer.from_pretrained(setting.model_name) 14 | 15 | config.save_pretrained(setting.config_path) 16 | model.save_pretrained(setting.model_path) 17 | tokenizer.save_pretrained(setting.tokenizer_path) 18 | 19 | 20 | 21 | #AudioPart 22 | 23 | AudioConfig= AutoConfig.from_pretrained(setting.AudioModel_name) 24 | AudioModel = HubertModel.from_pretrained(setting.AudioModel_name) 25 | feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(setting.AudioModel_name) 26 | 27 | AudioConfig.save_pretrained(setting.AudioConfig_path) 28 | AudioModel.save_pretrained(setting.AudioModel_path) 29 | feature_extractor.save_pretrained(setting.feature_extractor_path) 30 | -------------------------------------------------------------------------------- /finetuning/Multi_feature_tuning2.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from transformers import AdamW,get_scheduler 3 | from setting import setting 4 | from utils.data import MELDDataSet,get_data 5 | from utils.common import prepare_logger 6 | from torch.utils.data import DataLoader 7 | from utils.multi import multi_data_collator 8 | 9 | from Model.MultiModal1 import MultiModal1 10 | from Model.MultiModal2 import MultiModal2 11 | from Model.MultiModal3 import MultiModal3 12 | from sklearn.metrics import classification_report 13 | from accelerate import Accelerator 14 | import numpy as np 15 | import pathlib 16 | import random 17 | import os 18 | 19 | """ 20 | 过时文件,尝试使用混合精度训练 21 | """ 22 | 23 | from torch.cuda.amp import autocast as autocast,GradScaler 24 | from torch.utils.data.distributed import DistributedSampler 25 | import torch.distributed as dist 26 | 27 | 28 | #多卡 29 | 30 | # dist.init_process_group(backend='nccl') 31 | # local_rank = torch.distributed.get_rank() 32 | # torch.cuda.set_device(local_rank) 33 | # device = torch.device("cuda", local_rank) 34 | 35 | 36 | ## 一些基础设置 37 | SEED = 43 38 | random.seed(SEED) 39 | np.random.seed(SEED) 40 | torch.manual_seed(SEED) 41 | torch.backends.cudnn.deterministic = True 42 | os.environ["CUDA_VISIBLE_DEVICES"] = "1" 43 | 44 | ## 超参数设置 45 | lr = 1e-5 46 | n_epoch = 20 47 | batch_size = 8 48 | accumulation_steps = 8 # 梯度累积 模拟batchsize=8*8 49 | 50 | 51 | 52 | 53 | 54 | ### logger模块 55 | settings = [ "classfication=%s" % setting.mode, 56 | "lr=%f" %lr, 57 | "n_epoch=%d" % n_epoch, 58 | 'batch_size=%d'%batch_size, 59 | "seed=%d"%SEED, 60 | "mode=test", 61 | "info=dim=4" 62 | 63 | ] 64 | log_path = pathlib.Path("logs/") 65 | if not log_path.exists(): log_path.mkdir() 66 | logger = prepare_logger(filename="%s/logfile@%s.log" % (log_path, "_".join(settings)), name="audio2") 67 | logger.info("\n".join(settings)) 68 | 69 | 70 | 71 | 72 | 73 | ## 获取Dataloader 74 | train_dataset = get_data(data_use="train",mode="multi") 75 | dev_dataset = get_data(data_use="dev",mode="multi") 76 | test_dataset = get_data(data_use="test",mode="multi") 77 | #train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) 78 | train_dataloader = DataLoader( 79 | train_dataset,batch_size=batch_size,collate_fn=multi_data_collator 80 | ) 81 | eval_dataloader = DataLoader( 82 | dev_dataset,batch_size =batch_size,collate_fn=multi_data_collator 83 | ) 84 | test_dataloader = DataLoader( 85 | test_dataset,batch_size=batch_size,collate_fn=multi_data_collator 86 | ) 87 | 88 | #tokonized_dataset = tokenized_dataset_for_hubert(dataset) 89 | 90 | 91 | 92 | 93 | 94 | 95 | ## 加载模型 96 | 97 | model = MultiModal3() 98 | optimizer = AdamW(model.parameters(), lr=lr) 99 | num_training_steps = n_epoch * len(train_dataloader) 100 | lr_scheduler = get_scheduler( ## 控制学习率的scheduler 101 | "linear", 102 | optimizer=optimizer, 103 | num_warmup_steps=0, 104 | num_training_steps=num_training_steps, 105 | ) 106 | 107 | 108 | 109 | 110 | ### 多卡训练 111 | # accelerator = Accelerator() 112 | # train_dataloader, eval_dataloader,test_dataloadert ,model, optimizer = accelerator.prepare( 113 | # train_dataloader, eval_dataloader, test_dataloader,model, optimizer 114 | # ) 115 | 116 | ## 混合精度训练 117 | scaler = GradScaler() 118 | 119 | 120 | device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") 121 | model.to(device) 122 | logger.info(device) 123 | 124 | ## Training And Val Loops 125 | print("Training") 126 | 127 | for epoch in range(n_epoch): 128 | model.train() 129 | for text_batch,audio_batch in train_dataloader: 130 | 131 | text_batch.to(device) 132 | audio_batch.to(device) 133 | with autocast(): 134 | outputs = model(text_batch,audio_batch) 135 | Cross_loss = model.cal_loss(outputs,text_batch["emotion"]) 136 | scaler.scale(Cross_loss).backward() 137 | scaler.step(optimizer) 138 | scaler.update() 139 | 140 | # optimizer the net 141 | 142 | lr_scheduler.step() 143 | optimizer.zero_grad() # rese 144 | 145 | 146 | ##收集内存 147 | # gc.collect() 148 | # torch.cuda.empty_cache() 149 | 150 | 151 | ###Val 152 | model.eval() 153 | labels = [] 154 | preds = [] 155 | for text_batch,audio_batch in test_dataloader: 156 | text_batch.to(device) 157 | audio_batch.to(device) 158 | with torch.no_grad(): 159 | outputs = model(text_batch,audio_batch) 160 | 161 | predictions = torch.argmax(outputs, dim=-1) 162 | preds.append(predictions.cpu().numpy().tolist()) 163 | labels.append(text_batch["emotion"].cpu().numpy().tolist()) 164 | 165 | labels = sum(labels,[]) # 转化为一维列表 166 | preds = sum(preds,[]) 167 | report = classification_report(labels, preds,target_names=setting.Emotion_list,digits=4) 168 | #report = classification_report(labels, preds) 169 | logger.info(report) 170 | print(epoch) 171 | 172 | 173 | 174 | ## Save_checkpoint 175 | 176 | # torch.save(model.state_dict(),setting.text_checkpoint_path) 177 | 178 | 179 | ## TEST 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | -------------------------------------------------------------------------------- /finetuning/text_trainer.py: -------------------------------------------------------------------------------- 1 | from transformers import Trainer 2 | from transformers import AutoModelForSequenceClassification,TrainingArguments 3 | from transformers.trainer_utils import get_last_checkpoint 4 | from setting import setting 5 | from utils.data import MELDDataSet 6 | from utils.bert import create_tokenized_dataset,config,tokenizer,data_collator,compute_metrics,evaluate_model 7 | import torch 8 | import random 9 | import numpy as np 10 | import pathlib 11 | import wandb 12 | from utils.common import prepare_logger,remove_directories,compute_weighted_f1 13 | import re 14 | import os 15 | import pickle 16 | import shutil 17 | 18 | """ 19 | 本文件为过时文件,在研究text模态时用的huggingface trainer所做 20 | """ 21 | 22 | 23 | 24 | 25 | ### 一些设置 26 | SEED = 42 27 | random.seed(SEED) 28 | np.random.seed(SEED) 29 | torch.manual_seed(SEED) 30 | torch.backends.cudnn.deterministic = True 31 | use_checkpoint = False 32 | use_hpo_search = False #是否进行超参数搜索 33 | 34 | 35 | 36 | 37 | 38 | model = AutoModelForSequenceClassification.from_pretrained(setting.model_path) 39 | dataset = MELDDataSet() 40 | tokenized_datasets = create_tokenized_dataset(dataset) 41 | 42 | 43 | ##log part 44 | 45 | settings = [ "classfication=%s" % setting.mode, 46 | "model=%s" % setting.model_name, 47 | ] 48 | log_path = pathlib.Path("logs/") 49 | if not log_path.exists(): log_path.mkdir() 50 | logger = prepare_logger(filename="%s/logfile@%s.log" % (log_path, "_".join(settings)), name="t") 51 | logger.info("\n".join(settings)) 52 | 53 | 54 | 55 | def hp_space_optuna(trial): #超参数搜索空间 56 | return { 57 | "learning_rate": trial.suggest_categorical("learning_rate", [1e-6, 5e-6, 1e-5]), 58 | "num_train_epochs": trial.suggest_categorical("num_train_epochs", [3, 5]), 59 | "per_device_train_batch_size": trial.suggest_categorical("per_device_train_batch_size", [2]), 60 | } 61 | def hpo(tokonized_datasets): # 超参数搜索函数,搜到最好的超参数 62 | hpo_path = pathlib.Path("hpo") 63 | if not hpo_path.exists(): hpo_path.mkdir() 64 | hpo_path = hpo_path / pathlib.Path("hpo.pkl") 65 | 66 | if not pathlib.Path(hpo_path).exists(): 67 | logger.info("HYPERPARAMETER SEARCH") 68 | model_init = lambda: AutoModelForSequenceClassification.from_pretrained(setting.model_path) 69 | trainer = Trainer(args=TrainingArguments(output_dir="output/hpo", evaluation_strategy="epoch", eval_steps=500, 70 | report_to="none", disable_tqdm=True), 71 | tokenizer=tokenizer, 72 | train_dataset=tokenized_datasets["train"], 73 | eval_dataset=tokenized_datasets["dev"], 74 | data_collator=data_collator, 75 | model_init=model_init, 76 | compute_metrics=compute_metrics,) 77 | 78 | best_trail = trainer.hyperparameter_search(hp_space=hp_space_optuna, 79 | # A function that defines the hyperparameter search space. Will default to default_hp_space_optuna() or default_hp_space_ray() or default_hp_space_sigopt() depending on your backend. 80 | direction="maximize", 81 | backend="optuna", 82 | n_trials=6) 83 | 84 | logger.info("CLEANUP") 85 | remove_directories(["runs/", "output/"]) 86 | 87 | hp_dict = dict() 88 | 89 | hp_dict["lr"] = best_trail.hyperparameters["learning_rate"] 90 | hp_dict["batch_size"] = best_trail.hyperparameters["per_device_train_batch_size"] 91 | hp_dict["n_epoch"] = best_trail.hyperparameters["num_train_epochs"] 92 | 93 | 94 | with open(hpo_path, "wb") as fp: 95 | pickle.dump(hp_dict, fp) 96 | else: 97 | logger.info("READING ALREADY SEARCHED HYPERPARAMETERS") 98 | with open(hpo_path, "rb") as fp: 99 | hp_dict = pickle.load(fp) 100 | 101 | return hp_dict 102 | def train_model(trainer): 103 | # load checkpoint and train 104 | last_checkpoint = None 105 | if os.path.isdir(training_args.output_dir) and use_checkpoint: 106 | last_checkpoint = get_last_checkpoint(training_args.output_dir) 107 | if last_checkpoint is not None: 108 | logger.info(f"checkpoint detected, resuming training at {last_checkpoint}") 109 | 110 | # if use_checkpoint == False, then checkpoint == None, no checkpoints will be loaded 111 | if last_checkpoint is not None: 112 | checkpoint = last_checkpoint 113 | else: 114 | checkpoint = None 115 | 116 | trainer.train(resume_from_checkpoint=checkpoint) 117 | 118 | def get_checkpoint(folder,tokonized_datasets,mode="best"): 119 | """ 120 | :param folder: 从存储checkpoint的文件夹里找 121 | :param tokonized_datasets: 122 | :param mode: 123 | :return: 124 | """ 125 | assert mode in ["best", "median", "mean", "worst"] #只支持这几种模式 126 | checkpoint_name_pattern = re.compile(r"^" + "checkpoint" + r"\-(\d+)$") 127 | checkpoints = [os.path.join(folder, path) for path in os.listdir(folder) if (checkpoint_name_pattern.search(path) is not None) and 128 | os.path.isdir(os.path.join(folder, path))] 129 | 130 | checkpoint_dict = dict() 131 | 132 | for checkpoint in checkpoints: 133 | logger.info("evaluating checkpoint: %s..." % checkpoint) 134 | model = AutoModelForSequenceClassification.from_pretrained(checkpoint) 135 | trainer = Trainer(model=model, 136 | args=training_args, 137 | tokenizer=tokenizer, 138 | train_dataset=tokenized_datasets["train"], 139 | eval_dataset=tokenized_datasets["dev"], 140 | data_collator=data_collator, 141 | compute_metrics=compute_metrics) 142 | metric, metric_str = evaluate_model(trainer, tokenized_datasets, name="dev") 143 | weighted_f1 = compute_weighted_f1(metric, target_names=setting.Sentiment_list) 144 | checkpoint_dict[checkpoint] = weighted_f1 145 | perf_str = "\n".join("\t%s: %.4f" % (key, val) 146 | for key, val in sorted(checkpoint_dict.items(), key=lambda x: x[1], reverse=True)) 147 | logger.info(perf_str) 148 | 149 | 150 | # select checkpoints based on different criterion 151 | if mode == "best": 152 | checkpoint = max(checkpoint_dict, key=checkpoint_dict.get) 153 | else: 154 | weighted_f1_arr = np.fromiter(checkpoint_dict.values(), dtype=float, count=len(checkpoint_dict)) 155 | if mode == "mean": 156 | mean = np.mean(weighted_f1_arr) 157 | checkpoint_dict = {key: abs(val - mean) for key, val in checkpoint_dict.items()} 158 | if mode == "median": 159 | median = np.median(weighted_f1_arr) 160 | checkpoint_dict = {key: abs(val - median) for key, val in checkpoint_dict.items()} 161 | # if mode == "worst", no need to modify the checkpoint_dict 162 | checkpoint = min(checkpoint_dict, key=checkpoint_dict.get) 163 | 164 | return checkpoint 165 | 166 | 167 | 168 | 169 | def save_best_checkpoint(checkpoint, save=True): 170 | # checkpoint: the filename of best checkpoint during evaluation 171 | if not save: 172 | logger.info("NOT SAVING TRAINING CHECKPOINT") 173 | return 174 | 175 | logger.info("SAVING THE BEST CHECKPOINT DURING TRAINING") 176 | save_checkpoint_path = setting.checkpoint_path 177 | if not save_checkpoint_path.exists(): save_checkpoint_path.mkdir() 178 | 179 | 180 | for filename in os.listdir(checkpoint): 181 | shutil.move(os.path.join(checkpoint, filename), save_checkpoint_path) 182 | 183 | 184 | 185 | 186 | # search for best main checkpoint and hyperparameters 187 | if use_hpo_search: 188 | hp_dict = hpo(tokenized_datasets) #返回一个最好的记录超参数的字典 189 | else: 190 | hp_dict = None 191 | lr = hp_dict["lr"] if hp_dict is not None else 1e-5 192 | batch_size = hp_dict["batch_size"] if hp_dict is not None else 32 193 | n_epoch = hp_dict["n_epoch"] if hp_dict is not None else 3 194 | 195 | ##wandb 196 | 197 | param = {"lr": lr, 198 | "n_epoch": n_epoch, 199 | 'batch_size':batch_size, 200 | "seed": SEED, 201 | } 202 | logger.info("\n".join(param)) 203 | wandb.init(project="sentiment-analysis", 204 | name="run", 205 | config=param) 206 | 207 | training_args = TrainingArguments( 208 | "bert-sentiment-text-finetune", 209 | learning_rate=lr, 210 | num_train_epochs=n_epoch, 211 | per_device_train_batch_size=batch_size, 212 | per_device_eval_batch_size=batch_size, 213 | weight_decay=0.01, 214 | fp16 = True, 215 | do_train=True, 216 | do_eval=True, 217 | #checkpoint setting 218 | save_strategy="steps", 219 | save_steps=100, 220 | # evaluation 221 | evaluation_strategy="steps", 222 | eval_steps=100, 223 | disable_tqdm=True, #不要进度条了 224 | report_to="wandb", 225 | ) 226 | 227 | 228 | 229 | trainer = Trainer( 230 | model, 231 | training_args, 232 | 233 | train_dataset=tokenized_datasets["train"], 234 | eval_dataset=tokenized_datasets["dev"], 235 | data_collator=data_collator, 236 | tokenizer=tokenizer, 237 | compute_metrics=compute_metrics 238 | ) 239 | 240 | 241 | 242 | 243 | 244 | ### Train########################################## 245 | logger.info("Start Training") 246 | train_model(trainer) 247 | 248 | ### validation ################################## 249 | logger.info("VALIDATION: validate checkponints") 250 | best_checkpoint = get_checkpoint(training_args.output_dir, 251 | tokenized_datasets, 252 | mode="best", 253 | ) 254 | logger.info("BEST CHECKPOINT: %s" % best_checkpoint) 255 | 256 | 257 | 258 | ###TEST################################################ 259 | model = AutoModelForSequenceClassification.from_pretrained(best_checkpoint) 260 | trainer = Trainer( 261 | model, 262 | training_args, 263 | # logging_strategy="epoch", 264 | train_dataset=tokenized_datasets["train"], 265 | eval_dataset=tokenized_datasets["dev"], 266 | data_collator=data_collator, 267 | tokenizer=tokenizer, 268 | compute_metrics=compute_metrics 269 | ) 270 | 271 | 272 | metric, metric_str = evaluate_model(trainer, tokenized_datasets, name="test") 273 | weighted_f1 = compute_weighted_f1(metric, target_names=setting.Sentiment_list) 274 | logger.info(metric_str) 275 | logger.info("METRIC: weighted F1=%.4f" % weighted_f1) 276 | 277 | save_best_checkpoint(best_checkpoint, save=True) 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | -------------------------------------------------------------------------------- /finetuning/train.py: -------------------------------------------------------------------------------- 1 | from Model.BertModel import BertForSequenceClassifaction 2 | from Model.HubertModel import HubertForSequenceClassfication 3 | from Model.MultiModal1 import MultiModal1 4 | from Model.MultiModal2 import MultiModal2 5 | from Model.MultiModal3 import MultiModal3 6 | from transformers import AdamW,get_scheduler 7 | from setting import setting 8 | from sklearn.metrics import classification_report 9 | 10 | import torch 11 | 12 | 13 | def train_model(cfg,train_dataloader,eval_dataloader,test_dataloader): 14 | 15 | 16 | ## model Part 17 | 18 | if cfg.mode=="text": # Text Modal 19 | model = BertForSequenceClassifaction(label_num=7) 20 | elif cfg.mode == "audio": 21 | model = HubertForSequenceClassfication(label_num=7) 22 | elif cfg.mode == "multi": 23 | multi_models = {'MultiModal1': MultiModal1, 24 | 'MultiModal2': MultiModal2, 25 | 'MultiModal3': MultiModal3} 26 | model = multi_models[cfg.multi_model]() 27 | 28 | 29 | 30 | optimizer = AdamW(model.parameters(), lr=cfg.lr) 31 | num_training_steps = cfg.n_epoch * len(train_dataloader) 32 | lr_scheduler = get_scheduler( ## 控制学习率的scheduler 33 | "linear", 34 | optimizer=optimizer, 35 | num_warmup_steps=0, 36 | num_training_steps=num_training_steps, 37 | ) 38 | 39 | device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") 40 | model.to(device) 41 | 42 | print("Training") 43 | 44 | for epoch in range(cfg.n_epoch): 45 | model.train() 46 | for batch in train_dataloader: # batch可能是一个textbatch,audiobatch,或者在multi模式下的(textbatch,audiobatch) 47 | if cfg.mode == "text" or cfg.mode == "audio": 48 | batch.to(device) 49 | outputs = model(batch) 50 | elif cfg.mode == "multi": 51 | text_batch = batch[0] 52 | audio_batch = batch[1] 53 | text_batch.to(device) 54 | audio_batch.to(device) 55 | outputs = model(text_batch, audio_batch) 56 | batch = text_batch # 为了下一行的batch["emotion"]表现和text,audio一样 57 | 58 | Cross_loss = model.cal_loss(outputs, batch["emotion"]) 59 | Cross_loss.backward() 60 | optimizer.step() 61 | lr_scheduler.step() 62 | optimizer.zero_grad() 63 | 64 | 65 | 66 | model.eval() 67 | labels = [] 68 | preds = [] 69 | for batch in test_dataloader: 70 | if cfg.mode == "text" or cfg.mode == "audio": 71 | batch.to(device) 72 | with torch.no_grad(): 73 | outputs = model(batch) 74 | elif cfg.mode == "multi": 75 | text_batch,audio_batch = batch[0],batch[1] 76 | text_batch.to(device) 77 | audio_batch.to(device) 78 | with torch.no_grad(): 79 | outputs = model(text_batch, audio_batch) 80 | 81 | 82 | predictions = torch.argmax(outputs, dim=-1) 83 | preds.append(predictions.cpu().numpy().tolist()) 84 | labels.append(batch["emotion"].cpu().numpy().tolist()) 85 | 86 | labels = sum(labels, []) # 转化为一维列表 87 | preds = sum(preds, []) 88 | report = classification_report(labels, preds, target_names=setting.Emotion_list,digits=4) 89 | print(report) 90 | print(epoch) -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from setting import config 2 | from utils.data import get_data 3 | from torch.utils.data import DataLoader 4 | from utils.multi import multi_data_collator 5 | from finetuning.train import train_model 6 | from utils.bert import bert_data_collator 7 | from utils.hubert import hubert_data_collator 8 | import os 9 | 10 | os.environ["CUDA_VISIBLE_DEVICES"] = "1" 11 | cfg = config.DefaultConfig() 12 | 13 | 14 | 15 | 16 | print("Start Loading Data........") 17 | train_dataset = get_data(data_use="train",mode=cfg.mode) 18 | dev_dataset = get_data(data_use="dev",mode=cfg.mode) 19 | test_dataset = get_data(data_use="test",mode=cfg.mode) 20 | 21 | if cfg.mode == "multi": 22 | train_dataloader = DataLoader( 23 | train_dataset,batch_size=cfg.batchsize,collate_fn=multi_data_collator 24 | ) 25 | eval_dataloader = DataLoader( 26 | dev_dataset,batch_size = cfg.batchsize,collate_fn=multi_data_collator 27 | ) 28 | test_dataloader = DataLoader( 29 | test_dataset,batch_size= cfg.batchsize,collate_fn=multi_data_collator 30 | ) 31 | elif cfg.mode == "text": 32 | train_dataloader = DataLoader( 33 | train_dataset, batch_size=cfg.batchsize,collate_fn=bert_data_collator 34 | ) 35 | eval_dataloader = DataLoader( 36 | dev_dataset, batch_size=cfg.batchsize, collate_fn=bert_data_collator 37 | ) 38 | test_dataloader = DataLoader( 39 | test_dataset, batch_size=cfg.batchsize, collate_fn=bert_data_collator 40 | ) 41 | 42 | elif cfg.mode == "audio": 43 | train_dataloader = DataLoader( 44 | train_dataset, batch_size=cfg.batchsize,collate_fn=hubert_data_collator 45 | ) 46 | eval_dataloader = DataLoader( 47 | dev_dataset, batch_size=cfg.batchsize,collate_fn=hubert_data_collator 48 | ) 49 | test_dataloader = DataLoader( 50 | test_dataset, batch_size=cfg.batchsize,collate_fn=hubert_data_collator 51 | ) 52 | 53 | 54 | 55 | if __name__ == "__main__": 56 | train_model(cfg,train_dataloader,eval_dataloader,test_dataloader) -------------------------------------------------------------------------------- /readmeImg/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiloQ/MELD-Sentiment-Analysis/daa4a978cd628a29e0dffb2630489e808f078c5d/readmeImg/img.png -------------------------------------------------------------------------------- /readmeImg/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiloQ/MELD-Sentiment-Analysis/daa4a978cd628a29e0dffb2630489e808f078c5d/readmeImg/img_1.png -------------------------------------------------------------------------------- /readmeImg/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiloQ/MELD-Sentiment-Analysis/daa4a978cd628a29e0dffb2630489e808f078c5d/readmeImg/img_2.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | datasets==2.2.2 2 | ffmpy3==0.2.4 3 | librosa==0.9.1 4 | numpy==1.21.5 5 | pandas==1.3.5 6 | scikit_learn==1.1.1 7 | torch==1.11.0 8 | transformers==4.10.0 9 | -------------------------------------------------------------------------------- /setting/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiloQ/MELD-Sentiment-Analysis/daa4a978cd628a29e0dffb2630489e808f078c5d/setting/__init__.py -------------------------------------------------------------------------------- /setting/config.py: -------------------------------------------------------------------------------- 1 | 2 | class DefaultConfig(object): 3 | batchsize = 8 4 | lr = 1e-5 5 | n_epoch = 10 6 | mode = "multi" # [text,audio,multi] 7 | 8 | multi_model = "MultiModal3" 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /setting/setting.py: -------------------------------------------------------------------------------- 1 | import pathlib 2 | 3 | #base_path = pathlib.Path("/data/qzy/meld-sentiment-analysis") #得按服务器件上的目录结构来写代码 4 | base_path = pathlib.Path("/home/user/qzy/meld-sentiment-analysis") 5 | pretrained_path = base_path / pathlib.Path("pretrained") 6 | data_path = base_path / pathlib.Path("data") / pathlib.Path("MELD") 7 | 8 | 9 | 10 | ## 这个文件夹放置处理好的data,比如把音频转化为数组,text转化为tokonid 11 | save_data_path = base_path / pathlib.Path("data") / pathlib.Path("saved_data") 12 | 13 | 14 | 15 | 16 | # Bert 17 | model_name = "bert-base-uncased" 18 | 19 | 20 | ## Audio Part 21 | #AudioModel_name = "superb/hubert-large-superb-er" 22 | AudioModel_name = "ntu-spml/distilhubert" 23 | #AudioModel_name = "facebook/wav2vec2-base" 24 | 25 | 26 | ## task Mode 27 | ## 我们的实验顺序是从sentiment开始研究,到Emotion,最终想做结合sentiment的标签信息去研究Emotion 28 | 29 | mode = "sentiment" ##我们的任务分类 总共有两种mode,分类Emotion or 分类Sentiment 30 | 31 | ############################################################################## 32 | ##labsels 33 | 34 | Emotion_list = ["anger","disgust","fear","joy","neutral","sadness","surprise"] 35 | Emotion2ID = {"anger":0,"disgust":1,"fear":2,"joy":3,"neutral":4,"sadness":5,"surprise":6} 36 | Sentiment_list = ["neutral","positive","negative"] 37 | Sentiment2ID = {"neutral":0,"positive":1,"negative":2} 38 | 39 | 40 | if mode=="sentiment": 41 | labels = Sentiment_list 42 | label2id = Sentiment2ID 43 | elif mode=="emotion": 44 | labels = Emotion_list 45 | label2id = Emotion2ID 46 | 47 | 48 | 49 | 50 | 51 | #################################################################################### 52 | # model path 53 | tokenizer_path = str(pretrained_path / pathlib.Path(f"{model_name}/tokenizer")) 54 | config_path = str(pretrained_path / pathlib.Path(f"{model_name}/config")) 55 | model_path = str(pretrained_path / pathlib.Path(f"{model_name}/model")) 56 | text_checkpoint_path = str(pretrained_path / pathlib.Path(f"{model_name}/checkpoint")) #最好的checkpoint 57 | 58 | ## Audio Model Path 59 | AudioModel_path = str(pretrained_path / pathlib.Path(f"{AudioModel_name}/model")) 60 | feature_extractor_path = str(pretrained_path / pathlib.Path(f"{AudioModel_name}/feature_extractor")) 61 | AudioConfig_path = pretrained_path / pathlib.Path(f"{AudioModel_name}/config") 62 | 63 | 64 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | 4 | """ 5 | 无关痛痒的测试一些语法的文件 6 | 7 | """ 8 | x = torch.tensor(torch.rand(4,512)) # sqLen* batchsize * embedding 9 | head_shape = x.shape[:-1] 10 | print(head_shape) 11 | print(*head_shape) 12 | for (i,_) in range(50): 13 | print("sjakl") -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiloQ/MELD-Sentiment-Analysis/daa4a978cd628a29e0dffb2630489e808f078c5d/utils/__init__.py -------------------------------------------------------------------------------- /utils/bert.py: -------------------------------------------------------------------------------- 1 | """ 2 | 此函数编写bert操作流程中需要的函数 3 | """ 4 | 5 | from setting import setting 6 | from transformers import AutoConfig, AutoTokenizer,DataCollatorWithPadding 7 | import numpy as np 8 | from datasets import load_metric 9 | import pathlib 10 | import itertools 11 | from sklearn.metrics import classification_report 12 | from utils.common import compute_weighted_f1 13 | 14 | 15 | config = AutoConfig.from_pretrained(setting.config_path) 16 | tokenizer = AutoTokenizer.from_pretrained(setting.tokenizer_path, config=config,add_prefix_space=True) #add_prefix_space参数,给开头单词添加空格,很重要 17 | bert_data_collator= DataCollatorWithPadding(tokenizer=tokenizer) 18 | 19 | 20 | 21 | def tokenize_funtion(examples): 22 | tokenize_input = tokenizer(examples["Utterance"],truncation=True) 23 | Emotion_labels = list() 24 | Sentiment_labels = list() 25 | 26 | for emotion in examples["Emotion"]: 27 | Emotion_labels.append(setting.Emotion2ID[emotion]) 28 | for sentiment in examples["Sentiment"]: 29 | Sentiment_labels.append(setting.Sentiment2ID[sentiment]) 30 | tokenize_input["Emotion_labels"] = Emotion_labels 31 | tokenize_input["Sentiment_labels"] = Sentiment_labels 32 | return tokenize_input 33 | 34 | 35 | 36 | 37 | def create_tokenized_dataset(dataset): 38 | raw_dataset = dataset.df_dict 39 | tokenized_datasets = raw_dataset.map(tokenize_funtion,batched=True) 40 | tokenized_datasets = tokenized_datasets.rename_column("Sentiment_labels", "labels")#把Sentiment作为先训练的目标来测试一下 41 | return tokenized_datasets 42 | 43 | def compute_metrics(eval_preds): 44 | logits, labels = eval_preds 45 | predictions = np.argmax(logits, axis=-1) 46 | 47 | 48 | true_labels = [setting.Sentiment_list[label] for label in labels ] 49 | true_predictions = [setting.Sentiment_list[prediction] for prediction in predictions] 50 | metric_dict = classification_report(y_true=true_labels, 51 | y_pred=true_predictions, 52 | target_names=setting.Sentiment_list, 53 | output_dict=True) 54 | weighted_f1 = compute_weighted_f1(metric_dict, target_names=setting.Sentiment_list) 55 | result_dict = {"weighted_f1": weighted_f1} 56 | for tag in setting.Sentiment_list: 57 | for metric_name, metric_val in metric_dict[tag].items(): 58 | if metric_name == "support": continue 59 | result_dict[f"{tag}_{metric_name}"] = metric_val 60 | 61 | return result_dict 62 | 63 | 64 | 65 | ##################prediction & eval#################################### 66 | 67 | 68 | def predict_model(trainer, tokenized_datasets, name="dev"): 69 | 70 | # makei predictions 71 | # predictions: (dataset_size, max_len, num_classes) 72 | # label_ids: (dataset_size, max_len) 73 | predictions, labels, metrics = trainer.predict(tokenized_datasets[name]) 74 | predictions = np.argmax(predictions, axis=-1) 75 | 76 | y_true = [setting.Sentiment_list[label] for label in labels] 77 | y_pred = [setting.Sentiment_list[prediction] for prediction in predictions] 78 | 79 | return y_true, y_pred 80 | 81 | 82 | def evaluate_model(trainer, tokenized_datasets, name="dev"): 83 | label_list = setting.Sentiment_list 84 | 85 | y_true, y_pred = predict_model(trainer, tokenized_datasets, name=name) 86 | 87 | y_pred_list = y_pred 88 | y_true_list = y_true 89 | 90 | metric = classification_report(y_true=y_true_list, y_pred=y_pred_list, target_names=label_list, output_dict=True) 91 | metric_str = classification_report(y_true=y_true_list, y_pred=y_pred_list, target_names=label_list, output_dict=False) 92 | 93 | return metric, metric_str -------------------------------------------------------------------------------- /utils/common.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import logging 3 | from datetime import datetime 4 | import sys 5 | import os 6 | import shutil 7 | import torch 8 | 9 | def compute_weighted_f1(metric, target_names=None): 10 | # metric: sklearn.metrics.classification_report 11 | assert set(target_names).issubset(set(metric.keys())) 12 | 13 | supports = np.array([metric[name]["support"] for name in target_names]) 14 | weights = supports / np.sum(supports) 15 | 16 | weighted_f1 = np.dot(weights, np.array([metric[name]["f1-score"] for name in target_names])) 17 | 18 | return weighted_f1 19 | 20 | def get_current_time(): 21 | return datetime.now().strftime("%Y-%m-%d_%H:%M:%S") 22 | def prepare_logger(filename=None, name=None): 23 | name = __name__ if (name is None) or (not isinstance(name, str)) else name 24 | 25 | logger = logging.getLogger(name) 26 | if filename is None: filename = get_current_time() 27 | 28 | logging.basicConfig( 29 | format="%(asctime)s - %(levelname)s - %(name)s\n%(message)s", 30 | datefmt="%m/%d/%Y %H:%M:%S", 31 | handlers=[logging.StreamHandler(sys.stdout), logging.FileHandler(filename)], 32 | ) 33 | logger.setLevel(logging.INFO) 34 | 35 | return logger 36 | 37 | 38 | def remove_directories(path_list): 39 | # path_list: a list of paths in the current directory 40 | for path in path_list: 41 | if os.path.exists(path): shutil.rmtree(path) 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /utils/data.py: -------------------------------------------------------------------------------- 1 | from setting import setting 2 | import pandas as pd 3 | import pathlib 4 | 5 | import librosa 6 | from utils.hubert import feature_extractor 7 | from torch.utils.data import Dataset 8 | from utils.bert import tokenizer 9 | import torch 10 | 11 | ## 代修改筛选 12 | 13 | def get_data(data_use = "train",mode="multi"): 14 | data_path = setting.save_data_path / pathlib.Path("%s_%s.dt"%(mode,data_use)) 15 | if not data_path.exists(): 16 | print(f" - Creating new {data_use} data") 17 | data = MELDDataSet(data_use=data_use,mode=mode) 18 | torch.save(data, data_path) 19 | else: 20 | print(f" - Found cached {data_use} data") 21 | data = torch.load(data_path) 22 | 23 | return data 24 | 25 | 26 | 27 | 28 | class MELDDataSet(Dataset): 29 | def __init__(self,data_use = "train",mode="audio"): 30 | """ 31 | 32 | :param data_use: train or dev or test 33 | :param mode: sent or audio or multi (单模态or多模态) 34 | """ 35 | self.data_use = data_use 36 | self.mode = mode 37 | self.train_sent_data_path = setting.data_path / pathlib.Path("train_sent_emo.csv") 38 | self.dev_sent_data_path = setting.data_path / pathlib.Path("dev_sent_emo.csv") 39 | self.test_sent_data_path = setting.data_path / pathlib.Path("test_sent_emo.csv") 40 | 41 | self.train_audio_data_path = setting.data_path / pathlib.Path("MELD") / pathlib.Path("train_splits") / pathlib.Path("wav") 42 | self.dev_audio_data_path = setting.data_path / pathlib.Path("MELD") / pathlib.Path("dev_splits_complete") / pathlib.Path("wav") 43 | self.test_audio_data_path = setting.data_path / pathlib.Path("MELD") / pathlib.Path(" output_repeated_splits_test") / pathlib.Path("wav") 44 | 45 | self.df = self.load_data() 46 | self.wav_path_list = self.df["wav_path"].tolist() 47 | self.emotion_label = [setting.Emotion2ID[emotion] for emotion in self.df["Emotion"].tolist()] 48 | self.sentiment_label = [setting.Sentiment2ID[sentiment] for sentiment in self.df["Sentiment"].tolist()] 49 | 50 | if self.mode == "audio" or self.mode=="multi": 51 | self.audio = self.load_audio().tolist() 52 | if self.mode == "text" or self.mode=="multi": 53 | self.text_vec = self.load_text_vector().tolist() 54 | 55 | self.len = len(self.emotion_label) 56 | 57 | 58 | 59 | 60 | def load_data(self): 61 | 62 | path,wav_path = None,None 63 | if self.data_use =="train": 64 | path = self.train_sent_data_path 65 | wav_path = "train_splits/wav" # 存训练集合的音频文件的目录 66 | elif self.data_use == "dev": 67 | path = self.dev_sent_data_path 68 | wav_path = "dev_splits_complete/wav" 69 | elif self.data_use == "test": 70 | path = self.test_sent_data_path 71 | wav_path = "output_repeated_splits_test/wav" 72 | 73 | df = pd.read_csv(path) 74 | df['wav_path'] = str(setting.data_path) + '/' + wav_path + '/dia' + df['Dialogue_ID'].map(str) + '_utt' + df[ 75 | 'Utterance_ID'].map(str) + '.wav' 76 | 77 | df = self.clean_data(df) 78 | df.drop('Dialogue_ID', axis=1, inplace=True) 79 | df.drop('Utterance_ID', axis=1, inplace=True) 80 | df.drop('StartTime', axis=1, inplace=True) 81 | df.drop('EndTime', axis=1, inplace=True) 82 | 83 | return df 84 | 85 | 86 | 87 | 88 | 89 | def clean_data(self,df): 90 | """ 91 | 数据清洗, 92 | 有的utterence没有对应的wav文件 93 | 我们就将这条数据给删除 94 | 95 | :return: 96 | """ 97 | for index,row in df.iterrows(): 98 | if not pathlib.Path(row["wav_path"]).exists(): 99 | df = df.drop(index) 100 | return df# 我先筛选少一点,便于调试,到时候再改 101 | 102 | def load_audio(self): 103 | """ 104 | 将wav_path 转为向量 105 | :return: 106 | """ 107 | 108 | #import swifter 109 | import time 110 | def map(wav_path): 111 | max_duration = 15 112 | speech, _ = librosa.load(wav_path, sr=16000, mono=True) 113 | input_values = feature_extractor(speech, sampling_rate=16000, padding=False,max_length=int(feature_extractor.sampling_rate * max_duration),truncation=True) 114 | return input_values 115 | time1 = time.time() 116 | #df2 = self.df["wav_path"].swifter.apply(map) 117 | df2 = self.df["wav_path"].apply(map) 118 | time2 = time.time() 119 | print(time2-time1) 120 | return df2 121 | def load_text_vector(self): 122 | """ 123 | 将text列表转为向量 124 | :return: 125 | """ 126 | def map(sent): 127 | input_values = tokenizer(sent,truncation=True) 128 | return input_values 129 | 130 | return self.df["Utterance"].apply(map) 131 | 132 | 133 | 134 | def __getitem__(self, index): 135 | if self.mode =="audio": 136 | 137 | # tokenize_inputs= feature_extractor(examples["speech"], sampling_rate=16000, padding=True 138 | # ,max_length=int(feature_extractor.sampling_rate * max_duration), 139 | # truncation=True) 140 | 141 | input_values = self.audio[index] 142 | input_values["emotion"] = self.emotion_label[index] 143 | input_values["sentiment"] = self.sentiment_label[index] 144 | if len(input_values["input_values"])!=1: ##加这个判断的原因极为丑陋,看不懂直接跳过 145 | return input_values 146 | input_values["input_values"] = input_values["input_values"][0].tolist() 147 | return input_values 148 | #return input_values["input_values"],input_values["sentiment"] 149 | 150 | elif self.mode == "text": 151 | input_values = self.text_vec[index].data 152 | input_values["emotion"] = self.emotion_label[index] 153 | input_values["sentiment"] = self.sentiment_label[index] 154 | return input_values 155 | 156 | elif self.mode == "multi": 157 | input_values2 = self.audio[index] 158 | 159 | input_values = self.text_vec[index].data 160 | input_values["emotion"] = self.emotion_label[index] 161 | input_values["sentiment"] = self.sentiment_label[index] 162 | input_values["audio_vec"] = self.audio[index].data["input_values"][0].tolist() 163 | return input_values 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | def __len__(self): 172 | return self.len 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | # def load_data(self): 181 | # train_dataset = Dataset.from_pandas(self.load_single_data(True,False,False)) 182 | # dev_dataset = Dataset.from_pandas(self.load_single_data(False,True,False)) 183 | # test_dataset = Dataset.from_pandas(self.load_single_data(False,False,True)) 184 | # dataset_dict = DatasetDict({"train":train_dataset,"dev":dev_dataset,"test":test_dataset}) 185 | # return dataset_dict 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | #################TEST#################################################### 195 | 196 | from transformers.feature_extraction_utils import BatchFeature 197 | # def my_fn(batch): 198 | # 199 | # batch = data_collator(batch) 200 | # return batch 201 | 202 | if __name__ == "__main__": 203 | pass 204 | # base_path = str(setting.data_path) 205 | # datafiles = {'train':base_path+"/train_sent_emo.csv",'dev':base_path+"/dev_sent_emo.csv",'test':base_path+"/test_sent_emo.csv"} 206 | # dataset = load_dataset('csv',data_files=datafiles) 207 | # print(dataset) 208 | dataset = MELDDataSet(data_use="train",mode="multi") 209 | for i in dataset: 210 | print("dsa") 211 | # train_dataloader = DataLoader( 212 | # dataset, shuffle=True, batch_size=8,collate_fn=my_fn 213 | # ) 214 | # for batch in train_dataloader: 215 | # print("ENDING") 216 | 217 | -------------------------------------------------------------------------------- /utils/hubert.py: -------------------------------------------------------------------------------- 1 | from setting import setting 2 | from transformers import Wav2Vec2FeatureExtractor,DataCollatorWithPadding 3 | import librosa 4 | from transformers.feature_extraction_utils import BatchFeature 5 | 6 | 7 | """ 8 | 在语音领域,我们的思路是先用wav2Vec2 将wav文件的序列表示转化为Vector 类似NLP中做初始的Embedding 9 | 然后送入Hubert中Finetune获得更好的向量表示 10 | 然后将向量送入下游任务中 11 | 12 | """ 13 | 14 | 15 | 16 | ## 给训练的东西准备一些加载器 17 | feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(setting.feature_extractor_path) 18 | hubert_data_collator = DataCollatorWithPadding(tokenizer=feature_extractor) 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | def map_to_array(example): 29 | speech, _ = librosa.load(example["wav_path"], sr=16000, mono=True) 30 | # speech = librosa.resample(speech.astype(np.float32), 16000) 31 | example["speech"] = speech 32 | return example 33 | 34 | def tokenized_function(examples): 35 | max_duration = 3 36 | # tokenize_inputs= feature_extractor(examples["speech"], sampling_rate=16000, padding=True 37 | # ,max_length=int(feature_extractor.sampling_rate * max_duration), 38 | # truncation=True) 39 | #tokenize_inputs = feature_extractor(examples["speech"],sampling_rate=16000,padding=False) 40 | #tokenize_inputs2 = feature_extractor(None) 41 | #tokenize_inputs3 = BatchFeature() 42 | Emotion_labels = [setting.Emotion2ID[i] for i in examples["Emotion"]] 43 | Sentiment_labels = [setting.Sentiment2ID[i] for i in examples["Sentiment"]] 44 | 45 | examples["Emotion_labels"] = Emotion_labels 46 | examples["Sentiment_labels"] = Sentiment_labels 47 | examples = BatchFeature(examples) 48 | return examples 49 | 50 | def tokenized_dataset_for_hubert(dataset): 51 | raw_dataset = dataset.df_dict 52 | # raw_dataset = raw_dataset.map(map_to_array) 53 | tokenized_datasets = raw_dataset.map(tokenized_function,batched=True) 54 | tokenized_datasets = tokenized_datasets.remove_columns( 55 | ["Emotion", "Episode", "Season", "Sentiment", "Speaker", "Sr No.", "Utterance", 56 | ]) 57 | tokenized_datasets.remove_columns(["wav_path"]) 58 | tokenized_datasets["train"].remove_columns(['__index_level_0__']) 59 | tokenized_datasets["dev"].remove_columns(['__index_level_0__']) 60 | tokenized_datasets = tokenized_datasets.rename_column("Emotion_labels","labels") 61 | tokenized_datasets.set_format("torch") 62 | return tokenized_datasets 63 | 64 | 65 | -------------------------------------------------------------------------------- /utils/multi.py: -------------------------------------------------------------------------------- 1 | 2 | from utils.bert import bert_data_collator 3 | from utils.hubert import hubert_data_collator 4 | 5 | 6 | 7 | def multi_data_collator(batch_list): 8 | """ 9 | bert和hubert transformer里的datacollator 10 | :param batch_list: 11 | :return: 12 | """ 13 | 14 | 15 | def popd(d): 16 | d.pop("audio_vec") 17 | return d 18 | hubert_batch_list = [{"input_values": d["audio_vec"]} for d in batch_list] #注意这个inputvalues,要是不改名,这个datacollator工作不了 19 | bert_batch_list = [ popd(d) for d in batch_list ] 20 | 21 | audio_batch= hubert_data_collator(hubert_batch_list) 22 | text_batch = bert_data_collator(bert_batch_list) 23 | return text_batch,audio_batch 24 | -------------------------------------------------------------------------------- /utils/read_emorynlp.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | df_train = pd.read_csv('../data/emorynlp/emorynlp_train_final.csv') # load the .csv file, specify the appropriate path 3 | utt = df_train['Utterance'].tolist() # load the list of utterances 4 | sea = df_train['Season'].tolist() # load the list of season no. 5 | ep = df_train['Episode'].tolist() # load the list of episode no. 6 | sc_id = df_train['Scene_ID'].tolist() # load the list of scene id's 7 | utt_id = df_train['Utterance_ID'].tolist() # load the list of utterance id's 8 | for i in range(len(utt)): 9 | print ('Utterance: ' + utt[i]) # display utterance 10 | print ('Video Path: emorynlp_train_splits/sea' + str(sea[i]) + '_ep' + str(ep[i]) + '_sc' + str(sc_id[i]) + '_utt' + str(utt_id[i]) + '.mp4') # display the video file path 11 | print () -------------------------------------------------------------------------------- /utils/read_meld.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | df_train = pd.read_csv('../data/MELD/train_sent_emo.csv') # load the .csv file, specify the appropriate path 3 | utt = df_train['Utterance'].tolist() # load the list of utterances 4 | dia_id = df_train['Dialogue_ID'].tolist() # load the list of dialogue id's 5 | utt_id = df_train['Utterance_ID'].tolist() # load the list of utterance id's 6 | for i in range(len(utt)): 7 | print ('Utterance: ' + utt[i]) # display utterance 8 | print ('Video Path: train_splits/dia' + str(dia_id[i]) + '_utt' + str(utt_id[i]) + '.mp4') # display the video file path 9 | print () -------------------------------------------------------------------------------- /有用的链接.md: -------------------------------------------------------------------------------- 1 | https://blog.csdn.net/qq_33858719/article/details/102670370 2 | 3 | 4 | http://xbna.pku.edu.cn/fileup/0479-8023/HTML/2020-1-75.html 5 | 6 | --------------------------------------------------------------------------------