中文短文本分类实例一-TextClassification概述综述(一般步骤流程、概论和归类、调参和tricks)

融宏伟
2023-12-01

一、概述

        中文短文本分类任务(text classification of short or long sentence)是自然语言处理NLP中的一个特别重要的任务,简单来看,生活中常见的新闻分类、情感分类、邮件分类、领域意图分类<接触的最多>、舆情分析、论文分类等,都离不开文本分类;往复杂里说,文本分类任务是词性标注与分词、相似度计算与排序、实体提取与关系抽取、位置计算与阅读理解的前置技术。

        文本分类它是如此重要,我们必须要熟练掌握它。

        你可以看看,我的文本分类项目github地址:https://github.com/yongzhuo/Keras-TextClassification

        是关于keras实现的常见文本分类算法,以embedding类和graph类作为基类,继承它们编写的text-classification工程。

二、一般流程

        无论机器学习,还是深度学习,分类都可以看成以下过程:

               1. 文本数据预处理

               2. 特征工程(文本表示和特征选择)

               3. 算法选择与分类器构建

               4. 模型训练、评价与预测

2.1 文本数据预处理

        在我看来,那句话没有说错,语料数据》算法模型》参数调优,语料无疑是最重要的,一份好的语料是成功训练出好分类器的一半。老生常谈,不同于英文,只有26字母,且词与词之间有空格隔开,中文有包含2000多个常用字在内的20000多简体字,且是连续的没有分词的。中文不愧是这个世界上最独特的语言。

        2.1.1 分词

                对于NLP任务而言,分词无疑是一项关键技术,当然,你要以字级别(char)或者是上Bert,那就当我没说过。

                分词算法大致可以分为四种:

                       基于规则和字符(正向、反向、双向、最小匹配),通常是维护一个字典,利用前缀树(TrieTree),速度很快

                       基于统计的,采用马尔可夫(HMM)、条件随机场(CRF)、最大熵(ME)、互信息与左右熵(新词发现)、词频与词性

                       基于句法的,使用文法呀、语法树呀、依存句法与句子成分、

                       基于深度学习的,多是采用Bi-LSTM + CRF模型,Jiagu项目和各种深度学习分词用的就是这个。

                 使用的话,一般用Jieba就可以了,以前还用过java版比较古老的IKAnalyzer,不过早就不更新了。此外,工作中试过的HanLP、Ansj、Stanford,也都还可以。不久前喧嚣一时的THULAC和pkuseg使用的算法是纯CRF,不过构建了很多特征。

                  Tricks:我一般是先分词,再去除特殊字符、标点符号、空格等的,有可能处理后会加大分错的概率,我会默认原始的语料还是较为准确的,一般情况下你可以考虑这一点。

        2.1.2 通用中文数据预处理

                 大而泛之,就是数据清洗与标准化,与图像处理一样,就是去重-噪声-缺失值老三样。当然也有NLP文本特殊的地方。爬虫处理的数据,包含HTML、XML、URL等无用信息,可以处理掉,通常只保留中文、字母、数字和一些特殊字符就可以了。

                  特殊的数字、字母、符号与实体,比如说银行卡账号、QQ号、电子邮箱号、手机电话、车牌号、昵称用户名等,可以用统一字符替代,比如说_digit,_user,_phone替代。当然,人名、各种实体与关系也可以这样子替换,比如影视剧什么的。

                  中文标准化与变形词,全角半角转化、数字转化、时间转化、大小写钱转化、政治黄色脏话等敏感词识别转化,当然还有最最重要的简繁转化、大写小写转化。

                  标点等停用词、无用词,中文处理一般都会去掉标点符号的,无用词也可以考虑去掉,比如说语气词呀(呀、啊),礼貌用语呀(谢谢),客气话呀(请)什么的,当然如果是做情感分类就不能去掉了。高频词没有表示独特的特征,可以去掉;低频词特征干扰大,也可以考虑去掉,就像"去掉头,去掉尾,噶噶蹦!"

                  数据可以保存在csv文件,pandas可以直接读取。

                  部分实现可以看我的工程代码,gitihub地址:https://github.com/yongzhuo

                 

