深度学习之文本分类总结-程序员宅基地

技术标签: nlp学习  深度学习  自然语言处理  bert  分类  

一、文本分类概况

文本分类是NLP中的最基础的一个任务,很多场景中都涉及到,比如对话机器人、搜索推荐、情绪识别、内容理解,企业风控,质量检测等方向。在对话机器人中,一般的文本分类任务主要是解决 用户query 的意图,确定相关domain.在确定的 domain中进行 NLU的语义理解,进而下游更多的任务。针对 内容理解 或者风控,质检方向都是针对于用户的query进行理解和意图识别,确定是否是涉黄涉爆,等非法的输入,进而进行控制,由于本人主要是做对话NLU 相关的,具体的其他的场景 不做过多叙述,主要分为以下两种情况:

多分类(Multi-Class)

1.二分类, 如邮件垃圾分类,0-1分类,只有两种情况,也可以使用于据识模型中

2.三分类,情感分类,【正面,中立,负面】,情绪识别

3.多分类,意图识别,domain领域识别,新闻类别识别,财经、体育、娱乐等

以上统称为多分类领域,每一个类别是独立的

多标签分类(Multi-Lable)

1.多领域类别,比如说,帮我打开导航、并播放一首歌曲、此时刻的domain 属于 musicX音乐 、mapU 导航领域

2.文本段落,可能即属于金融领域 也属于政治领域

多标签分类,主要的区别是 每一个类别不是独立的,每一个文本可以有多个标签

区别

1.多分类任务中一条数据只有一个标签,但这个标签可能有多种类别。比如判定某个人的性别,只能归类为"男性"、"女性"其中一个。再比如判断一个文本的情感只能归类为"正面"、"中面"或者"负面"其中一个。

2.多标签分类任务中一条数据可能有多个标签,每个标签可能有两个或者多个类别(一般两个)。例如,一篇新闻可能同时归类为"娱乐"和"运动",也可能只属于"娱乐"或者其它类别。

二、文本分类常见的方法

