一. 获取数据
7z压缩文件解压后得到两个文件:train_set.csv和test_set.csv
train_set.csv:此数据集用于训练模型,每一行对应一篇文章。文章分别在“字”和“词”的级别上做了脱敏处理。共有四列: 第一列是文章的索引(id),第二列是文章正文在“字”级别上的表示,即正文是由一个个字符组成(article);第三列是在“词”级别上的表示,即正文由词和字组成(word_seg);第四列是这篇文章的标注(class)。需要注意的是每个“字”或"词"都有且仅有一个数与其对应,且二者的编号是独立的!
test_set.csv:此数据用于测试。数据格式同train_set.csv,但不包含class。 注:test_set与train_test中文章id的编号是独立的。
二.数据读取
import pandas as pd
#数据预处理,从硬盘上读取数据 trainData = pd.read_csv('./new_data/train_set.csv') print('trainData.shape = ', trainData.shape) #训练集数据大小(102277,4)
#观察数据的前10行
print(trainData[:10])
id article \
0 0 7368 1252069 365865 755561 1044285 129532 1053...
1 1 581131 165432 7368 957317 1197553 570900 33659...
2 2 7368 87936 40494 490286 856005 641588 145611 1...
3 3 299237 760651 299237 887082 159592 556634 7489...
4 4 7368 7368 7368 865510 7368 396966 995243 37685...
5 5 7368 1160791 299237 1238054 569999 1044285 117...
6 6 893673 7368 836872 674898 231468 856005 105964...
7 7 1122654 125310 907560 1172361 979583 983951 12...
8 8 793790 599682 1223643 1030656 569999 178976 45...
9 9 7368 1120647 360394 79747 1140778 472252 7368 ...
word_seg class
0 816903 597526 520477 1179558 1033823 758724 63... 14
1 90540 816903 441039 816903 569138 816903 10343... 3
2 816903 1012629 957974 1033823 328210 947200 65... 12
3 563568 1239563 680125 780219 782805 1033823 19... 13
4 816903 816903 816903 139132 816903 312320 1103... 12
5 816903 669476 21577 520477 1004165 4184 616471... 13
6 277781 816903 1098157 986174 1033823 780491 10... 1
7 289186 640942 363388 585102 261174 1217680 520... 10
8 1257015 966562 1054308 599826 811205 520477 28... 10
9 816903 266069 1226448 1276450 816903 769051 12... 19
testData = pd.read_csv('./new_data/test_set.csv')
print('testData.shape = ', testData.shape) # 测试集数据大小(102277,3)
#观察数据整体信息,判断数据的完整性
trainData.info()
testData.info()
RangeIndex: 102277 entries, 0 to 102276
Data columns (total 4 columns):
id 102277 non-null int64
article 102277 non-null object
word_seg 102277 non-null object
class 102277 non-null int64
dtypes: int64(2), object(2)
memory usage: 3.1+ MB
RangeIndex: 102277 entries, 0 to 102276
Data columns (total 3 columns):
id 102277 non-null int64
article 102277 non-null object
word_seg 102277 non-null object
dtypes: int64(1), object(2)
memory usage: 2.3+ MB
#观察训练样本中数据分布情况及各个类别对应的样本数量,判断是否存在样本不均衡的问题
print(trainData['class'].describe()) print(trainData['class'].value_counts())
count 102277.000000
mean 10.262356
std 5.370785
min 1.000000
25% 6.000000
50% 10.000000
75% 15.000000
max 19.000000
Name: class, dtype: float64
3 8313
13 7907
9 7675
15 7511
18 7066
8 6972
6 6888
14 6740
19 5524
1 5375
12 5326
10 4963
4 3824
11 3571
16 3220
17 3094
7 3038
2 2901
5 2369
Name: class, dtype: int64
通过上面的数据能够发现数据分布比较均匀,同时各个类别对应的样本数量较大,类别3与类别5对应的样本数量差距也确实很大,呈现出一定的不均衡性
3. 数据拆分
文本识别过程,如果训练过程是用文本的每个“字”作为输入数据,首先效率会很低,其次准确率会较低,因为根本无法体现出上下文的联系,这样的话就要把正文里的”词“都分出来,同时每个词对应”词典“里的一个数,即把单词数字化,这个过程也叫脱敏。需要注意分词的效果对模型和结果影响很大,幸运的是“word_seg”对应的数据就是已经分词的,可以直接拿来使用。
X_train, X_test, y_train, y_test = train_test_split(trainData[['word_seg']], trainData['class'], test_size=0.3, random_state=2019) print(X_train[:10]) print(X_train.shape)