科大讯飞学术论文分类挑战赛 0.79+ baseline

  • 比赛题目:学术论文分类挑战赛
  • 比赛链接:http://challenge.xfyun.cn/topic/info?type=academic-paper-classification
  • 比赛任务:本次赛题希望参赛选手利用论文信息:论文id、标题、摘要,划分论文具体类别。

1、赛事背景

随着人工智能技术不断发展,每周都有非常多的论文公开发布。现如今对论文进行分类逐渐成为非常现实的问题,这也是研究人员和研究机构每天都面临的问题。现在希望选手能构建一个论文分类模型。

2、赛事任务

本次赛题希望参赛选手利用论文信息:论文id、标题、摘要,划分论文具体类别。

赛题样例(使用\t分隔):

  • paperid:9821

  • title:Calculation of prompt diphoton production cross sections at Tevatron and LHC energies

  • abstract:A fully differential calculation in perturbative quantum chromodynamics is presented for the production of massive photon pairs at hadron colliders. All next-to-leading order perturbative contributions from quark-antiquark, gluon-(anti)quark, and gluon-gluon subprocesses are included, as well as all-orders resummation of initial-state gluon radiation valid at next-to-next-to-leading logarithmic accuracy.

  • categories:hep-ph

3、评审规则

1. 数据说明

训练数据和测试集以csv文件给出,其中:

  • 训练集5W篇论文。其中每篇论文都包含论文id、标题、摘要和类别四个字段。

  • 测试集1W篇论文。其中每篇论文都包含论文id、标题、摘要,不包含论文类别字段。

2. 评估指标

本次竞赛的评价标准采用准确率指标,最高分为1。计算方法参考https://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html, 评估代码参考:

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、排行按照得分从高到低排序,排行榜将选择团队的历史最优成绩进行排名。

4、作品提交要求

文件格式:预测结果文件按照csv格式提交

文件大小:无要求

提交次数限制:每支队伍每天最多3次

预测结果文件详细说明:

  1. 以csv格式提交,编码为UTF-8,第一行为表头;

  2. 提交前请确保预测结果的格式与sample_submit.csv中的格式一致。具体格式如下:

paperid,categories

test_00000,cs.CV

test_00001,cs.DC

test_00002,cs.AI

test_00003,cs.NI

test_00004,cs.SE

5、赛程规则

正式赛

7月12日——8月11日

  • 初赛截止成绩以团队在初赛时间段内最优成绩为准(不含测试排名)。

  • 初赛作品提交截止日期为8月11日17:00;正式赛名次公布日期为8月12日10:00。

长期赛

8月12日——9月20日

因赛事以学习实践为主,正式赛将转变为长期赛,供开发者学习实践。本阶段提交后,系统会根据成绩持续更新榜单,但该阶段榜单不再进行公示和奖励。

6、奖项设置

本赛题设立一、二、三等奖各一名,具体详情如下:

  • 一等奖:1支队伍,周赛一等奖证书,奖金:1000元

  • 二等奖:1支队伍,周赛二等奖证书,奖金:800元

  • 三等奖:1支队伍,周赛三等奖证书,奖金:500元

7 、基于Roberta的学术论文分类模型

  • 分类标签分布:


  • 文本长度统计

拼接后title和abstract的文本长度分布

import gc
import os

import numpy as np
import pandas as pd
import seaborn as sns
import torch
from pylab import rcParams
from simpletransformers.classification import ClassificationModel, ClassificationArgs
from sklearn.metrics import accuracy_score

os.environ["CUDA_VISIBLE_DEVICES"] = "0"  # 设置显卡
# 配置

sns.set(style='whitegrid', palette='muted', font_scale=1.2)
HAPPY_COLORS_PALETTE = ["#01BEFE", "#FFDD00", "#FF7D00", "#FF006D", "#ADFF02", "#8F00FF"]
sns.set_palette(sns.color_palette(HAPPY_COLORS_PALETTE))
rcParams['figure.figsize'] = 25, 20
RANDOM_SEED = 42
np.random.seed(RANDOM_SEED)
torch.manual_seed(RANDOM_SEED)

train = pd.read_csv('data/train/train.csv', sep='\t')
test = pd.read_csv('data/test/test.csv', sep='\t')
sub = pd.read_csv('data/sample_submit.csv')

# 拼接title与abstract
train['text'] = train['title'] + ' ' + train['abstract']
test['text'] = test['title'] + ' ' + test['abstract']

label_id2cate = dict(enumerate(train.categories.unique()))
label_cate2id = {value: key for key, value in label_id2cate.items()}

train['label'] = train['categories'].map(label_cate2id)

train = train[['text', 'label']]
train_y = train["label"]

train_df = train[['text', 'label']][:45000]
eval_df = train[['text', 'label']][45000:]

model_args = ClassificationArgs()
model_args.max_seq_length = 20
model_args.train_batch_size = 8
model_args.num_train_epochs = 1
model_args.fp16 = False
model_args.evaluate_during_training = False
model_args.overwrite_output_dir = True

model_type = 'roberta'
model_name = 'roberta-base'
print("training {}.........".format(model_name))
model_args.cache_dir = './caches' + '/' + model_name.split('/')[-1]
model_args.output_dir = './outputs' + '/' + model_name.split('/')[-1]

model = ClassificationModel(
    model_type,
    model_name,
    num_labels=39,
    args=model_args)

model.train_model(train_df, eval_df=eval_df)
result, _, _ = model.eval_model(eval_df, acc=accuracy_score)
print(result)

data = []
for index, row in test.iterrows():
    data.append(str(row['text']))
predictions, raw_outputs = model.predict(data)
sub = pd.read_csv('data/sample_submit.csv')
sub['categories'] = predictions
sub['categories'] = sub['categories'].map(label_id2cate)
sub.to_csv('result/submit_{}.csv'.format(model_name), index=False)
del model
gc.collect()

线上提交结果:

6   返回分数    0.7937  1_roberta-base_addlen.csv       致Great  2021-07-12 16:04:22

8 、提升思路

  • 【论文解读】文本分类上分利器:Bert微调trick大全
    https://zhuanlan.zhihu.com/p/386603816
  • 尝试传统LSTM、CNN、hierarchical attention networks (长文本分类)
  • 不同模型结果融合(Blending/Voting)

你可能感兴趣的:(科大讯飞学术论文分类挑战赛 0.79+ baseline)