常规赛:中文新闻文本标题分类
一.方案介绍
1.1 赛题简介:
文本分类是借助计算机对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。本次比赛为新闻标题文本分类 ,选手需要根据提供的新闻标题文本和类别标签训练一个新闻分类模型,然后对测试集的新闻标题文本进行分类,评价指标上使用Accuracy = 分类正确数量 / 需要分类总数量。同时本次参赛选手需使用飞桨框架和飞桨文本领域核心开发库PaddleNLP,PaddleNLP具备简洁易用的文本领域全流程API、多场景的应用示例、非常丰富的预训练模型,深度适配飞桨框架2.x版本。
1.2 数据介绍:
THUCNews是根据新浪新闻RSS订阅频道2005~2011年间的历史数据筛选过滤生成,包含74万篇新闻文档(2.19 GB),均为UTF-8纯文本格式。本次比赛数据集在原始新浪新闻分类体系的基础上,重新整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐。提供训练数据共832471条。
比赛提供数据集的格式:训练集和验证集格式:原文标题+\t+标签,测试集格式:原文标题。
1.3 Baseline思路:
赛题为一道较常规的短文本多分类任务,本项目主要基于PaddleNLP通过预训练模型Robert在提供的训练数据上进行微调完成新闻14分类模型的训练与优化,最后利用训练好的模型对测试数据进行预测并生成提交结果文件。
注意本项目运行需要选择至尊版的GPU环境!若显存不足注意适当改小下batchsize!
BERT前置知识补充:【原理】经典的预训练模型-BERT
二、数据读取与分析
1.数据分析
#进入比赛数据集存放目录%cd/home/aistudio/data/data103654/
/home/aistudio/data/data103654
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")
train数据集长度:752471dev数据集长度80000test数据集长度83599
#添加列名便于对数据进行更好处理train.columns=["text_a",'label']dev.columns=["text_a",'label']test.columns=["text_a"]
#拼接训练和验证集,便于统计分析total=pd.concat([train,dev],axis=0)
#创建字体目录fonts%cd~#!mkdir.fonts#复制字体文件到该路径!cpdata/data61659/simhei.ttf.fonts/
/home/aistudiocp:cannotcreateregularfile'.fonts/':Notadirectory
#总类别标签分布统计print(total['label'].value_counts())%matplotlibinlineimportmatplotlibasmplimportmatplotlib.pyplotasplt#指定默认字体mpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['font.family']='sans-serif'#解决负号'-'显示为方块的问题mpl.rcParams['axes.unicode_minus']=Falsetotal['label'].value_counts().plot.bar()plt.show()
/home/aistudio/data/data1036540
/home/aistudio/data/data1036541
/home/aistudio/data/data1036542
#文本长度统计分析,通过分析可以看出文本较短,最长为/home/aistudio/data/data1036542total['text_a'].map(len).describe()
count832471.000000mean19.388112std4.097139min2.00000025%17.00000050%20.00000075%23.000000max/home/aistudio/data/data1036542.000000Name:text_a,dtype:float64
/home/aistudio/data/data1036545
/home/aistudio/data/data1036546
2.保存数据
/home/aistudio/data/data1036547
三.基于PaddleNLP构建基线模型
1 PaddleNLP环境准备
/home/aistudio/data/data1036548
/home/aistudio/data/data1036549
2.数据集定义
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集0
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集1
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集2
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集3
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集4
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集5
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集6
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集7
3加载预训练模型
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集8
PaddleNLP不仅支持RoBERTa预训练模型,还支持ERNIE、BERT、Electra等预训练模型。具体可以查看:PaddleNLP模型
下表汇总了目前PaddleNLP支持的各类预训练模型。用户可以使用PaddleNLP提供的模型,完成问答、序列分类、token分类等任务。同时还提供了22种预训练的参数权重供用户使用,其中包含了11种中文语言模型的预训练权重。
bert-base-uncased
bert-large-uncased
bert-base-multilingual-uncased
bert-base-cased
bert-base-chinese
bert-base-multilingual-cased
bert-large-cased
bert-wwm-chinese
bert-wwm-ext-chinese
ERNIEErnieTokenizerErnieTinyTokenizerErnieModel ErnieForQuestionAnswering ErnieForSequenceClassification ErnieForTokenClassificationernie-1.0
ernie-tiny
ernie-2.0-en
ernie-2.0-large-en
RoBERTaRobertaTokenizerRobertaModelRobertaForQuestionAnsweringRobertaForSequenceClassificationRobertaForTokenClassificationroberta-wwm-ext
roberta-wwm-ext-large
rbt3
rbtl3
ELECTRAElectraTokenizerElectraModelElectraForSequenceClassificationElectraForTokenClassificationelectra-small
electra-base
electra-large
chinese-electra-small
chinese-electra-base
注:其中中文的预训练模型有 bert-base-chinese, bert-wwm-chinese, bert-wwm-ext-chinese, ernie-1.0, ernie-tiny, roberta-wwm-ext, roberta-wwm-ext-large, rbt3, rbtl3, chinese-electra-base, chinese-electra-small
等。
4.定义数据处理函数
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集9
四、模型训练
1.超参设置
#参数设置:#批处理大小,显存如若不足的话可以适当改小该值batch_size=360#文本序列最大截断长度,需要根据文本具体长度进行确定,最长不超过512。通过文本长度分析可以看出文本长度最大为/home/aistudio/data/data1036542,故此处设置为/home/aistudio/data/data1036542max_seq_length=max(total['text_a'].str.len())
2.数据处理
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")1
3.设置评价指标
适用于BERT这类Transformer模型的学习率为warmup的动态学习率。
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")2
4.模型评估
ps:模型训练时,可以通过在终端输入nvidia-smi命令或者通过点击底部‘性能监控’选项查看显存的占用情况,适当调整好batchsize,防止出现显存不足意外暂停的情况。
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")3
5.模型训练
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")4
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")5
ps:模型训练时可以通过在终端输入nvidia-smi命令或通过底部右下的性能监控选项查看显存占用情况,显存不足的话要适当调整好batchsize的值。
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")6
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")7
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")8
print(f"train数据集长度:{len(train)}\tdev数据集长度{len(dev)}\ttest数据集长度{len(test)}")9
五、预测
此处要重启或者killall -9 python
来释放缓存
1.导入各种类库
/home/aistudio/data/data1036549
2.加载模型
#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集8
train数据集长度:752471dev数据集长度80000test数据集长度835992
3.加载test数据集
train数据集长度:752471dev数据集长度80000test数据集长度835993
train数据集长度:752471dev数据集长度80000test数据集长度835994
label_list=#使用pandas读取数据集importpandasaspdtrain=pd.read_table('train.txt',sep='\t',header=None)#训练集dev=pd.read_table('dev.txt',sep='\t',header=None)#验证集test=pd.read_table('test.txt',sep='\t',header=None)#测试集1print(label_list)
train数据集长度:752471dev数据集长度80000test数据集长度835996
train数据集长度:752471dev数据集长度80000test数据集长度835997
5.数据处理
#定义数据加载和处理函数defconvert_example(example,tokenizer,max_seq_length=/home/aistudio/data/data1036542,is_test=False):qtconcat=example["text_a"]encoded_inputs=tokenizer(text=qtconcat,max_seq_len=max_seq_length)#tokenizer处理为模型可接受的格式input_ids=encoded_inputs["input_ids"]token_type_ids=encoded_inputs["token_type_ids"]ifnotis_test:label=np.array([example["label"]],dtype="int64")returninput_ids,token_type_ids,labelelse:returninput_ids,token_type_ids#定义模型预测函数defpredict(model,data,tokenizer,label_map,batch_size=1):examples=[]#将输入数据(list格式)处理为模型可接受的格式fortextindata:input_ids,segment_ids=convert_example(text,tokenizer,max_seq_length=/home/aistudio/data/data1036542,is_test=True)examples.append((input_ids,segment_ids))batchify_fn=lambdasamples,fn=Tuple(Pad(axis=0,pad_val=tokenizer.pad_token_id),#inputidPad(axis=0,pad_val=tokenizer.pad_token_id),#segmentid):fn(samples)#Seperatesdataintosomebatches.batches=[]one_batch=[]forexampleinexamples:one_batch.append(example)iflen(one_batch)==batch_size:batches.append(one_batch)one_batch=[]ifone_batch:#Thelastbatchwhosesizeislessthantheconfigbatch_sizesetting.batches.append(one_batch)results=[]model.eval()forbatchinbatches:input_ids,segment_ids=batchify_fn(batch)input_ids=paddle.to_tensor(input_ids)segment_ids=paddle.to_tensor(segment_ids)logits=model(input_ids,segment_ids)probs=F.softmax(logits,axis=1)idx=paddle.argmax(probs,axis=1).numpy()idx=idx.tolist()labels=[label_map[i]foriinidx]results.extend(labels)returnresults#返回预测结果
train数据集长度:752471dev数据集长度80000test数据集长度835999
6.开始预测
#添加列名便于对数据进行更好处理train.columns=["text_a",'label']dev.columns=["text_a",'label']test.columns=["text_a"]0
#添加列名便于对数据进行更好处理train.columns=["text_a",'label']dev.columns=["text_a",'label']test.columns=["text_a"]1
#添加列名便于对数据进行更好处理train.columns=["text_a",'label']dev.columns=["text_a",'label']test.columns=["text_a"]2
#添加列名便于对数据进行更好处理train.columns=["text_a",'label']dev.columns=["text_a",'label']test.columns=["text_a"]3
#添加列名便于对数据进行更好处理train.columns=["text_a",'label']dev.columns=["text_a",'label']test.columns=["text_a"]4
需注意此次要求提交格式为zip,在主目录下找到生成的submission.zip文件下载到本地并到比赛页面进行提交即可!