本章将会对新闻文本分类进行赛题讲解,对赛题数据进行说明,并给出解题思路。
赛题理解
- 赛题名称:零基础入门NLP之新闻文本分类
- 赛题目标:通过这道赛题可以引导大家走入自然语言处理的世界,带大家接触NLP的预处理、模型构建和模型训练等知识点。
- 赛题任务:赛题以自然语言处理为背景,要求选手对新闻文本进行分类,这是一个典型的字符识别问题。
学习目标
- 理解赛题背景与赛题数据
- 完成赛题报名和数据下载,理解赛题的解题思路
赛题数据
赛题以匿名处理后的新闻数据为赛题数据,数据集报名后可见并可下载。赛题数据为新闻文本,并按照字符级别进行匿名处理。整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。
赛题数据由以下几个部分构成:训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本。为了预防选手人工标注测试集的情况,我们将比赛数据的文本按照字符级别进行了匿名处理。
数据标签
处理后的赛题训练数据如下:
![](http://jupter-oss.oss-cn-hangzhou.aliyuncs.com/public/files/image/1095279501877/1594906820936_hVKPJHWvu4.jpg)
数据下载及导入
数据集在比赛报名后下载,下载的数据是CSV格式的地址文件NLP_data_list_0715.csv,读入文件
import pandas as pd
data = pd.read_csv('NLP_data_list_0715.csv',encoding='gbk')
data.head()
file | description | size | link | |
---|---|---|---|---|
0 | train_set.csv.zip | 训练集数据(选手需要自行解压) | 236.11MB | https://tianchi-competition.oss-cn-hangzhou.al... |
1 | test_a.csv.zip | 测试集A榜数据(选手需要自行解压) | 59.12MB | https://tianchi-competition.oss-cn-hangzhou.al... |
2 | test_a_sample_submit.csv | 测试集A榜提交样例 | 97.66KB | https://tianchi-competition.oss-cn-hangzhou.al... |
data.link.tolist()
['https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/train_set.csv.zip',
'https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/test_a.csv.zip',
'https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/test_a_sample_submit.csv']
下载并解压数据集
train = pd.read_csv('train_set.csv',sep='\t')
test = pd.read_csv('test_a.csv',sep='\t')
sample = pd.read_csv('test_a_sample_submit.csv',sep='\t')
train.head()
label | text | |
---|---|---|
0 | 2 | 2967 6758 339 2021 1854 3731 4109 3792 4149 15... |
1 | 11 | 4464 486 6352 5619 2465 4802 1452 3137 5778 54... |
2 | 3 | 7346 4068 5074 3747 5681 6093 1777 2226 7354 6... |
3 | 2 | 7159 948 4866 2109 5520 2490 211 3956 5520 549... |
4 | 3 | 3646 3055 3055 2490 4659 6065 3370 5814 2465 5... |
test.head()
text | |
---|---|
0 | 5399 3117 1070 4321 4568 2621 5466 3772 4516 2... |
1 | 2491 4109 1757 7539 648 3695 3038 4490 23 7019... |
2 | 2673 5076 6835 2835 5948 5677 3247 4124 2465 5... |
3 | 4562 4893 2210 4761 3659 1324 2595 5949 4583 2... |
4 | 4269 7134 2614 1724 4464 1324 3370 3370 2106 2... |
sample.head()
label | |
---|---|
0 | 0 |
1 | 0 |
2 | 0 |
3 | 0 |
4 | 0 |
在数据集中标签的对应的关系如下:{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}
初步观察数据
后续会更加细致地分析数据,先看大概看一下数据分布情况
train['label'].value_counts()
0 38918
1 36945
2 31425
3 22133
4 15016
5 12232
6 9985
7 8841
8 7847
9 5878
10 4920
11 3131
12 1821
13 908
Name: label, dtype: int64
可以看出,数据类别分布不均衡,有可能会影响f1值,需要后续对样本进行处理
%matplotlib inline
def split(x):
return x.split()
length = train['text'].map(split).map(len)
length.describe()
count 200000.000000
mean 907.207110
std 996.029036
min 2.000000
25% 374.000000
50% 676.000000
75% 1131.000000
max 57921.000000
Name: text, dtype: float64
length.hist()
文本长度差别比较大,也需要进行处理
评测指标
1
评价标准为类别f1_score
的均值,选手提交结果与实际测试集的类别进行对比,结果越大越好。f1取决于准确率和召回率的综合结果。
解题思路
赛题思路分析:赛题本质是一个文本分类问题,需要根据每句的字符进行分类。但赛题给出的数据是匿名化的,不能直接使用中文分词等操作,这个是赛题的难点。
因此本次赛题的难点是需要对匿名字符进行建模,进而完成文本分类的过程。由于文本数据是一种典型的非结构化数据,因此可能涉及到特征提取
和分类模型
两个部分。为了减低参赛难度,我们提供了一些解题思路供大家参考:
- 思路1:TF-IDF + 机器学习分类器
直接使用TF-IDF对文本提取特征,并使用分类器进行分类。在分类器的选择上,可以使用SVM、LR、或者XGBoost。
- 思路2:FastText
FastText是入门款的词向量,利用Facebook提供的FastText工具,可以快速构建出分类器。
- 思路3:WordVec + 深度学习分类器
WordVec是进阶款的词向量,并通过构建深度学习分类完成分类。深度学习分类的网络结构可以选择TextCNN、TextRNN或者BiLSTM。
- 思路4:Bert词向量
Bert是高配款的词向量,具有强大的建模学习能力。