背景介绍
本次学习任务是基于天池的nlp入门比赛–零基础入门之NLP文本新闻分类,该赛题以当下非常火热的自然语言处理为背景,要求选手使用模型对各种新闻文本语料进行分类,以提高分类精度为目标。
数据下载和分析
数据下载地址为 数据下载链接,该数据下载需要先报名对应的比赛,如下图所示点击报名完成相应报名步骤即可。
从官网上下载得到的数据只是提供了压缩包的下载地址,需要自行去下载然后解压,最终会得到这样的几个数据,包括训练集和测试集。
其中,训练集包括两列数据,一列是文本对应的分类标签,标签对应类别为:
{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}
另一列则是文本内容经加密之后得到的字符串/数字串(此处加密是防止选手人工标记测试集),通过模型在训练集上学习之后,再去预测测试集的文本标签。评价标准为类别f1_score的均值,选手提交结果与实际测试集的类别进行对比,结果越大越好。
f
1
s
c
o
r
e
=
2
∗
(
p
r
e
c
i
s
i
o
n
∗
r
e
c
a
l
l
)
(
p
r
e
c
i
s
i
o
n
+
r
e
c
a
l
l
)
\ f1score= 2*\frac{(precision∗recall)}{(precision+recall)}
f1score=2∗(precision+recall)(precision∗recall)
f1_score的简单代码实现如下:
from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
f1_score(y_true, y_pred, average='macro');
数据读取
在python中调用代码,简单看一下数据格式。
import pandas as pd
import sys
import csv
csv.field_size_limit(500 * 1024 * 1024)#避免因数据格式受限而无法读取数据
train_df = pd.read_csv('C:/Users/Administrator/Desktop/wenbenfenlei/train_set.csv', sep='\t', nrows=200596)
train_df.head();
前五行数据读取结果:
label | text |
---|---|
2 | 2967 6758 339 2021 1854 3731 4109 3792 4149 15… |
11 | 4464 486 6352 5619 2465 4802 1452 3137 5778 54… |
3 | 7346 4068 5074 3747 5681 6093 1777 2226 7354 6… |
3 | 7159 948 4866 2109 5520 2490 211 3956 5520 549… |
2 | 3646 3055 3055 2490 4659 6065 3370 5814 2465 5… |
基本的数据描述:
%pylab inline
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe());
Populating the interactive namespace from numpy and matplotlib
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_len, dtype: float64
从该结果中可以看出,这次比赛给出的数据集平均字符长度为907,最短的文本只有2个字符,最长的达到5万多字符。
再将文本长度进行可视化就更一目了然了:
可见绝大部分文本长度都分布在2000以内。
解题思路
简单直接款1.TF-IDF+机器学习分类器(SVM\LR\XGBoost)
入门版2.FastText(入门款的词向量工具)
进阶版3.WordVec+深度学习分类器
高配版4.Bert词向量