本节大纲

  1. 文本分类任务
  2. 通用的文本分类Pipeline

博客目标:通过文本分类任务弄清楚对于文本数据的输入和输出、学习文本预处理的方法
本文代码Gitee:

1.文本分类任务

在NLP领域中,文本分类是常见的任务之一,它主要将一个文本归结为某个特定的标签,以为CCF互联网新闻情感分析比赛为例子,它要求对所给文本数据集进行精准的情感极性划分,情感极性分为正面、中立、负面(0、1、2)三种。

  1. '''
  2. 该比赛label和train是分开的所以我用pandas合并了两个csv,并忽略了空值
  3. 互联网情感分析测试集文件.csv的生成具体代码如下:
  4. # d1 = pd.read_csv("./contentdata/Train_DataSet.csv")
  5. # d2 = pd.read_csv("./contentdata/Train_DataSet_Label.csv")
  6. # d3 = pd.merge(d1,d2,how='left',on="id")
  7. # d3.dropna(inplace=True)
  8. # d3.label = d3.label.astype("int64")
  9. # d3.to_csv("./contentdata/互联网情感分析测试集文件.csv",index=False)
  10. '''
  11. import pandas as pd
  12. org_train = pd.read_csv("./contentdata/互联网情感分析测试集文件.csv")
  13. org_train.head()

主要比赛目标是:

  1. 基于主办方给的训练集(有标签),训练文本分类模型
  2. 使用训练好的机器学习模型,预测新数据(无标签)的情感极性

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服务,提供即时预测功能;