2.2  特征工程

       对于包括文本分类在内的机器学习任务而言,特征工程无疑是非常关键的一步,对于算法来说。好的构造特征,对于分类效果的提升,那也是相当大的。NLP中文文本分类任务中,特征工程主要是指文本表示和特征选择。

        特征工程代码可以参考我的github项目:https://github.com/yongzhuo/nlp_xiaojiang/tree/master/FeatureProject

        对话系统中问答语料特征的构建,主要是问题和问题(q-q)、问题和回答(q-a)的。

        2.2.1 文本表示

               要想通过计算机训练模型,则必须要将文本转化为计算机能够识别的语言,也就是数字。

               文本表示主要方法包括独热编码(one-hot)、词袋模型(bow)、词频与重要性(TF、IDF、TD-IDF)、嵌入(embedding,词、字、句子,突出的有VSM、word2vec、glove、bert等)、神经网络提取(NN,例如CNN、LSTM、Attention,这个和embedding比较相像)、主题与摘要(LDA、LSI)。

               其他的,常见的方案,可也有诸如n-gran,bm25,关键词,公共字串,字符个数,文本长度,拼音,拆字与笔画,图片,哈希特征,文本的头尾和中间,词性,情感正负等等,不一而足。

               通过这些,可以组合构建向量特征。

        2.2.2 特征选择

               在这之前,特征也可以组合新特征,文本长度与分桶,不仅能够新增特征,还能够提高模型训练预测速度。

               大而泛之,简单可以想到的,特征选择可以看成:过滤(特征的相关系数,比如说LR)、包裹(前向后向双向或者递归搜索,比如说依次增、减特征)、嵌入(需要降系数来降过拟合的特征不是好特征,xgboost),方法一般可以是那些信息增益(IF)、文档频率(TF)、卡方校验(CHI)、信息增益(IG)、互信息(MI)等。

               一般看来,xgboost,lgb,lr来选择就足够啦。

               对深度学习来说,embedding和模型就一步完成了文本表示和特征选择这一步啦。

 

2.3  算法

       分类器的构建重点在于算法的选择,机器学习,sklearn也大致够用啦。至于深度学习,那还用得着考虑吗,这年头,人工智能时代,不上深度学习算法你都不好意思出门。

        2.3.1  机器学习算法(ML)

                主要就是线性回归(文本分类多用逻辑回归,LR),支持向量机(SVM),朴素贝叶斯(NB),最近邻(KNN),聚类(K-means)、决策树(tree,bagging,boosting、GBDT、RF、Adaboost、Xgboost、lgb)等。

                 短文本分类中,用得比较多的便是LR、SVM和决策树啦。不过即便是线性的SVM,速度也很慢的,我一般不用。机器学习的算法,多是采用TF-IDF特征,做一个基线模型还可以。

       2.3.2 深度学习算法(DL)

                 深度学习算法那就多了,如果按照一篇论文算一种,以深度学习现在的发展速度,那github估计是怎么也写不完的。不过,尽管如此,按照分类算法的特征与原理,深度学习也可以分成几大类的。

      具体实现可以参考我的github项目:https://github.com/yongzhuo/Keras-TextClassification/tree/master/keras_textclassification 

                 大致分类:

                         *线性的: FastText、MLP

                         *卷积的: TextCNN、charCNN、DCNN、DPCNN、Capsule

                         *上下文: TextRNN、Bi-LSTM、RCNN、CRNN

                         *注意力: Attention、HAN、Transformer

                         *记忆力: EntNet、MDN

                         *预训练: ULMFiT、Elmo、GPT-2、BERT、Xlnet

                         *少样本: few-shot

        2.3.2 归类

                 按照生成式模型和判别式模型 ,

                         生成式模型:高斯混合模型(GMM)、马尔可夫(HMM)、朴素贝叶斯(NB)、生成对抗网络(GAN)中的生成模型G、主题模型(LDA)

                         判别式模型:   线性回归(文本分类多用逻辑回归,LR),支持向量机(SVM),最近邻(KNN),条件随机场(CRF)、Boosting、一般人工神经网络

 

三、评价指标、调参和Tricks

     

        3.1  评价指标:

                1. 一般用acc、loss,recall和f1也要重视,最好是几个一起判断;

                2. 早停、样本shuffle、embedding和变量初始化也要重视;

                3. 非均衡样本过采样和欠采样,同义句生成,可以采用每个类的平均F1、Acc或者Recall平均,而不是所有数据一起;

                4. 多标签分类、或者多类别分类,可以调节类别概率的阀值,提高召回率。

      3.2  调参

                1. 主要还是按照论文的参数来吧,加个网格搜索,也差不多够了;

                2. 参数从大到小,由粗到细,最好write图,tensorboard用起来,混淆矩阵也可以;

                3.一定要重视数据,错误分类的样本打出来,统计下label,这很重要,这很重要,这很重要,重要的事说三遍;

        3.3  Tricks:

                1. 工作中分类用CNN多于RNN,比较大样本RNN还是太慢了,当然有强劲的gpu/tpu另说,Attention也可以;

                2. 正则化、dropout、BN、分桶还是用上吧;

                3. 字的embed_size要比词小,词的维度100-300,字15-65我觉得也够了,太大没用也没有必要;

 

希望对你有所帮助

 

 

 

 

 类似资料: