科大讯飞 中文成语填空挑战赛xlnet baseline
- 比赛名称:中文成语填空挑战赛算法挑战大赛
- 比赛链接:https://challenge.xfyun.cn/topic/info?type=chinese-idioms
- 关注“ChallengeHub”回复“成语填空”获取完整baseline
一、赛事背景
中国文化博大精深源远流长,其中成语更是中国文化的精华。成语大多由四个字组成,一般都有典故或出处。有些成语从字面上不难理解,如“小题大做”、“后来居上”等。有些成语必须知道来源或典故才能懂得意思,如“朝三暮四”、“杯弓蛇影”等。
成语学习是小学语文和初中重要的学习内容,如何在语句中选择合适的成语?本次赛题中希望选手构建模型能理解中文成语。
二、赛事任务
给定一个中文句子的情况下,需要选手在给定上下文的情况下从待选的成语中选择最为合适的成语。即给定句子的上下文,完成合适的成语填入对应位置。
赛题训练集案例如下:
训练集5w条数据,测试集1w条数据。测试集中label字段为空,需要选手预测。
三、评审规则
1. 数据说明
赛题数据由训练集和测试集组成,训练集5w条数据,测试集1w条数据,均为csv格式,列使用\t分割。测试集提交案例见sample_submit.csv文件,不需要表头,直接按照顺序按行写入1w条成语即可。
2. 评估指标
本次竞赛的评价标准采用分类准确率,最高分为1。评估代码参考:
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
accuracy_score(y_true, y_pred)
3. 评测及排行
1、赛事提供下载数据,选手在本地进行算法调试,在比赛页面提交结果。
2、每支团队每天最多提交3次。
3、排行按照得分从高到低排序,排行榜将选择团队的历史最优成绩进行排名。
四、作品提交要求
文件格式:预测结果文件按照csv格式提交
文件大小:无要求
提交次数限制:每支队伍每天最多3次
预测结果文件详细说明:
以csv格式提交,编码为UTF-8
提交前请确保预测结果的格式与sample_submit.csv中的格式一致。具体格式如下:
label
津津乐道
息息相关
必经之路
顾名思义
痛快淋漓
名列前茅
无所事事
如火如荼
夜以继日
紧锣密鼓
源源不断
五、赛程规则
正式赛
8月16日——9月15日
初赛截止成绩以团队在初赛时间段内最优成绩为准(不含测试排名)。
初赛作品提交截止日期为9月15日17:00;正式赛名次公布日期为8月16日10:00。
长期赛
9月16日——10月24日
因赛事以学习实践为主,正式赛将转变为长期赛,供开发者学习实践。本阶段提交后,系统会根据成绩持续更新榜单,但该阶段榜单不再进行公示和奖励。
六、奖项设置
本赛题设立一、二、三等奖各一名,具体详情如下:
一等奖:1支队伍,周赛一等奖证书,奖金:1000元
二等奖:1支队伍,周赛二等奖证书,奖金:800元
三等奖:1支队伍,周赛三等奖证书,奖金:500元
七、baseline思路
- 按照NLP中阅读理解题目处理比赛数据格式,具体内容可以参考swag格式
- 构建描述文本
text
和选项‘choice’,以及候选答案:四个候选‘成语’ - 输入‘AutoModelForMultipleChoice’模型进行训练和预测
构建训练集和测试集
import re
import pandas as pd
from tqdm import tqdmtrain = pd.read_csv('data/train.csv', sep='\t')
test = pd.read_csv('data/test.csv', sep='\t')print(train)
print(test)def process_text(text):return re.sub(' +', ' ', text).strip()def get_question(text):"""根据[MASK][MASK][MASK][MASK]获取问题:param text::return:"""sentences = re.split('(。|!|\!|\.|?|\?)', text) # 保留分割符for sent in sentences:if '[MASK][MASK][MASK][MASK]' in sent:return sentreturn textcols = ["Unnamed: 0","video-id","fold-ind", # q_id"startphrase","sent1", # content"sent2", # question"gold-source","ending0", "ending1", "ending2", "ending3", # choice"label"]# ======================================================
# 生成训练集
# ======================================================
res = []for idx, row in tqdm(train.iterrows()):q_id = f'train_{idx}'content = row['text']content = process_text(content)question = get_question(content)modified_choices = eval(row['candidate'])label = modified_choices.index(row['label'])## Hard-code for swag format!res.append(("","",q_id,"",content,question,"",modified_choices[0],modified_choices[1],modified_choices[2],modified_choices[3],label))
df = pd.DataFrame(res, columns=cols)
模型训练
数据处理函数
@dataclass
class DataCollatorForMultipleChoice:"""Data collator that will dynamically pad the inputs for multiple choice received.Args:tokenizer (:class:`~transformers.PreTrainedTokenizer` or :class:`~transformers.PreTrainedTokenizerFast`):The tokenizer used for encoding the data.padding (:obj:`bool`, :obj:`str` or :class:`~transformers.tokenization_utils_base.PaddingStrategy`, `optional`, defaults to :obj:`True`):Select a strategy to pad the returned sequences (according to the model's padding side and padding index)among:* :obj:`True` or :obj:`'longest'`: Pad to the longest sequence in the batch (or no padding if only a singlesequence if provided).* :obj:`'max_length'`: Pad to a maximum length specified with the argument :obj:`max_length` or to themaximum acceptable input length for the model if that argument is not provided.* :obj:`False` or :obj:`'do_not_pad'` (default): No padding (i.e., can output a batch with sequences ofdifferent lengths).max_length (:obj:`int`, `optional`):Maximum length of the returned list and optionally padding length (see above).pad_to_multiple_of (:obj:`int`, `optional`):If set will pad the sequence to a multiple of the provided value.This is especially useful to enable the use of Tensor Cores on NVIDIA hardware with compute capability >=7.5 (Volta)."""tokenizer: PreTrainedTokenizerBasepadding: Union[bool, str, PaddingStrategy] = Truemax_length: Optional[int] = Nonepad_to_multiple_of: Optional[int] = Nonedef __call__(self, features):label_name = "label" if "label" in features[0].keys() else "labels"labels = [feature.pop(label_name) for feature in features]batch_size = len(features)num_choices = len(features[0]["input_ids"])flattened_features = [[{k: v[i] for k, v in feature.items()} for i in range(num_choices)] for feature in features]flattened_features = sum(flattened_features, [])batch = self.tokenizer.pad(flattened_features,padding=self.padding,max_length=self.max_length,pad_to_multiple_of=self.pad_to_multiple_of,return_tensors="pt",)# Un-flattenbatch = {k: v.view(batch_size, num_choices, -1) for k, v in batch.items()}# Add back labelsbatch["labels"] = torch.tensor(labels, dtype=torch.int64)return batch
模型训练
# Metricdef compute_metrics(eval_predictions):predictions, label_ids = eval_predictionspreds = np.argmax(predictions, axis=1)return {"accuracy": (preds == label_ids).astype(np.float32).mean().item()}# Initialize our Trainertrainer = Trainer(model=model,args=training_args,train_dataset=tokenized_datasets["train"] if training_args.do_train else None,eval_dataset=tokenized_datasets["validation"] if training_args.do_eval else None,tokenizer=tokenizer,data_collator=data_collator,compute_metrics=compute_metrics,)# Trainingif training_args.do_train:if last_checkpoint is not None:checkpoint = last_checkpointelif os.path.isdir(model_args.model_name_or_path):checkpoint = model_args.model_name_or_pathelse:checkpoint = Nonetrain_result = trainer.train(resume_from_checkpoint=checkpoint)trainer.save_model() # Saves the tokenizer too for easy uploadoutput_train_file = os.path.join(training_args.output_dir, "train_results.txt")if trainer.is_world_process_zero():with open(output_train_file, "w") as writer:logger.info("***** Train results *****")for key, value in sorted(train_result.metrics.items()):logger.info(f" {key} = {value}")writer.write(f"{key} = {value}\n")# Need to save the state, since Trainer.save_model saves only the tokenizer with the modeltrainer.state.save_to_json(os.path.join(training_args.output_dir, "trainer_state.json"))
模型参数设置
预训练模型选择hfl/chinese-xlnet-base
,大约需要训练1个小时左右。
#!/bin/bashpython -u baseline.py \--model_name_or_path 'hfl/chinese-xlnet-base' \--do_train \--do_eval \--do_predict \--logging_steps=100 \--max_seq_length 200 \--train_file data/new_train.csv \--validation_file data/new_valid.csv \--test_file data/new_test.csv \--learning_rate 3e-5 \--num_train_epochs 2 \--output_dir 'models/xlnet' \--gradient_accumulation_steps 4 \--per_device_eval_batch_size 16 \--per_device_train_batch_size 16 \--overwrite_output
八、提升思路
- 参数调整:学习率、最大长度,Batch Size
- 交叉验证,多种子融合
- 模型投票融合
- 尝试多种预训练模型
科大讯飞 中文成语填空挑战赛xlnet baseline相关推荐
- ACL论文+代码+Live数据竞赛 | 清华CoAI实验室中文成语填空研究
背景 本文介绍了清华大学 CoAI 实验室发表于 2019 年 ACL 的成语完形填空论文.根据这篇论文的主题和数据,清华大学人工智能研究院与中国计算机学会也联合组织了一次"成语阅读理解大赛 ...
- python程序填空_pygame实现成语填空游戏
最近看到很多人玩成语填字游戏,那么先用pygame来做一个吧,花了大半天终于完成了,附下效果图. 偷了下懒程序没有拆分,所有程序写在一个文件里,主要代码如下: # -*- coding=utf-8 - ...
- pygame实现成语填空游戏
最近看到很多人玩成语填字游戏,那么先用pygame来做一个吧,花了大半天终于完成了,附下效果图. 偷了下懒程序没有拆分,所有程序写在一个文件里,主要代码如下: # -*- coding=utf-8 - ...
- 智算之道——人工智能应用挑战赛(初赛)-baseline 0.844
智算之道--人工智能应用挑战赛(初赛)-baseline 比赛类型:数据挖掘 比赛数据:表格题(csv) 学习方式:有监督 比赛链接 比赛任务:疾病的预测往往能够从病人的病历历史数据挖掘当中判断,而许 ...
- “智源-MagicSpeechNet 家庭场景中文语音数据集挑战赛”上线
2019 年 12 月,北京智源人工智能研究院联合爱数智慧和数据评测平台 Biendata,共同发布了"智源 MagicSpeechNet 家庭场景中文语音数据集",其中包含数百小 ...
- 纯js写的手机版成语填空游戏
前面用python的pygame版本做了一个成语填空游戏 https://blog.csdn.net/zhangenter/article/details/89807613 有朋友抱怨手机上用不了,现 ...
- 2021华为软件精英挑战赛初赛baseline
2021华为软件精英挑战赛初赛baseline,由ddmm大佬提供的单文件baseline按照工程开发格式改写,改为以类为单位,多文件的格式.同样没有在里面添加任何算法,相当于一个脚手架,帮助大家更快 ...
- 什么高大填空四个字动人_体型什么什么四字成语填空
体型什么什么四字成语填空以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 1. 形体字四字成语 形迹可疑 举动和神色值得怀 ...
- 2021科大讯飞试题标签预测挑战赛亚军方案总结
1. 摘要 这个比赛的任务是根据题目的文本内容,预测题目的知识点及难度标签,其中知识点包括五个类型,我们需要预测出对应类型的知识点标签. 在本次比赛中,我们构造了六个独立的模型,模型结构相似, ...
最新文章
- 一文读懂Https的安全性原理、数字证书、单项认证、双项认证等
- Discuz!X3.1数据库的操作(三)
- 为什么用U盘做启动盘
- C++实现希尔排序(附完整源码)
- K8s卸载清理flannel插件清理
- MFC创建模式对话框与非模式对话框
- 一次蚂蚁金服的辛酸面试历程
- 20179301《网络攻防实践》第九周作业
- 感觉小轿车要比SUV舒服,为什么很多人还是选择了SUV?
- 内存管理学习之内存寻址
- Gpower CMS/模板置标
- 深度linux如何安装迅雷,deepin官方论坛-深度科技官网旗下网站
- 物理地址是怎么确定的?以8086为例
- 最短路——大胖子走迷宫
- 目前最赚钱的5种计算机编程语言
- Java深入浅出讲解
- 开始使用WebRTC
- Revit二次开发小技巧(十二)创建带洞口的墙
- 终于明白那些年知其然而不知其所以然的iOS内存管理方式
- Scikit-Learn 中文文档】数据集加载工具 - 用户指南 | ApacheCN
热门文章
- C# 事件中委托方法的Lambda简洁写法用及作用域
- 面试:如何准备简历和面试?
- 计算机相近相关专业职称,职称人员相近专业认定目录 - 范文中心
- 【精选】色谱柱L分类保存与使用注意事项
- Java面试补给站——final、volatile、synchronized三大关键字
- tkinter的容器组件Frame讲解
- 自动驾驶规划控制软硬一体化控制器解决方案(一)
- Ubuntu 20.0.4 linux生信服务器笔记
- 微信转发软件后缀_APP分享文件给微信好友
- 当前电气自动化专业就业形势调查报告 (转载)_史蒂文森sun_新浪博客