天池新闻文本分类EDA_datawihle组队学习
首先读取训练集,由于数据量过大,并且文件路径中含有中文,所以这里的解决方法一:
train_df = pd.read_csv('C:/Users/杨浩然/Desktop/nlp_新闻文本分类/train_set.csv', sep='\t', nrows=100,engine='python')
添加nrows限制读取行数,并且因为PY3调用read_csv时默认使用C 作为解析引擎,导致中文路径出错,添加engine可以解决中文路径问题。
针对数据量过大读取初始化错误,同时也可以解决中文路径问题,直接使用open函数读取文件:
train_df=pd.read_csv(open('C:/Users/杨浩然/Desktop/nlp_新闻文本分类/train_set.csv'), sep='\t')
train_df.head(5)查看前5行数据,分为LABEL和匿名好的字符文本集
非结构化数据,没有太多数据统计EDA。首先需要了解每条文本的长度,文本样本由空格分隔符分开,使用以下操作统计:
可以得到20W训练样本中,句子长度均值为907,最长57921,最短2。统计值无法查看句子长度分布,所以做一个分布查看:
可以看到绝大部分句子长度大致在5000以下,为了验证句子长度在5000以下样本,继续画图:
可以更清楚的看到我们的数据分布,很明显的右偏分布,并且大部分其实长度为3000以下。
接下来查看我们的样本类别分布:
在数据集中标签的对应的关系如下:{'科技': 0, '股票': 1, '体育': 2, '娱乐': 3, '时政': 4, '社会': 5, '教育': 6, '财经': 7, '家居': 8, '游戏': 9, '房产': 10, '时尚': 11, '**': 12, '星座': 13}
可以看到我们的样本分布有的是及其不均匀的,当建模的时候可以寻找各种解决样本不均衡的模型算法,或者数据解决方法,结构化数据解决样本不均衡的方法按我的经验有:上下采样、Border-line SMOTE、手工添加数据、数据增强、XGB 样本均衡参数,都可以尝试的方法。
接下来是字符分布的探索统计,感觉有点类似TF-IDF的统计方式(本机计算资源不足,调整nrows=100,暂时使用100个样本统计下列词语):
总词量2405,出现次数最多得3750编号词,3702词,最少的5034,出现1次。
统计每行中出现次数较多的字符,有有可能为标点符号等,查看排序前10编号的字符,
all_lines为每行去重后,将每行样本以空格符连接的字符串,使用counter函数返回包含每个字符与统计量的counter对象类
sorted(iterable[,cmp[,key[,reverse]]])为函数原型,reverse=True降序,参数Counter.items()返回的是以列表返回的可遍历的值(for k,v 循环遍历),key为进行比较的元素,reverse=True降序,lambda d:int(d[1])代表使用word_count中第二个元素值为比较元素进行降序排序,最后得到一个列表中,按每个元组第二个元素排序的数组,也就是按字符统计个数从大到小排序的数组。这样就可以选择前10个出现次数较多的字符进行分析。前三个为在100个样本中出现了99次,99次,96次的字符,所以很有可能为标点符号。
官方提示的结论:
- 赛题中每个新闻包含的字符个数平均为1000个,还有一些新闻字符较长;
- 赛题中新闻类别分布不均匀,科技类新闻样本量接近4w,星座类新闻样本量不到1k;
- 赛题总共包括7000-8000个字符;
-
每个新闻平均字符个数较多,可能需要截断;
-
由于类别不均衡,会严重影响模型的精度;
本章作业
- 假设字符3750,字符900和字符648是句子的标点符号,请分析赛题每篇新闻平均由多少个句子构成?
- 统计每类新闻中出现次数最多的字符 答:1,由于需要进行多个字符来分割字符串,无法使用split,要使用re.split()多个条件分割字符串后取每行长度就得到没篇新闻的句子个数,然后除以总样本量,就得到平均句子长度,具体实现如下:
这里只使用了100条样本所以直接求此列的sum(),再除以样本量100,得到均值:
此样本量下句子的均值为80.5条。 答:2,统计每类新闻中出现次数最多的字符,首先需要将每条样本中出现次数最多的字符求出,由于计算资源不够,只使用了100条样本,样本的标签都为2,所以循环只统计了新闻类别为2的出现次数最多的字符,但是只需要更改数据样本量为全量,就可以得到所有分类新闻的出现次数最多的字符。代码如下: