基于 Kashgari 2 的短文本分类: 数据分析和预处理
文本分类是自然语言处理核心任务之一,常见用文本审核、广告过滤、情感分析、语音控制和反黄识别等NLP领域。本文介绍如何获取、分析和预处理数据集,为下一篇做数据准备。
获取数据
相比英文数据集,中文数据集还是比较匮乏。不过好在有不少好心同学们精心整理了现有中文语料,比如 SimmerChan 同学整理的 https://github.com/SimmerChan/corpus。
此次试验我选择了 今日头条中文新闻(短文本)分类数据集,读者们也可以选择别的数据集进行试验测试。
这个数据集下载 toutiao_cat_data.txt.zip
文件到本地,然后解压即可。
该数据集来自今日头条客户端,数据格式如下。其中 _!_
为分隔符,字段分别为新闻ID、分类 Code、分类名称和新闻标题和新闻关键词。
1 | 6552431613437805063_!_102_!_news_entertainment_!_谢娜为李浩菲澄清网络谣言,之后她的两个行为给自己加分_!_佟丽娅,网络谣言,快乐大本营,李浩菲,谢娜,观众们 |
数据集涵盖了一下 15 个分类
ID | 类别 | Code |
---|---|---|
100 | 故事 | news_story |
101 | 文化 | news_culture |
102 | 娱乐 | news_entertainment |
103 | 体育 | news_sports |
104 | 财经 | news_finance |
106 | 房产 | news_house |
107 | 汽车 | news_car |
108 | 教育 | news_edu |
109 | 科技 | news_tech |
110 | 军事 | news_military |
112 | 旅游 | news_travel |
113 | 国际 | news_world |
114 | 股票 | stock |
115 | 农业 | news_agriculture |
116 | 游戏 | news_game |
安装依赖
数据分析和预处理过程我们需要用到一下几个框架:
- jieba:最常用的中文分词框架。
- wordcloud:词云框架,通过可视化词云来分析关键词。
- sklearn:经典机器学习库,提供了大量用于数据挖掘和分析的工具。
用下面的命令安装这三个依赖:
1 | pip install jieba |
读取数据集
数据每一行为一个样本,每个样本使用 _!_
隔符,字段分别为新闻ID、分类 Code、分类名称和新闻标题和新闻关键词。本实验我们只关注新闻标题和分类 code。使用以下代码读取样本:
1 | from typing import Dict |
此时输出样本如下:
1 | [ |
由于我们用的是新闻标题,标题中的标点符号也是有一定的语义含义,所以此处预处理比较简单,只做分词即可。如果原始文本里面包含不必要的标点符号等,那么预处理的时候也可以选择去掉特定的标点符号。
1 | def pre_process_sample(sample: Dict) -> Dict: |
1 | [ |
分析数据
我们使用词云(WordCloud)分析高频词语,词云可以直观看一下文本关键词信息。
如果让人来进行分类,扫一眼词云就可以在很短时间内做出分类判断,比阅读原始文本要快的多,其原理就是利用了文本中的高频词信息,
频率高的词(去除停用词之后)比较能代表文本的主旨信息,其实后面的分类过程大概就是这个思路。
WordCloud 默认不显示中文字体,会显示成方块,可以在网上下载中文字体文件,比如 simhei.ttf
,放在当前目录下即可。
1 | from wordcloud import WordCloud |
教育、经济、体育和科技类新闻标题关键词构建的词云如下,可以看到非常的直观。这里停用词只用了 wordcloud 框架提供的部分,如果自定义停用词,去掉类似怎么,如何之类的停用词,效果会更好。
准备训练、评估、测试数据集
训练模型我们需要用到训练,评估和测试数据集。sklearn 提供的 train_test_split 可以很方便为我们实现这个功能。
1 | from sklearn.model_selection import train_test_split |
此时数据准备工作结束,训练样本共 267882 条,评估样本 57403 条,测试样本 57403 条。