文本分类(Text Classification ):从数据处理到模型设计需要注意的点

设计一个文本分类模型需要注意什么?

在NLP领域,文本分类是最常见的功能,在实际中更是得到了广泛的应用。那么设计一个文本分类模型需要注意什么?由于自己最近在做文本分类相关的工作,把遇到的一些常见问题做了一个整理和总结。

Step 1: 样本分析

磨刀不误砍柴工,不要急于去训练模型,对自己手头的数据前期做一个分析是很有必要的。巧妇难为无米之炊,数据质量不好,再好的模型也是无济于事。

清洗数据

在实际场景中,数据难免会有杂质,特别是通过间接方式获得label标签而不是人工标注的数据。先抽样一些数据做一个评估,看数据的质量情况,如果发现数据有些问题,看是否可以做一些处理,提升数据的质量,比如一些数据特征缺失,是否可以进行一些填充等。总比满怀期待的用“高大上”的模型训练,发现效果不理想,开始质疑模型或者自己的能力要好的多,而且还可以提升整个工作效率。

分析类别样本量占比

文本分类,很常见的一个问题就是类别样本不平衡,这也是符合实际情况的。有些类别的样本会比较多,有些类别的样本会比较少。所以,先统计分析下样本中的每个类别数据量占比,如果出现很不平衡的情况,看是否可以做一些预处理,平滑下样本,所谓知己知彼百战百胜,如果对自己要训练模型的数据有个很好的了解,那过程中出现什么问题,也不会感觉到迷糊了。那么如果遇到问题分类样本不平衡,可以做一些什么操作?

过采样(over-sampling)和欠采样(under-sampling)

对样本多的类别进行欠采样,对样本少的类别进行过采样,平衡类别之间的样本差距,提高模型对少样本的类别识别准确率。
问题:减少样本多的类别数据,一定程度上减少了样本的丰富性,以及对少样本的类别过采样,会增加模型的过拟合,也有可能识别效果没有达到理想的情况。

数据扩增(data augmentation)

通过对少样本的类别进行一些数据扩增,常见的扩增主要有两种方式:第一种:对原文本进行同义词替换,增加,删除一些词等操作进行数据上的扩增。第二种方式是,用生成式的方式,让模型生成新的文本,从而到达扩增样本的作用,我前一篇的博文easy data augmentation,大概有总结这两个方法。

Step 2:模型选择

模型选择方面,可以根据自己的实际任务进行选择,如果文本分类任务符合如下三个方面特性,则可以针对性地设计模型。

序列特征

如果文本分类任务中,序列特征较明显,比如“牛奶巧克力”和“巧克力牛奶”把两个词"巧克力"和“牛奶”调换一下顺序,则表达的物体完全变了,需要选择对序列特征提取较好的模型,像基础的DNN模型,仅仅是简单的平均或者求和方式获取整个句子的向量,就会丢失位置信息特征,其它几个结构的模型都可以对这种序列特征学习,相对来说,基于RNN结构的模型在序列特征提取这块更加突出。

attention机制

如果分类任务,句子中有较明显的特征词可以代替整个句子意图,可以选择含有attention机制的模型,让模型在学习中可以自动去学习句子重要特征的词,例如,正负情感分类任务中,其中的情感词在对整个句子的正负情绪起到决定的作用。

速度

文本分类,常见的DNN,CNN,RNN,Transformer结构模型都适合做文本分类,基于大量语料pretrain的模型像bert等,效果会更好。可以根据自己的实际任务和需求进行模型选择,如果对速度要求比较高的在线任务,可能就需要折中效果和效率,模型越深,速度相对越慢。所以根据实际情况,兼顾效率和准确率,选择模型。当然也可以做一些模型压缩,工程优化等方案提高预测速度。

Step 3: loss function设计

根据我们的分类实际任务和数据情况,可以选择合理的目标function。一般在文本分类上,用的多的是交叉熵loss,但可以根据自己的实际需求,在loss方面可以进行调整。如果样本类别不均衡,可以适当调整loss,对样本少的类目加大loss权重。如果实际任务中,更看重召回率,那么可以对正样本的loss加大权重等,根据自己实际情况,设计更合理的loss,具体可以参考我前一篇关于loss总结的博文loss 设计

你可能感兴趣的:(NLP)