本节大纲
- 文本分类任务
- 通用的文本分类Pipeline
博客目标:通过文本分类任务弄清楚对于文本数据的输入和输出、学习文本预处理的方法
本文代码Gitee:
1.文本分类任务
在NLP领域中,文本分类是常见的任务之一,它主要将一个文本归结为某个特定的标签,以为CCF互联网新闻情感分析比赛为例子,它要求对所给文本数据集进行精准的情感极性划分,情感极性分为正面、中立、负面(0、1、2)三种。
'''
该比赛label和train是分开的所以我用pandas合并了两个csv,并忽略了空值
互联网情感分析测试集文件.csv的生成具体代码如下:
# d1 = pd.read_csv("./contentdata/Train_DataSet.csv")
# d2 = pd.read_csv("./contentdata/Train_DataSet_Label.csv")
# d3 = pd.merge(d1,d2,how='left',on="id")
# d3.dropna(inplace=True)
# d3.label = d3.label.astype("int64")
# d3.to_csv("./contentdata/互联网情感分析测试集文件.csv",index=False)
'''
import pandas as pd
org_train = pd.read_csv("./contentdata/互联网情感分析测试集文件.csv")
org_train.head()
主要比赛目标是:
- 基于主办方给的训练集(有标签),训练文本分类模型
- 使用训练好的机器学习模型,预测新数据(无标签)的情感极性
2.通用的文本分类Pipline
对于通用的机器学习版(暂不包括深度学习)文本分类Pipline,基本遵循以下程式:
1.数据预处理
- 数据可能比较脏、比如带html标签、不合法数据、需要除去;
- 文本数据可能需要分词,然后再去掉停用词(的、了、等)及标点;
2.特征构造
- 一般情况我们会使用词特征作为文本分类的特征
- 你还可以增加其它人为定义的特征,比如:文本长度、n-gram特征 (将连续的n个词当成一个词特征) 等
3.特征选择
- 用词做特征,不做特征选择,很容易出现上万维、甚至几十万维, 这对计算来说可能是个灾难。即使计算资源充足,那也是对资源的浪费,因为真正对分类起作用的词,可能就只是少部分;
- 经常使用卡方检验、互信息等指标筛选1000~5000维的特征;
4.权重计算
- 使用了词特征,还有一个重要的点就是如何为每个特征赋值,常见的权重有: TF (词频) 、TFIDF (词频°倒排文档频率)
-
5.归一化
在实践中,我们征往需要对连续的特征进行标准化和归-化。即让不同特征的取值范围差别不能过大;
- 标准化和归一化可以:加快模型训练收敛速度、可能会提高模型精度;
- 对于离散的特征,我们需要使用OneHot进行编码;
6.数据集划分
- 我们往往需要使用留出法或者交叉验证法,对数据进行训练集、验证集、测试集的划分;
- 训练集用来训练模型、验证集用来调参、测试集用来评估模型泛化效果;
7.训练分类模型
●特征矩阵已经就绪,接下来,就是要选择一个分类模型,比如SVM或LR或者集成模型RF,然后训练模型;
8.模型评估
●如何衡量模型的好坏呢?我们自然想到精度(acc) :对是对,错是错,对的样本数/整个样本数;
●对于类别分布不怎么均匀的情况,精度并不怎么靠谱,理想的指标是:准确率(准不准)、召回率(全不全)以及F1 (两者的折中) ;
9.参数搜索
- 有了指标后,一个分类模型可能有几十个参数[我们该如何选择某个特定的参数组合,使得此时的模型效果最好呢?
- 可以使用网格搜索,在限定的参数空间内进行调参;也可以使用随机搜索,每次随机选择特定参数组合,然后取n次里面最好的参数组合;
10.保存模型
选择了最优参数的模型,我们需要将其保存下来,以供后续加载使用;
可以用Python的pickle库持久化模型对象;
11.预测
- 你可以加载上一步保存的模型,对新的数据进行离线label预测;
- 你还可以将已加载的模型预测功能封装成HTTP服务,提供即时预测功能;