├── .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 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
--------------------------------------------------------------------------------