赛题以匿名处理后的新闻数据为赛题数据,数据集报名后可见并可下载。赛题数据为新闻文本,并按照字符级别进行匿名处理。整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。
赛题数据由以下几个部分构成:训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本。为了预防选手人工标注测试集的情况,将比赛数据的文本按照字符级别进行了匿名处理。
处理后的赛题训练数据如下:
import pandas as pd
import numpy as np
import os
import tensorflow as tf
import math
import tqdm
import json
import zipfile
import matplotlib.pyplot as plt
%matplotlib inline
def zip2file(zip_file_name: str, extract_path: str, members=None, pwd=None):
""" 压缩文件内容提取值指定的文件夹
:param zip_file_name: 待解压的文件 .zip r'D:\Desktop\tst.zip'
:param extract_path: 提取文件保存的目录 r'D:\Desktop\tst\test\test'
:param members: 指定提取的文件,默认全部
:param pwd: 解压文件的密码
:return:
"""
with zipfile.ZipFile(zip_file_name) as zf:
zf.extractall(extract_path, members=members, pwd=pwd)
zip2file('./train_set.csv.zip',None)
zip2file('./test_a.csv.zip',None)
train_df = pd.read_csv('./train_set.csv',sep='\t')
train_df.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... |
train_df.describe()
label | text_len | |
---|---|---|
count | 200000.000000 | 200000.000000 |
mean | 3.210950 | 907.207110 |
std | 3.084955 | 996.029036 |
min | 0.000000 | 2.000000 |
25% | 1.000000 | 374.000000 |
50% | 2.000000 | 676.000000 |
75% | 5.000000 | 1131.000000 |
max | 13.000000 | 57921.000000 |
train_df.info()
RangeIndex: 200000 entries, 0 to 199999
Data columns (total 2 columns):
label 200000 non-null int64
text 200000 non-null object
dtypes: int64(1), object(1)
memory usage: 3.1+ MB
1.赛题数据中,新闻文本长度是多少
2.赛题数据的类别分布式什么样的,哪些类别比较多
3.赛题数据中,字符分布式什么样的
train_df['text_len'] = train_df['text'].apply(lambda x:len(x.split(' ')))
print(train_df['text_len'].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_len, dtype: float64
# 查看数据分布情况
train_df['text_len'].value_counts()
321 220
500 214
452 213
316 211
252 208
333 206
461 205
478 205
254 204
375 203
415 201
495 200
389 200
298 200
308 200
405 199
334 199
347 199
339 198
417 197
545 197
289 196
411 196
385 196
327 196
451 196
395 196
292 196
494 195
348 195
...
9701 1
4900 1
4645 1
12389 1
6112 1
5156 1
5856 1
5540 1
5668 1
10018 1
6052 1
4261 1
4832 1
4704 1
6692 1
6625 1
5731 1
4773 1
10599 1
6497 1
5029 1
4448 1
5157 1
33847 1
3622 1
5797 1
5859 1
5925 1
6053 1
6247 1
Name: text_len, Length: 5633, dtype: int64
_ = plt.hist(train_df['text_len'],bins = 2000,range = (0,10000))
plt.xlabel('text char count')
plt.title('histogram of char count')
train_df['label'].value_counts().plot(kind='bar')
plt.title('news class count')
plt.xlabel('category')
赛题思路分析:赛题本质是一个文本分类问题,需要根据每句的字符进行分类。但赛题给出的数据是匿名化的,不能直接使用中文分词等操作,这个是赛题的难点。
因此本次赛题的难点是需要对匿名字符进行建模,进而完成文本分类的过程。由于文本数据是一种典型的非结构化数据,因此可能涉及到特征提取
和分类模型
两个部分。
WordVec是进阶款的词向量,并通过构建深度学习分类完成分类。深度学习分类的网络结构可以选择TextCNN、TextRNN或者BiLSTM。
Bert是高配款的词向量,具有强大的建模学习能力。
主要是序列模型排列组合从而学习到隐含特征进行最终的分类任务。
Attention机制,将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。参数少,速度快,效果差不多甚至更好于rnn。