文本分类主要是分为两种,一种是前几年兴起的 传统的机器学习方案,其次是近几年的深度学习模型(https://github.com/649453932/Chinese-Text-Classification-Pytorch)https://github.com/649453932/Chinese-Text-Classification-Pytorch

传统的机器学习模型(浅层学习模型)

1.以统计模型占主导,如朴素贝叶斯分类(NB), K近邻(KNN),支持向量机(SVM) 、以及树模型结构 XGBoost和LightGBM

上文提到的模型,与早期的基于规则的方法相比,该方法在准确性和稳定性方面具有明显的优势。但是,这些方法仍然需要进行功能设计,这既耗时又昂贵。此外,它们通常会忽略文本数据中的自然顺序结构或上下文信息,这使学习单词的语义信息变得困难

2.浅层学习模型,词袋子模型,tf-idf统计等

浅层学习模型,主要是忽略掉了文本的语法和语序,用特定的一些符号表示一个文本或者段落。

词袋子模型(BOW)用一组无序的单词序列来表达一段文字或者一个文档, 把整个文档集的所有出现的词都丢进袋子里面,然后 无序去重 地排出来(去掉重复的)。对每一个文档,按照词语出现的次数来表示文档

以下例子(来源于网络):

句子1:我/有/一个/苹果

句子2:我/明天/去/一个/地方

句子3:你/到/一个/地方

句子4:我/有/我/最爱的/你

 统计所有的词语,放到一个袋子中,得到10个单词: “我,有,一个,苹果,明天,去,地方,你,到,最爱的“

得到4个句子的特征如下:

  • 句子 1 特征: ( 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 )
  • 句子 2 特征: ( 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 )
  • 句子 3 特征: ( 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 )
  • 句子 4 特征: ( 2 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 )

通过以上方案,亦能得到句子的浅层语义表达,可以进行基本的下游任务,如相似度计算,文本分类等任务

缺点就是:语义表达非常稀疏,容易造成维度灾难 只能表示词语本身 ,无法体现单词语义信息,以及单词之间的关系

TF-IDF模型:

主要是使用词汇统计的词频特征来 作为句子的语义表征,TF表示的(Term frequency,词频) IDF 表示的是(Inverse document frequency ) 逆文档频率 。

TF即词频(Term Frequency),每篇文档中关键词的频率(该文档单词/该文档单词总数),TF体现的是词语在文档内部的重要性,举个例子,有两篇文档 d_{1} 和d_{2},

d1 = (A,B,C,D,A),一共是5个单词,d2 = (B,E,A,B), 一共是4个单词。得到如下的TF计算结果:

 IDF即逆文档频率(Inverse Document Frequency),文档总数/关键词t出现的文档数目,即  IDF= log(\frac{D}{1+D_{i}})          D代表文档的总体数目,分母部分D_{i} 表示的是  包括该词语的文档数目,原始公式是分母没有 +1 的,这里是采用了拉普拉斯平滑,避免了有部分新的词没有在语料库中出现而导致分母为零的情况出现。IDF体现的是 词语在文档中的重要性,如果某个词语在 文档中出现的次数越少,表示的  idf 数值越大,越重要。得到如下的,IDF 数值:

 d1 文档的向量化表示(最终的结果是 tf * idf):

后面再通过向量的余弦相似度计算,得到语义的相似度

深度学习模型时代(文本分类模型)

1.Fasttext 模型

论文:https://arxiv.org/abs/1607.01759
代码:https://github.com/facebookresearch/fastText

fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,包含文本分类和词向量训练两个功能。把输入转化为词向量,取平均,再经过线性分类器得到类别。输入的词向量可以是预先训练好的,也可以随机初始化,跟着分类任务一起训练。最终的embedding 也是分类的产物。

 上图为模型结构图,目前多数人也在使用 fastText模型,主要是由于:

 1.模型本身比较简单,能快速的产生baseLine

 2.采用char-level(字符级别)的 n-gram作为附加特征,这里举个例子,apple 这个单词,bigram 是:[ap,pp,pl,le]  ,trigram结果是[app,ppl,ple],最终的模型输入,是把apple转化为embedding 和  bigram 、trigram也转成embedding , 最终拼接一起 作为输入。

2.TextCNN 模型

TextCNN是Yoon Kim小哥在2014年提出的模型,相关论文和仓库如下:

 论文:https://arxiv.org/abs/1408.5882
 代码:https://github.com/yoonkim/CNN_sentence

TextCNN 使用的是一维的卷积操作,图像中多数使用的是二维卷积.参考代码如下:

CNN网络结构不清楚的,可以看另一篇Blog,其中有详细的解释CNN网络结构。

大致的步骤如下

1.输入query 经过embedding 得到,[batch_size,seq_len,embedding_dim]

2.设置卷积核的大小为 [filter_size * embedding_dim],filter_size一般为滑动窗口的大小(先不理解没关系),假设一共有N个卷积核,得到N个长度为,seq_len - filter_size + 1 大小的一维feature_map,比如句子长度为10,filter_size的长度为2,最终得到的feature_map的长度为10-2+1= 9

3. feature_map进行max-pooling 得到N个 1*1的数值,最终为N维向量,作为句子的表达,最终得到 [batch_size,N]的结果,如果 batch_size = 64, N = 256 ,那么最终得到的向量为[64,256]

4.最终结果 经过 全连接网络,线性变化,最后进行softmax分类

相关解释

卷积核大小为2的时候,一次处理2-gram,也就是2个单词,卷积核大小为3-gram,一次处理三个大小的单词。 所以卷积核在对文本进行卷积的操作,更像是对在提取文本在n-gram上的特征。

取不同卷积核大小进行卷积操作的原因,可以理解为提取这个句子中多个维度不同的信息,使得特征更加的丰富。所以上文中使用了 不同filter_size  的 卷积层 进行 conv1,conv2,conv3来进行提取特征

这个其中有些需要注意的优化的点,可以参考以下博客(一个大神写的):

https://mp.weixin.qq.com/s?__biz=MzAxMTk4NDkwNw==&mid=2247485854&idx=1&sn=040d51b0424bdee66f96d63d4ecfbe7e&chksm=9bb980faacce09ec069afa79c903b1e3a5c0d3679c41092e16b2fdd6949aa059883474d0c2af&token=793481651&lang=zh_CN&scene=21#wechat_redirect

CNN模型主要是 基于上下文token的编码,然后pooling出句子再进行分类,池化时候,max-pooling表现效果最好,文本分类颗粒度比较高,只需要关注部分的关键词即可

3. Rnn+ Attention 模型

论文:https://www.aclweb.org/anthology/P16-2034.pdf
代码:https://github.com/649453932/Chinese-Text-Classification-Pytorch

RNN 模型现在主流的都是LSTM模型、GRU类型的,针对颗粒度比较细的语义表征,需要使用attention进行

 H表示的是LSTM模型输出的 hidden信息,其中 w是context vector,随机初始化并随着训练更新。最后得到句子表示r ,再进行分类。

attention 的作用 主要是 寻找句子中,对句子含义最重要,贡献最大的词语找出来

 

 4. Bert模型

  1. 不同的预训练模型,比如ELECTRA、RoBERT、WWM、ALBERT

  2. 除了 [CLS] 外还可以用 avg、max 池化做句表示,也可以各种组合起来

  3. 在领域数据上增量预训练,结合多任务的预训练

  4. Boosting的思想,使用集成蒸馏,训多个大模型集成起来后蒸馏到一个,理论上会有一定的提升(涉及到知识蒸馏)

  5. 先用多任务训,再迁移到自己的任务

三、文本分类模型实际中遇到的问题(Q&A)

1.模型的选择问题

  • 短文本,可以尝试下 TextCNN 模型,fastText模型,作为一个基线baseLine的效果
  • 长文本,可以尝试使用RNN 模型,如BiLSTM模型、GRU模型,后接上一个attention注意力机制

无脑使用Bert模型  但是,要是模型上线 还是需要考虑下模型的推理性能,使用模型的知识蒸馏,或者使用多个大模型的集成,再去蒸馏到一个小模型

2.样本类别不均衡问题   

    样本不均衡问题,对于Nlp任务来说,基本上都是老生常谈的问题,不管是在分类还是NER中经常会出现,针对这些问题的解决办法,网上也是一大堆,知乎博客,到处都是,这里只是做一个简单的整理吧。这里提一点,样本数量不均衡的本质,还是样本难易程度不一样,本质上还是一个 hard example的问题 。通常是两种方案,一个是样本数据上修改(重采样),另一个是train的时候 Loss部分的修改(重加权)

  • 重采样
    • 欠采样,去掉一些case
    • 过采样,可能会导致一些过拟合现象
    • 数据增强非常常用的方案,较为常见的方法为,EDA(增加,删除,同义词替换)、回译、Masked LM(借鉴预训练语言模型(如BERT)中的自编码语言模型,可以启发式地Mask词汇并进行预测替换)、句法交换、SIMBERT 等预训练模型生成相似度句子,等等
  • 重加权,重加权就是改变分类loss。相较于重采样,重加权loss更加灵活和方便。其常用方法
    • loss类别加权,通常根据类别数量进行加权,加权系数\alpha与类别数量成反比  
    • Focal Loss, 上述loss类别加权主要关注正负样本数量的不平衡,并没有关注难易不平衡。Focal Loss主要关注难易样本的不平衡问题,可根据对高置信度(p)样本进行降权 
      loss类别加权
                                     
    focal loss

3.数据相关问题

  • 任务定义:先和产品定义好场景和分类任务,初略看看数据,是否有些歧义的数据,挑选出来找产品定义好,尽量规避那些歧义的定义说法,不管是去掉该类说法,还是说统一规定为某一个分类label ,总之人都区分不了的问题,别想着让模型去解决
  • 数据清洗
    • 标注错误问题,模型测试集错误的case,拿出来,规则筛选一遍,同时检查下训练集中的 case,是否有case标注错误的例子,就是训练集中是否存在同样类似的case,标注存在不一致性。
    • 去掉文本强pattern, 很多对文本无意义,出现频次较高的pattern去掉,如,对一段文本进行 意图识别,属于“财经、体育、政治”等Label,文本中出现大量的 xx报道说法,对于文本无意义的说法。
  • 大量无标注数据使用(挖掘无标注数据的价值,利用自监督和半监督学习)
    • 自监督学习,目前火热的预训练模型(Pre-model) 充分利用无标注数据,展现强大能力,进行任务级别的预训练,如,设计分类任务时候,我们在预训练时候 ,MLM的loss 可以和分类的loss一起 进行多任务学习
    • 半监督学习,使用baseLine模型 学习去预测 无标注数据,然后利用数据蒸馏知识生成大量带标签的 数据

4.分类的损失函数选择

        

  •  sigmod分类
    • 使用于二分类,类似于常用的0、1分类,Torch版本 是 BCELoss()函数
  • softmax分类 
    • lable标签的多分类,torch版本使用的是 nn.CrossEntropyLoss()函数  

   由上图所示,对于多分类的任务,可以定义为,多个二分类,如N分类的任务,我们可以定义N个 sigmoid二分类。优点

        1.每个分类domain 单独维护不同的fc解码层,可以后续支持多意图的输出,解码空间相对于之前的softmax 扩大

        2.新分类domain增加,维护成本较小,只需要更新 fc层就可以,减少对其他的domain的干扰

        3.实际上,每一个domain的fc层,就是一个据识模型,后续可以修改训练策略,灵活的对定义的domain进行据识                                                        

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lq_fly_pig/article/details/123648093

智能推荐

2022黑龙江最新建筑八大员(材料员)模拟考试试题及答案_料账的试题-程序员宅基地

文章浏览阅读529次。百分百题库提供建筑八大员(材料员)考试试题、建筑八大员(材料员)考试预测题、建筑八大员(材料员)考试真题、建筑八大员(材料员)证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。310项目经理部应编制机械设备使用计划并报()审批。A监理单位B企业C建设单位D租赁单位答案:B311对技术开发、新技术和新工艺应用等情况进行的分析和评价属于()。A人力资源管理考核B材料管理考核C机械设备管理考核D技术管理考核答案:D312建筑垃圾和渣土._料账的试题

chatgpt赋能python:Python自动打开浏览器的技巧-程序员宅基地

文章浏览阅读614次。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。AI职场汇报智能办公文案写作效率提升教程 专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。_python自动打开浏览器

Linux中安装JDK-RPM_linux 安装jdk rpm-程序员宅基地

文章浏览阅读545次。Linux中安装JDK-RPM方式_linux 安装jdk rpm

net高校志愿者管理系统-73371,计算机毕业设计(上万套实战教程,赠送源码)-程序员宅基地

文章浏览阅读25次。免费领取项目源码,请关注赞收藏并私信博主,谢谢-高校志愿者管理系统主要功能模块包括页、个人资料(个人信息。修改密码)、公共管理(轮播图、系统公告)、用户管理(管理员、志愿用户)、信息管理(志愿资讯、资讯分类)、活动分类、志愿活动、报名信息、活动心得、留言反馈,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取SQL Server 作为后台数据的主要存储单元,采用Asp.Net技术进行业务系统的编码及其开发,实现了本系统的全部功能。

小米宣布用鸿蒙了吗,小米OV对于是否采用鸿蒙保持沉默,原因是中国制造需要它们...-程序员宅基地

文章浏览阅读122次。原标题:小米OV对于是否采用鸿蒙保持沉默,原因是中国制造需要它们目前华为已开始对鸿蒙系统大规模宣传,不过中国手机四强中的另外三家小米、OPPO、vivo对于是否采用鸿蒙系统保持沉默,甚至OPPO还因此而闹出了一些风波,对此柏铭科技认为这是因为中国制造当下需要小米OV几家继续将手机出口至海外市场。 2020年中国制造支持中国经济渡过了艰难的一年,这一年中国进出口贸易额保持稳步增长的势头,成为全球唯一..._小米宣布用鸿蒙系统

Kafka Eagle_kafka eagle git-程序员宅基地

文章浏览阅读1.3k次。1.Kafka Eagle实现kafka消息监控的代码细节是什么?2.Kafka owner的组成规则是什么?3.怎样使用SQL进行kafka数据预览?4.Kafka Eagle是否支持多集群监控?1.概述在《Kafka 消息监控 - Kafka Eagle》一文中,简单的介绍了 Kafka Eagle这款监控工具的作用,截图预览,以及使用详情。今天_kafka eagle git

随便推点

Eva.js是什么(互动小游戏开发)-程序员宅基地

文章浏览阅读1.1k次,点赞29次,收藏19次。Eva.js 是一个专注于开发互动游戏项目的前端游戏引擎。:Eva.js 提供开箱即用的游戏组件供开发人员立即使用。是的,它简单而优雅!:Eva.js 由高效的运行时和渲染管道 (Pixi.JS) 提供支持,这使得释放设备的全部潜力成为可能。:得益于 ECS(实体-组件-系统)架构,你可以通过高度可定制的 API 扩展您的需求。唯一的限制是你的想象力!_eva.js

OC学习笔记-Objective-C概述和特点_objective-c特点及应用领域-程序员宅基地

文章浏览阅读1k次。Objective-C概述Objective-C是一种面向对象的计算机语言,1980年代初布莱德.考斯特在其公司Stepstone发明Objective-C,该语言是基于SmallTalk-80。1988年NeXT公司发布了OC,他的开发环境和类库叫NEXTSTEP, 1994年NExt与Sun公司发布了标准的NEXTSTEP系统,取名openStep。1996_objective-c特点及应用领域

STM32学习笔记6:TIM基本介绍_stm32 tim寄存器详解-程序员宅基地

文章浏览阅读955次,点赞20次,收藏16次。TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在 72MHz 计数时钟下可以实现最大 59.65s 的定时,59.65s65536×65536×172MHz59.65s65536×65536×721​MHz不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。_stm32 tim寄存器详解

前端基础语言HTML、CSS 和 JavaScript 学习指南_艾编程学习资料-程序员宅基地

文章浏览阅读1.5k次。对于任何有兴趣学习前端 Web 开发的人来说,了解 HTML、CSS 和JavaScript 之间的区别至关重要。这三种前端语言都是您访问过的每个网站的用户界面构建块。而且,虽然每种语言都有不同的功能重点,但它们都可以共同创建令人兴奋的交互式网站,让用户保持参与。因此,您会发现学习所有三种语言都很重要。如果您有兴趣从事前端开发工作,可以通过多种方式学习这些语言——在艾编程就可以参与到学习当中来。在本文中,我们将回顾每种语言的特征、它们如何协同工作以及您可以在哪里学习它们。HTML vs C._艾编程学习资料

三维重构(10):PCL点云配准_局部点云与全局点云配准-程序员宅基地

文章浏览阅读2.8k次。点云配准主要针对点云的:不完整、旋转错位、平移错位。因此要得到完整点云就需要对局部点云进行配准。为了得到被测物体的完整数据模型,需要确定一个合适的坐标系变换,将从各个视角得到的点集合并到一个统一的坐标系下形成一个完整的数据点云,然后就可以方便地进行可视化,这就是点云数据的配准。点云配准技术通过计算机技术和统计学规律,通过计算机计算两个点云之间的错位,也就是把在不同的坐标系下的得到的点云进行坐标变..._局部点云与全局点云配准

python零基础学习书-Python零基础到进阶必读的书藉:Python学习手册pdf免费下载-程序员宅基地

文章浏览阅读273次。提取码:0oorGoogle和YouTube由于Python的高可适应性、易于维护以及适合于快速开发而采用它。如果你想要编写高质量、高效的并且易于与其他语言和工具集成的代码,《Python学习手册:第4 版》将帮助你使用Python快速实现这一点,不管你是编程新手还是Python初学者。本书是易于掌握和自学的教程,根据作者Python专家Mark Lutz的著名培训课程编写而成。《Python学习..._零基础学pythonpdf电子书

推荐文章

热门文章

相关标签