CCF BDCI 剧本角色情感识别:多目标学习开源方案
1、赛题名称
剧本角色情感识别
比赛链接:https://www.datafountain.cn/competitions/518
2、赛题背景
剧本对影视行业的重要性不言而喻。一部好的剧本,不光是好口碑和大流量的基础,也能带来更高的商业回报。剧本分析是影视内容生产链条的第一环,其中剧本角色的情感识别是一个非常重要的任务,主要是对剧本中每句对白和动作描述中涉及到的每个角色从多个维度进行分析并识别出情感。相对于通常的新闻、评论性文本的情感分析,有其独有的业务特点和挑战。
3、赛题任务
本赛题提供一部分电影剧本作为训练集,训练集数据已由人工进行标注,参赛队伍需要对剧本场景中每句对白和动作描述中涉及到的每个角色的情感从多个维度进行分析和识别。该任务的主要难点和挑战包括:1)剧本的行文风格和通常的新闻类语料差别较大,更加口语化;2)剧本中角色情感不仅仅取决于当前的文本,对前文语义可能有深度依赖。
4 数据简介
比赛的数据来源主要是一部分电影剧本,以及爱奇艺标注团队的情感标注结果,主要用于提供给各参赛团队进行模型训练和结果验证使用。
数据说明
训练数据:训练数据为txt格式,以英文制表符分隔,首行为表头,字段说明如下:
字段名称 | 类型 | 描述 | 说明 |
---|---|---|---|
id | String | 数据ID | - |
content | String | 文本内容 | 剧本对白或动作描写 |
character | String | 角色名 | 文本中提到的角色 |
emotion | String | 情感识别结果(按顺序) | 爱情感值,乐情感值,惊情感值,怒情感值,恐情感值,哀情感值 |
备注:
1)本赛题的情感定义共6类(按顺序):爱、乐、惊、怒、恐、哀;
2)情感识别结果:上述6类情感按固定顺序对应的情感值,情感值范围是[0, 1, 2, 3],0-没有,1-弱,2-中,3-强,以英文半角逗号分隔;
3)本赛题不需要识别剧本中的角色名;
文件编码:UTF-8 无BOM编码
5 评估标准
本赛题算法评分采用常用的均方根误差(RMSE)来计算评分,按照“文本内容+角色名”识别出的6类情感对应的情感值来统计。
score = 1/(1 + RMSE)
其中是yi,j预测的情感值,xi,j是标注的情感值,n是总的测试样本数。
最终按score得分来排名。
6 基于预训练模型的对目标学习
这个题目可操作的地方有很多,一开始见到这个比赛的时候见想到了multi outputs的模型构建,这里给大家分享下这个基线,希望有大佬能够针对这个思路优化上去~
6.1 加载数据
首先读取数据
with open('data/train_dataset_v2.tsv', 'r', encoding='utf-8') as handler:lines = handler.read().split('\n')[1:-1]data = list()for line in tqdm(lines):sp = line.split('\t')if len(sp) != 4:print("ERROR:", sp)continuedata.append(sp)train = pd.DataFrame(data)
train.columns = ['id', 'content', 'character', 'emotions']test = pd.read_csv('data/test_dataset.tsv', sep='\t')
submit = pd.read_csv('data/submit_example.tsv', sep='\t')
train = train[train['emotions'] != '']
提取情感目标
train['emotions'] = train['emotions'].apply(lambda x: [int(_i) for _i in x.split(',')])train[['love', 'joy', 'fright', 'anger', 'fear', 'sorrow']] = train['emotions'].values.tolist()
6.2 构建数据集
数据集的标签一共有六个:
class RoleDataset(Dataset):def __init__(self,texts,labels,tokenizer,max_len):self.texts=textsself.labels=labelsself.tokenizer=tokenizerself.max_len=max_lendef __len__(self):return len(self.texts)def __getitem__(self,item):"""item 为数据索引,迭代取第item条数据"""text=str(self.texts[item])label=self.labels[item]encoding=self.tokenizer.encode_plus(text,add_special_tokens=True,max_length=self.max_len,return_token_type_ids=True,pad_to_max_length=True,return_attention_mask=True,return_tensors='pt',)# print(encoding['input_ids'])sample = {'texts': text,'input_ids': encoding['input_ids'].flatten(),'attention_mask': encoding['attention_mask'].flatten()}for label_col in target_cols:sample[label_col] = torch.tensor(label[label_col], dtype=torch.float)return sample
6.3 模型构建
class EmotionClassifier(nn.Module):def __init__(self, n_classes):super(EmotionClassifier, self).__init__()self.bert = BertModel.from_pretrained(PRE_TRAINED_MODEL_NAME)self.out_love = nn.Linear(self.bert.config.hidden_size, n_classes)self.out_joy = nn.Linear(self.bert.config.hidden_size, n_classes)self.out_fright = nn.Linear(self.bert.config.hidden_size, n_classes)self.out_anger = nn.Linear(self.bert.config.hidden_size, n_classes)self.out_fear = nn.Linear(self.bert.config.hidden_size, n_classes)self.out_sorrow = nn.Linear(self.bert.config.hidden_size, n_classes)def forward(self, input_ids, attention_mask):_, pooled_output = self.bert(input_ids=input_ids,attention_mask=attention_mask,return_dict = False)love = self.out_love(pooled_output)joy = self.out_joy(pooled_output)fright = self.out_fright(pooled_output)anger = self.out_anger(pooled_output)fear = self.out_fear(pooled_output)sorrow = self.out_sorrow(pooled_output)return {'love': love, 'joy': joy, 'fright': fright,'anger': anger, 'fear': fear, 'sorrow': sorrow,}
6.4 模型训练
回归损失函数直接选取 nn.MSELoss()
EPOCHS = 1 # 训练轮数optimizer = AdamW(model.parameters(), lr=3e-5, correct_bias=False)
total_steps = len(train_data_loader) * EPOCHSscheduler = get_linear_schedule_with_warmup(optimizer,num_warmup_steps=0,num_training_steps=total_steps
)loss_fn = nn.MSELoss().to(device)
模型总的loss为六个目标值的loss之和
def train_epoch(model, data_loader, criterion, optimizer, device, scheduler, n_examples
):model = model.train()losses = []correct_predictions = 0for sample in tqdm(data_loader):input_ids = sample["input_ids"].to(device)attention_mask = sample["attention_mask"].to(device)outputs = model(input_ids=input_ids,attention_mask=attention_mask)loss_love = criterion(outputs['love'], sample['love'].to(device))loss_joy = criterion(outputs['joy'], sample['joy'].to(device))loss_fright = criterion(outputs['fright'], sample['fright'].to(device))loss_anger = criterion(outputs['anger'], sample['anger'].to(device))loss_fear = criterion(outputs['fear'], sample['fear'].to(device))loss_sorrow = criterion(outputs['sorrow'], sample['sorrow'].to(device))loss = loss_love + loss_joy + loss_fright + loss_anger + loss_fear + loss_sorrowlosses.append(loss.item())loss.backward()nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)optimizer.step()scheduler.step()optimizer.zero_grad()
# return correct_predictions.double() / (n_examples*6), np.mean(losses)return np.mean(losses)
线上提交0.67+
CCF BDCI 剧本角色情感识别:多目标学习开源方案相关推荐
- 剧本角色情感分析赛后总结
datafountain剧本角色情感分析赛后总结 模型的搭建 整数与浮点数提交之争 上下文的选择以及主语的加入 验证集和测试集的划分问题 多折模型训练及模型融合的方法 融合提升的要点 预训练操作 对抗 ...
- 深度语义理解在剧本角色情感分析中的探索与应用
深度语义理解在剧本角色情感分析中的探索与应用 1.背景 剧本分析是内容生产链条的第一环,因此,我们结合专家经验知识,大数据与自然语言处理计数来帮助业务部门快速分析和评估剧本.评估体系中涉及到了大量关于 ...
- 盘点热门的目标检测开源方案(附论文+代码下载)
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 在2020年中,目标检测领域出现了许多优秀的工作,今天我们来聊一聊在当前热门的五大目标检测开源方案. ...
- CCF BDCI 多人种人脸识别冠军分享
冠军分享:多人种人脸识别 天才儿童队伍由三名队员组成,成员由在读研究生和博士生组成,主要的研究方向是图像特征提取,目标识别与检测.团队有着丰富的项目经验和比赛经验. 文本是他们本次参赛的分享,比赛代码 ...
- 各类识别、深度学习-开源代码文献梳理
可以看看这个 http://blog.csdn.net/workerwu/article/details/46537849 Deep Residual Networks Deep Residual L ...
- 基于音频和文本的多模态语音情感识别(一篇极好的论文,值得一看哦!)
基于音频和文本的多模态语音情感识别 语音情感识别是一项具有挑战性的任务,在构建性能良好的分类器时,广泛依赖于使用音频功能的模型.本文提出了一种新的深度双循环编码器模型,该模型同时利用文本数据和音频信号 ...
- 语音情感识别领域-论文阅读笔记1:融合语音和文字的句段级别情感识别技术
语音情感识别领域-论文阅读笔记1 Fusion Techniques for Utterance-Level Emotion Recognition Combining Speech and Tran ...
- 华为云获CCF BDCI 2019金融实体级情感分析大赛冠军
近日,在2019 CCF大数据与计算智能大赛(CCF Big Data & Computing Intelligence Contest,简称CCF BDCI)决赛中,华为云语音语义创新Lab ...
- 2020 CCF BDCI 非结构化商业文本信息中隐私信息识别TOP5方案
2020 CCF BDCI 非结构化商业文本信息中隐私信息识别TOP5方案 1 写在前面 在本次CCF BDCI的非结构化商业文本信息中隐私信息识别比赛中,我们团队水煮毛血旺在初赛A榜B榜排名第六, ...
最新文章
- php不报错怎么回事,解决PHP 7等web编程语言不报错一例
- grafana官方使用文档_使用 Loki 采集微服务日志
- 中国一线城市住宅地价同比增幅连续8个季度收窄
- ASP.NET Web Services Tutorial
- python程序结构有哪几种_Python数据结构与算法(几种排序)小结
- HTML5移动端音乐播放器(启蒙篇)
- c语言数据结构五子棋实验报告,数据结构课程设计-五子棋
- Dart 14-Day
- AttributeError: module 'pymysql' has no attribute 'escape' 错误的出现以及解决
- 问题五十三:怎么用ray tracing画参数方程表示的曲面(1)
- 基于MATLAB的人脸识别
- 操作实例:创建自定义 Windows PE 映像
- 各大浏览器兼容性问题
- qt编写的mask遮罩的半透明涂抹功能
- 【lua/aviutl】小型倒计时
- win10电脑自带的office突然变成英文解决办法
- 爬取B站视频 - m4s文件的相关研究
- 寒假第三周学习总结与反思
- 少儿知识付费领域潜力无限,未来该如何发展?
- 《Get the Job You Want》 by Harvey B. Mackay
热门文章
- 最新网狐荣耀版整理、编译和搭建教程
- Quartus ii 软件仿真基本流程(使用VHDL)
- 苦战 自由软件的今生前世
- Codeforces 77A Heroes
- 基于FME实现的地理数据库批量建库的解决方案,支持gdb、mdb、shapefile等数据格式,gdb批量建库,mdb批量建库,shp批量建库,shapefile批量建库,地理数据批量建库
- ht1621b和单片机电平匹配_STM32液晶显示HT1621驱动原理及程序代码
- 平时收集的一些有关UED的团队和个人博客(转)
- IDE工具(48) idea常用插件
- 结构光三维测量几种比较成熟的方法
- 速锐得科技开发新能源汽车在城市物流配送TBOX的背景和意义