精华内容
下载资源
问答
  • 本篇文章所实现的基于xlnet和归纳网络的小样本文本分类模型主要用于问答系统中的意图识别部分,与传统的文本分类任务相比,该模型能够实现对问答系统现有意图(即功能)的动态增加和配置,并且只需要少量数据即能...

    由于我主要研究问答系统,因此本博客仅更新NLP及问答相关内容,最近创了一个群,如果大家感兴趣可加q群号:376564367
    github:https://github.com/makeplanetoheaven/NlpModel/tree/master/TextClassification/InductionNet/

    背景知识

    本篇文章所实现的基于xlnet和归纳网络的小样本文本分类模型主要用于问答系统中的意图识别部分,与传统的文本分类任务相比,该模型能够实现对问答系统现有意图(即功能)的动态增加和配置,并且只需要少量数据即能实现较好效果。

    xlnet语言模型和用于小样本文本分类的归纳网络的模型的结构及其实现原理可参考如下几篇博客:

    1.XLNet: Generalized Autoregressive Pretraining for Language Understanding翻译

    2.语言模型|基于Transformer(不分段)的xlnet语言模型实现及代码开源

    3.Induction Networks for Few-Shot Text Classification翻译

    基于xlnet和归纳网络的小样本文本分类模型实现

    本模型是参考2019年论文Induction Networks for Few-Shot Text Classification实现,其中以预训练完毕的xlnet语言模型作为编码器模块,来实现问答系统中的意图识别功能。

    需要注意的是,模型在训练时,训练数据中的一个类别数据是存储在同一个.txt文件中,文件名已标签名进行命名;模型在使用时,只需构建一个.json文件并传入调用函数中使用,详细方法见下面所诉,.json文件格式为:

    {
    	"类别1": [
    		"句子1",
    		"句子2",
    		...
    	 ],
    	 ...
    }
    

    在模型实现中,主要包含了一下几个部分内容:

    模型实现代码

    1.编码器模块

    编码器模块主要分为两个部分,其中一个部分通过xlnet语言模型对输入的句子进行特征提取,得到句子中每个单词对应的表示,该部分的实现代码可参见语言模型|基于Transformer(不分段)的xlnet语言模型实现及代码开源。第二部分通过global_attention模块单词向量进行编码从而得到句子级表示,其部分代码实现如下所示:

     # 评分矩阵的缩放
    scale = 1 / (self.d_head ** 0.5)
    
    with tf.name_scope('SenVec_s'):
    	# 评分矩阵计算
    	s_k_h = tf.einsum('ibh,hnd->ibnd', s, self.k_weight) + self.k_bias
    	s_v_h = tf.einsum('ibh,hnd->ibnd', s, self.v_weight)
    
    	s_attn_score = tf.einsum('nd,ibnd->ibn', self.q_h, s_k_h) * scale
    	s_attn_prob = tf.nn.softmax(s_attn_score, 0)
    
    	# 句子向量计算
    	s_attn_vec = tf.einsum('ibn,jbnd->bnd', s_attn_prob, s_v_h)
    	e_s = tf.einsum('bnd,hnd->bh', s_attn_vec, self.o_weight)
    	e_s = tf.layers.dropout(e_s, self.dropout, training=self.is_training)
    

    问题和待匹配数据通过编码器模块后即可分别得到问题表示e_q和数据表示e_s

    2.归纳模块

    归纳模块通过胶囊网络中的非线性压缩变换和动态路由,将同一类别的待匹配数据进行归纳表示,得到用于表示该类别特征的向量,归纳模块的部分代码实现如下:

    with tf.name_scope('Induction'):
    	e_s_hatt = squash(tf.matmul(e_s, self.s_weight) + self.s_bias)
    	e_s_hatt = tf.layers.dropout(e_s_hatt, self.dropout, training=self.is_training)
    
    	# shape trans: [b, d] => [c, b, d]
    	e_s_hatt = tf.reshape(e_s_hatt, shape=[self.c_way, self.k_shot, self.d_input])
    
    	# coupling coefficients define
    	b = tf.zeros(shape=[self.c_way, self.k_shot])
    
    	# dynamic routing
    	for i in range(self.n_route):
    		d = tf.nn.softmax(b)
    		c_hatt = tf.reduce_sum(e_s_hatt * tf.expand_dims(d, -1), axis=1)
    		c = squash(c_hatt)  # [c_way, d_input]
    		b = b + tf.einsum('csd,cd->cs', e_s_hatt, c)
    
    		d = tf.nn.softmax(b)
    		c_hatt = tf.reduce_sum(e_s_hatt * tf.expand_dims(d, -1), axis=1)
    		c = squash(c_hatt)  # [c_way, d_input]
    		c = tf.layers.dropout(c, self.dropout, training=self.is_training)
    

    最终得到得变量c即为表示类别特征的二维矩阵[c_way, d_model]

    3.关系模块

    关系模块通过神经张量网络以及输出维度为1的全连接层对问题e_q和类别矩阵c进行相似度计算,从而得到每一个问题相对于各类别的评分,其代码实现如下:

    with tf.name_scope('Relation'):
    	v = tf.einsum('ijn,cj->icn', self.m_weight, c)
    	v = self.activation[1](tf.einsum('qi,icn->qcn', e_q, v))
    	r = self.ffn(v)  # [q_nums, c_way, 1]
    	logits = tf.reshape(r, [tf.shape(r)[0], tf.shape(r)[1]])
    

    最终得到的logits即为维度为[q_nums, c_way]的二维矩阵。

    4.损失函数

    损失函数部分的实现与论文稍有不同,论文中使用的是多标签分类损失,而代码中使用的是单标签分类损失,其代码实现如下:

    loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)
    loss = tf.reduce_mean(loss)
    

    其中,标签labels是一个维度为[q_nums, 1]的二维矩阵。

    模型调用方式

    模型的调用代码位于目录:./TexCategorization/InductionNet/Debug.py,其调用方式主要分为以下两种。

    1.模型训练

    Induction Net模型的训练通过调用文件中的函数induction_net_model_train实现,该函数以三个参数作为输入:

    (1)data_path,该参数指定训练数据所在目录路径,其中一个文件存储一个类别数据,文件名即为类名;

    (2)lm_save_path,该参数指定xlnet语言模型存储参数所在目录路径;

    (3)save_path,该参数指定归纳网络模型的存储路径;

    2.模型预测

    Induction Net模型的预测通过调用文件中的函数induction_net_model_predict实现,该函数以四个参数作为输入:

    (1)q_list,该参数存储了需要进行分类的问题列表,列表中每一个元素为一个问题字符串;

    (2)label_dict,该参数存储了待匹配的数据字典,字典中每一个key为一个类别,每一个value为一个存储该类别数据的列表;

    (1)lm_save_path,该参数指定xlnet语言模型存储参数所在目录路径;

    (2)save_path,该参数指定归纳网络模型的存储路径;

    模型训练数据

    归纳网络的模型训练数据可使用大部分的文本分类数据进行训练,因此这里不再提供。

    展开全文
  • 点击下面卡片,关注我呀,每天给你送来AI技术干货!来自:南大NLP01—研究背景及动机近些年,元学习已经成为解决小样本问题的主流技术,并且取得不错的成果。然而,由于现有的元学习方法大多数集...

    点击下面卡片关注我呀,每天给你送来AI技术干货!

    来自:南大NLP


    01

    研究背景及动机

    近些年,元学习已经成为解决小样本问题的主流技术,并且取得不错的成果。然而,由于现有的元学习方法大多数集中在图像分类上,而对文本分类上的关注比较少。与图像不同,同一类别中文本具有多种表达方式,这使得当前元学习方法的性能更容易受到每个类别样本数(即shot的数量)的影响。因此,现有的元学习方法很难在小样本文本分类上取得令人满意的结果。

     

    为了解决这个问题,我们在元学习中引入了数据增强,它带来的好处是我们可以产生增强样本以增加新类别的样本数量,并使训练样本多样化。然而,这带来了一个新的挑战,如何在小样本的情况下产生置信度高的样本?

     

    为此,我们提出了一种新颖的数据增强方法,称为Ball generator,图1给出了一个简单的例子。首先,我们计算支持集的最小包围球,并在该球中合成样本。我们认为该球中的样本具有较高的置信度,因为所有支持集样本都包含在该球中,并且它们与球心的最远距离最小。其次,为避免合成样本偏差的影响,我们引入了变换模块,以使合成样本靠近自己的球心,并远离其他球心。此外,我们还提出了一个新的基于数据增强的元学习框架(MEta-Learning with Data Augmentation,MEDA),以联合训练ball generator和meta-learner,使二者协同进化。与普通元学习相比,通过增加新类别的样本数量,有效地提高了meta-learning在小样本情况下的泛化能力。


    图1:Ball generator示例

    02

    MEDA

    MEDA的框架如图2所示。它是两模块组成:一个是ball generator模块,它负责利用支持集生成增强支持集,并得到扩展支持集。另一个模块是meta-learner,它在给定了扩展支持集的条件下计算每个查询实例在类别上的概率分布,表示为。而不同的meta-learner的区别在于如何实现。这里我们选择原型网络和关系网络作为MEDA的meta-learner。

    图2: MEDA

    其中,ball generator是一种特征空间数据增强方法。它的核心思想是在特征空间中进行样本的合成,并对合成的样本进行调整。因此,整个ball generator由两个子模块组成:合成模块和变换模块。

    合成模块利用空间采样算法获得相应的合成样本。具体是将采样空间限制为支持集的最小包围球,这里是球心,是半径。然后,通过如下公式计算得到合成样本:

    这里,

    变换模块,它是为了进一步避免合成样本偏差的影响,在特征空间中对合成的样本进行变换操作,使合成样本更接近自己类别的球心,而远离其他球心。因此,我们将变换操作写成函数,该函数以合成样本作为输入,产生一个增强样本作为输出。

    03

    实验

    本文的实验是在SNIPS和ARSC数据集上进行的。我们将MEDA与三组baseline模型进行了比较。第一组是数据增强的模型;第二组是传统的元学习模型;第三组是最新的小样本文本分类的SOTA模型。实验结果如表1和2所示。

    表1:SNIPS实验结果

    表2: ARSC实验结果

    从实验结果上来看,由于通过数据增强获得更多的训练样本,使得MEDA在两个数据集上都取得一致且显著的提升。

    为了更进一步说明模型的shot数量对模型的影响,我们设计相应的实验。如图3所示,我们可以观察到MEDA在所有设置中都取得了最好的表现。特别地,MEDA的准确率随着shot数量的减少而增加(间距变大),这表明当shot数相对较小时,模型效果的提升更明显。

    图3: 不同shot数量对模型准确率的影响

    此外,我们还研究了模型的准确性如何随着增强样本数量的变化而变化。我们画出不同模型在SNIPS数据集上的准确率变化情况。如图4所示:

    图4: 不同模型的平均准确率随增强样本数量的变化而变化

    可以看到,随着增强样本数量的增加,模型的准确率有所提高。同时,我们比较5-shot和10-shot的实验设置,我们发现通过模型增强5个样本与使用5个真实样本的效果几乎相同,这意味着我们的MEDA不是简单地复制样本,而是为模型生成有意义的样本。

    04

    总结

    在本文中,我们提出了一种新颖的数据增强方法,称为ball generator,以增加新类别的样本数量。此外,我们还提出了一个新的框架MEDA,该框架联合优化了ball generator和meta-learner,从而使ball generator可以学习生成最适合meta-learner的增强样本。更多的细节、结果以及分析请参考原论文。

    作者:孙鹏飞

    编辑:刘莉

    校审:何亮

    说个正事哈

    由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

    (1)点击页面最上方深度学习自然语言处理”,进入公众号主页。

    (2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

    感谢支持,比心

    投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

    方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等

    记得备注呦

    点击上面卡片,关注我呀,每天推送AI技术干货~

    整理不易,还望给个在看!
    
    展开全文
  •  目前有效的文本分类方法都是建立在具有大量的标签数据下的有监督学习,例如常见的textcnn,textrnn等,但是在很多场景下的文本分类是无法提供这么多训练数据的,比如对话场景下的意图识别,这个时候如果我们还以...

     1,概述

      目前有效的文本分类方法都是建立在具有大量的标签数据下的有监督学习,例如常见的textcnn,textrnn等,但是在很多场景下的文本分类是无法提供这么多训练数据的,比如对话场景下的意图识别,这个时候如果我们还以传统的深度学习模型+softmax的形式来分类的话,是极容易陷入过拟合的状态。因此就有很多人研究在少量样本下如何建模。one-shot learning,few-shot learning,甚至是zero-shot learning都是旨在解决这类的问题。

      本篇博客将会介绍下几种比较经典的one-shot learning或者是few-shot learning。

     

    2,模型介绍

           接下来我们来介绍几篇经典的文章,来看看都是怎么去做few-shot learning或者one-shot learning的。但因为大部分文章中的例子都是在图像领域的,因此不会很细的去描述模型的结构,应用到文本中这些结构可以自己去选择,在这里会侧重讲述其做法,代码实现见https://github.com/jiangxinyang227/few_shot_learning。数据集采用的是由阿里巴巴团队整理出来的ARSC数据集。

     

      论文一:Siamese Neural Networks for One-shot Image Recognition
      这篇论文的主体结构是孪生网络(Siamese Network),之前的一片博客有专门介绍过孪生网络,详情见
    孪生网络(Siamese Network)在句子语义相似度计算中的应用。这一篇介绍下孪生网络在one-shot learning中的应用。

      假定你现在对孪生网络结构有个清晰的了解,我们现在来看看是怎么用孪生网络做one-shot learning的。我们给定三份数据集,用于训练的train set,用于测试时的support set,query。

      train set包含M个类别,每个类别下有N个样本,我们现在随机从每个类别下去采样,从同一类别下采样相同的两个句子作为正样本,从不同的类别下采样两个句子作为负样本,保证正负样本对的数量为1:1。然后输入到孪生网络中作为一个二分类的任务来度量两个句子之间的距离。

      在本论文中的度量方式用的是曼哈顿距离,并采用了加权和的方式来加权,加权系数是通过网络自己学习的,其表达式如下:

        

      上面式子中$h_{1, L-1}^{(j)},h_{2, L-1}^{(j)}$分别表示第一个句子和第二个句子最终的向量表示,$\alpha_j$是上面两个向量相减后得到的向量的第$j$个值得系数,这个值是通过网络自己学习得到的,$\sigma$表示sigmoid函数,输入一个0-1之间的概率值。

      上面说到通过这种采样方式将问题转化成一个0,1的二分类问题,因此损失函数可以采用二元交叉熵损失函数。

        

      论文中也给出了自己的优化算法:

        

      引入了动量和正则,不过这里的正则的作用是什么,我不太清楚。

      one-shot learning在测试阶段是怎么实现的呢?具体如下:

      首先在给定的测试时的support set,support set是一个C个类别(原则上这C个类别和train set中的M个类别是不相交的,这样才符合one-shot learning的本质),且每个类别下只有一个样本的数据集,现在给定一个query,将query和support set中的样本输入到孪生网络中,得到query和每个样本之间的概率分数,在这里因为是one-shot,因此support set中每个样本表示一个类别,然后取概率分数最大的类别作为输出类别,表达式如下:

        

      上面式子中$P^{(c)}$表示query和support set中的样本的概率分数。

     

      论文二:Prototypical Networks for Few-shot Learning
      原型网络(Prototypical Network)中引入了一个混合密度估计的思想,用few-shot样本集的均值来表示该类别的向量,我们来看看具体的做法
      给定一个训练时的train set,测试时的support set和query。support set 包含C个类别,每个类别下含有K个样本。train set 包含M个类别,每个类别下含有N个样本。为了在训练时期模拟测试时的场景,我们在训练时构造一系列的episode,每个episode实际上就是一个meta task。那该怎么构造这样一个episode呢?从train set中随机抽取C个类别,然后从每个类别中随机抽取K个样本,构造训练时期的support set,这样的问题也称为C-way K-shot问题,接着从另外N-K个样本中选取n个样本作为训练时期的query。构造一系列这样的episode来训练网络。其具体的结构可以描述如下:

      1)embedding层,将训练时的support set和query embedding成向量表示

      2)特征提取层,这里可以用LSTM来提取句子的高层特征

      3)针对support set做的类的向量表示层,其实就是对每个类中的K个样本取平均来表示这个类

        

        上面式子中$f_{\phi}(x_i)$表示support set中第$i$个样本的向量表示,$k$表示第$k$个类别。

      4)计算query和每个类别之间的分数

        

        上面式子中$f_{\phi}(X)$表示query的向量表示,$d(.)$是一个距离度量函数,上面整个式子是一个softmax函数,得到query和每个类别的概率分数。

      真个算法流程图如下:

        

      整个算法原理图示化:

        

      如上图所示,整个模型也是可以很好的迁移到zero-shot,one-shot的任务上的。

      到了这里还有一个问题,就是距离度量函数$d(.)$该怎么选择,上面我们说到是通过计算类别下所有样本的均值来表示该类别,文章中引入了Bregman 散度的概念,Bregman 散度认为:达到与指定点(query)最小距离的点为样本均值点,也就是说当我们的度量函数$d(.)$选择Bregman 散度时,用样本均值来表示类向量是最佳选择,而欧式距离的平方就是一种Bregman 散度。因此本文的距离度量函数是欧式距离的平方:

        

      上面添加的负号是将求距离最小转换成求距离最大。

      测试的时候和训练时的episode中的操作一样,将测试时的support set 和query输入到模型中,然后计算query和每个类别的概率分数,选择最大的概率值的类。

     

      论文三:Learning to Compare: Relation Network for Few-Shot Learning

      这篇论文中提出了关系网络(Relation Network)的概念。整个训练和预测时的方法和上一篇的原型是一样的。其主要创新点在于之前的网络都会给定一个确定的距离度量函数,然而作者认为没有一个确定的距离函数能作为所有类别的最佳度量函数,因此作者让网络自己去学习一个这样的度量函数,这里的Relation network就是通过关系网络来度量query和各类别之间的关系。

      其网络结构图如下:

        

      在这里是一个图像分类的例子,转换到文本上只要更改第一个embedding module。在这个模块之后有一个relation module模块,这个模块就是度量query和每个类别的关系分数的。

      假设support set总共有C个类别,以one-shot为例,其关系分数表达式如下:

        

      上面式子中$x_i$表示support set中第$i$个样本,因为是one-shot,所以一个样本表示一个类别,因此$f_{\varphi}(x_i)$表示的是第$i$个类别的向量,$f_{\varphi}(x_j)$表示的是query中第$j$个样本的向量。

      而转换到few-shot的场景下,论文这里是通过对样本向量求和的方式来表示类向量。因为关系网络得到是一个关系分数,因此作者认为用回归的方式来训练网络更合适,因此这里的损失函数是均方误差,表达式如下:

        

      真实的标签还是0和1,用计算出来的关系分数和0,1计算均方误差。

     

      论文四:Few-Shot Text Classification with Induction Network

      这篇论文是阿里小蜜团队提出的,并成功用在了他们的对话平台中,用来做少样本的意图识别。整体的训练方式和上面两篇论文一致,但是在类向量的表示上不再是简单的求均值或者求和,此外也引入了关系网络来计算query和类别之间的关系分数。

      训练模型的算法如下:

        

      和上面的训练方式基本一致。

      首先来看下整个网络结构图:

        

      整个网络结构由三个模块组成:Encoder Module,Induction Module,Relation Module。我们接下来一一介绍这三个模块:

      1)Encoder Module

      这个模块就是对输入的样本提取高层特征,用向量来表示它们。

       在这里用的方法就是Bi-Lstm + attention的方式,这个做NLP的基本都很清楚,就不详述。

      2)Induction Module

      这里也是整个论文的创新点,提出用胶囊网络(Capsules Network)来动态的表征类向量,首先胶囊网络是有Hinton提出的,关于胶囊网络具体的描述见看完这篇,别说你还不懂Hinton大神的胶囊网络,capsule network。在这里通过动态路由算法来得到某个类别下不同样本对类向量的贡献,简单理解和attention中的加权和类似,所以后面作者也给出了基于attention的方法来表示类向量的实验结果,但是效果较胶囊网络要差一些。

      首先将Encoder Module得到的support set的结果表示为$e^s$,query的结果表示为$e^q$,具体的流程如下:

      (1)首先用一个矩阵将$e^s$映射到另一个空间,作者认为这一步很重要,可以起到类似聚类的效果,将相同的样本映射到一个相同的子空间中,作者给出了转换前后可视化图的对比

        

        可以看到矩阵映射之后类别之间的界面更加明显,此外也和论文三做了对比:

        

        可以看到本论文提出的Induction Network在类别聚合上的效果更好。

        这个映射转换的公式如下:

          

      (2)对动态路由的值归一化

        

        上面的$i$表示第$i$个类

      (3)加权和得到类向量

        

      (4)经过激活函数squash函数,得到新的类向量

        

      (5)更新动态路由值

        

        这里的更新方式确保了和类向量相近的样本向量对应的路由值会增大,即$e_{i, j}^s$ 和 $c_i$的点积大,则$b_{i, j}$就大,在迭代计算$c_i$的时候,样本$j$的贡献就大。

        动态路由值在一开始会全部初始化为0,经过softmax后可以认为所有的样本对类向量的贡献是一样的,经过迭代可以得到新的动态路由值。在这里的迭代次数为3,整个Induction Module的算法如下:

        

      3)Relation Module

      关系模块就是来度量query和类别之间的关系分数的,其计算公式如下:

        

        

      最后的损失函数也是采用了均方误差。

        

     

    参考文献:

    Siamese Neural Networks for One-shot Image Recognition

    Prototypical Networks for Few-shot Learning

    Learning to Compare: Relation Network for Few-Shot Learning

    Few-Shot Text Classification with Induction Network 

    数据集来源:Mo Yu, Xiaoxiao Guo, Jinfeng Yi, Shiyu Chang, Saloni Potdar, Yu Cheng, Gerald Tesauro, Haoyu Wang, and Bowen Zhou. 2018. Diverse few-shot text classification with multiple metrics

    转载于:https://www.cnblogs.com/jiangxinyang/p/11346764.html

    展开全文
  • 文本分类小

    2021-04-25 18:41:47
        分类问题的定义:给定一个数据集,称为训练数据集,每...文本分类问题与其他分类问题没有本质上的区别,方法可以归结为根据分类数据的某些特征来进行匹配,当然完全的匹配不太现实,因此必须根据模型选择

        分类问题的定义:给定一个数据集,称为训练数据集,每个训练样本都是由属性值或特征值构成的特征向量,而且每个训练样本还有一个类标号属性,可表示为(v1,v2,…vn;c),v表示属性值,c表示类标号。
        文本分类是自然语言处理领域的一个重要研究方向,是指计算机将载有信息的一篇文本映射到预先给定的某一类别或某几类别主题的过程。文本分类问题与其他分类问题没有本质上的区别,方法可以归结为根据分类数据的某些特征来进行匹配,当然完全的匹配不太现实,因此必须根据模型选择最优的匹配结果,从而完成分类。
        文本分类方法一般分为传统机器学习方法和深度学习方法。文本处理过程主要分为文本预处理、文本特征提取、分类模型构建等。当然深度学习逃过了特征提取类似距离度量的定义过程,但是依然得有模型选择、参数优化、预处理等过程。

    机器学习的文本分类方法

    1、训练文本分类模型如图所示:
    2、文本表示模型:
        文本表示的目的是把预处理后的转换成计算机可以理解的方式,是决定文本分类质量的重要环节。
        文本表示模型如布尔模型、向量空间模型VSM、潜在语义模型(LSA)、概率模型等,如何让有效的基于某种模型选择一种文本分类算法来构造分类器成为一个重要的课题。目前常用的表示模型是向量空间模型——多维向量。但是该模型最大的不足是忽略文本上下文关系,每个词之间互相独立,并且无法表征语义信息。
        布尔模型:基于特征项的严格匹配模型,文本用特征变量来表示,虽然速度快易于表达一定程度的结构化信息,但文本的表达很不精确,不能反映特征项对文本的重要性,更谈不上模糊匹配。
        VSM: 文档被看作一系列无序词条的集合,缺点在于项之间线性无关的假设。
    基于语义的文本表示:
       LDA主题模型、LSI/PLSI概率潜在语义索引等方法,一般认为这些方法得到的文本表示可以表示文档的深层表示。
    3、分类器
    ①决策树:决策树沿着特征做切分,具有如面对“是否、好坏”等二分类任务的二叉树结构。在得出最终决策过程中,对所有数据中各特征a子决策判断的积累,使求解范围不断缩小。
       适用于具有不相关特征或者特征缺失的场合;因为它能够生成清晰的基于特征选择不同预测结果的树状结构,所以当对手中的数据需要更好理解的时候可以使用决策树。优点:直观、便于理解、小规模数据集有效;缺点:处理连续变量不好,类别交过时,错误增加的较快;忽略了属性之间的相互关联;对具有大量特征的进行划分时往往有偏差。
    ②KNN:对于待判断的点,找到离它最近的几个点,根据他们的类型绝当待判断点的类型。
       适合处理多分类问题,对数据的分布无要求,直接使用训练集对样本进行分类;但对异常值不敏感,向量的维度越高,距离计算误差越大,不适合样本空间太大的问题,还存在样本不平衡的问题。
    ③朴素贝叶斯:该算法比较依赖训练语料,核心思想时根据条件概率判断点的类型,而且各特征相互独立,首先得计算类的先验概率,再计算每个属性的条件概率,再把同属一类的属性概率相乘得到该类的概率,从而根据概率进行分类。
       适合于维度较小,而且维度相关性较小的模型,支持增量式运算;使用样本属性独立性的假设,样本属性有关联时,分类性能降低。
    ④支持向量机:SVM的核心思想是找到不同类别之间的分界线,使得两类样本尽量落再面的两边,找到合理划分数据的超平面是该算法基本思想。
       适用于高维特征空间和多输入多输出问题,泛化能力较强,数据需求量小,计算精度高;适用于二分类问题,对多分类问题容易产生过拟合;对核函数的高维映射解释力不强,但核函数选取和具体问题相关,缺乏明确规则,导致对缺失的数据处理效果差。对非线性问题没有通用的解决方案,有时候很难找到一个合适的核函数。
    ⑤神经网络:人工神经网络又叫神经网络,是借鉴生物神经网络的工作原理形成的一种数学模型。核心思想是利用训练样本逐渐完善参数,最终神经网络的那条路线比较强取决于样本。神经网络通过大量中间层的引入,能够捕捉很多输入特征之间的关系。
    神经网络的基本结构是由神经元组成
    在这里插入图片描述
       适用于数据量庞大,参数之间存在内在联系的情况,分类的准确度高,并行分布处理能力强,但是需要大量的参数,不能观察之间的学习过程,输出结果难以解释,训练时间较长,输入属性值必须是数值型。
    此外机器学习的分类过程还涉及特征选取以及特征权值的计算。

    深度学习文本分类方法

       应用深度学习解决大规模文本分类问题最重要的是解决文本表示,再利用CNN/RNN等网络结构自动获取特征表达能力,去掉繁琐的人工特征工程,端到端的解决问题。
       为了解决传统机器学习与自然语言处理中的数据稀疏、人工特征模板和误差传播等问题,人们将注意力转向了另一种机器学习潮流的研究——深度学习。通过多层感知机(神经网络)提取向量才是深度学习的精髓。
    1、文本的分布式表示:词向量(word embedding)
       基本思想是将每个词表示成n维稠密、连续的实数向量,分布式表示最大优点是具备非常强有力的特征表达能力。比如维向量每维k个值,可以表征kn个概念。可以用word2vec模型产生词向量。
       文本的表示通过词向量的表示方式,把文本数据从高纬度高稀疏的神经网络难处理的方式,变成了类似图像、语音的连续稠密数据。
       词向量的特点就是向量的距离可以衡量单词间的语义相似程度。
    2、word2vec
       Word2vec工具主要包含两个模型:skip-gram和CBOW模型,Word2vec词向量模型可以较好的表达不同词之间的相似和类比关系。特点是将所有的词表示成低维稠密向量,从而可以在词向量空间上定性衡量词与词之间的相似性。词是表义的基本单元,所以,在NLP中,需要把他们转化成数值形式嵌入到数学空间中,简单来说,Word2vec(浅层网络)就是把一个词语转化成对应向量的表达形式,来让机器读取。
    在这里插入图片描述
       NLP语言模型中的目的就是判断(x,y)这个样本是否符合自然语言的法则,Word2vec最终的目的不是把模型F训练的多完美,而实关心模型训练完后的产物——模型参数,并将这些参数作为输入x的某种向量化的表示,这个向量就叫做——词向量。
       Word2vec的本质是一种降维操作,把词语从one-hot encoder形式的表示降维到Word2vec形式的表示。
       Skip-gram模型的本质是计算输入word的input vector与目标word的output vector之间的余弦相似度,并进行softmax归一化。我们要学习的模型参数正是这两类词向量。
    3、深度学习文本分类模型
    ①fastText:核心思想是将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。主要涉及两个关键:字符级n-gram特征的引入以及分层softmax多分类。
       fastText使用了字符级别的n-gram来表示一个单词,好处是对于低频词生成的词向量效果会更好,对于训练词库之外的单词,依然可以构建他们的词向量。
       模型架构:
    在这里插入图片描述
       fastText模型也只有三层,输入层、隐含层、输出层。输入是多个单词及其n-gram特征,这些特征表示单个文档。输出是文档对应的类标。
       使用词向量而非词本身作为特征,这是fastText效果好的一个原因,其次就是字符级n-gram特征的引入对分类效果会有一定的提升。
       fastText主要被用在同近义词挖掘、文本分类系统。在类标数、数据量都比较大时,会选择fastText做文本分类,以实现快速训练预测,节省内存的目的。
       fastText中的网络结果是完全没有考虑次序信息的,而它用了n-gram特征,恰恰说明了局部序列信息的重要特征。
    ②TextCNN:核心是可以捕捉局部特征性,处理原理是首先对句子的每一个词生成一个实值的词向量,然后按照句子合并成一个词向量矩阵,词向量矩阵相当于图像的像素,再使用卷聚核进行卷积以及池化。
    在这里插入图片描述
       词向量构造方面:
       CNN-rand: 随机初始化每个单词的词向量通过后续的训练去调整。
       CNN-static: 使用预先训练好的词向量,如word2vec训练出来的词向量,在训练过程中不再调整该词向量。
       CNN-non-static: 使用预先训练好的词向量,并在训练过程进一步进行调整。
       CNN-multichannel: 将static与non-static作为两通道的词向量。
       输入层:为了使其可以卷据,需要将输入的句子转化维二维矩阵的形式,类似处理图像的像素矩阵。
       卷积层:卷积核的宽度与词向量的维度相同,因为每一行代表一个词,词作为最小单元,高度和CNN一样。利用卷积核进行卷积时,不仅考虑词义而且考虑词序和上下文。
       池化层:输出一个固定大小的矩阵,还能降低输出结果的维度,多次卷积池化后得到最终的特征向量。
       输出层:输出结果。池化层的一维向量的输出通过全连接的方式,连接一个Softmax层,Softmax层可根据任务的需要设置(通常反映着最终类别上的概率分布)
       注:神经网络两层之间一般全部连接(全连接层),并不需要人们根据具体问题设计连接方式,这些隐藏层会根据损失函数的梯度自动调整多层感知机的权重矩阵,从而自动学习到隐藏层之间的特征。
    ③TextRNN:此模型一共分为三层,首先使用的是类似于双向RNN的结构当作卷积层,第二层为最大池化层,最后一层为输出层。

    展开全文
  • 如同CV领域当前的重点一样,我们更应该关注如何利用机器学习思想,更好地去解决NLP分类任务中的低耗时、小样本、鲁棒性、不平衡、测试检验、增量学习、长文本等问题。本文以QA形式探讨了以下问题:Q1: 如何科学地...
  • 文本分类

    2016-09-12 14:20:18
    文本分类分类过程把所有文本分为训练样本和测试样本 训练样本样本分词: 把样本用分词工具全部进行分词 去停用词: 去掉一些无用的词语,如那、这些、明天等等 提取初步特征 计算特征互信息 按照互信息的大小排序...
  • 整体:新闻文本分类 赛题数据:训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本。 分类的目标:14个候选类别-财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐 ...
  • svm文本分类

    千次阅读 2019-04-17 21:46:17
    文本分类、图像识别、主要二分类领域 2.SVM的优缺点 SVM优点 1、解决小样本下机器学习问题。 2、解决非线性问题。 3、无局部极小值问题。(相对于神经网络等算法) 4、可以很好的处理高维数据集。 5、泛化能力比较...
  • 文本分类技术是文本挖掘技术中的研究热点之一,但是传统KNN分类算法的时间复杂度高,在不均匀密度样本下分类准确率低。针对这些问题,提出一种在不均匀密度样本下的优化KNN算法:IKNN算法。首先选取样本分类不均匀的...
  • Bert实现中文文本分类

    千次阅读 2020-02-17 12:44:11
    文章目录参考文献 参考文献 1,NLP之BERT中文文本分类 基本上有了一些介绍,但是缺少具体例子和明确的指明文件路径(应该给出例子) ...提供规模的训练样本。 5,有用的搜索方式 bert 短文本分类 h...
  • “复旦大学计算机信息与技术国际数据库中心自然语言处理小组”提供的小样本中文文本分类语料,分为训练集和测试集两部分。内容真实有效
  • 最近在做文本分类任务,确定好文本类别后,标注同学去给文本打标签,大家都知道,标注数据真的很昂贵,所以每个类别都尽可能少的用标注数据。今天的例子是,有这样四个类别:{0: '谈面试', 1: '找工作', 2: '打工人'...
  • fastbert做文本分类

    2020-07-02 10:52:46
    模型结构 FastBERT的创新点很容易理解,就是在每层Transformer后都去预测样本标签,如果某样本预测结果的...作者的解决方案是给每层后面接一个分类器,毕竟分类器比Transformer需要的成本多了: 注:FLOPs (floating
  • 它是一个简单的、广泛使用的文本分类数据集。它包括 46 个不同的主题,且训练集中每个主题都有至少 10 个样本。下载地址是XX,当然Keras内置也有这个数据集,可以直接调包,但是可能会出现下载不了的情况,错误会是...
  • 实战文本分类对抗攻击

    千次阅读 2020-03-15 10:29:56
    文本分类对抗攻击”是清华大学和阿里安全2020年2月举办的一场AI比赛,从开榜到比赛结束20天左右,内容是主办方在线提供1000条辱骂样本,参赛者用算法逐条扰动,使线上模型将其判别为非辱骂样本,尽量让扰动较...
  • 支持向量机,神经网络等算法进行分类中存在的两个问题,没有考虑到语义关联对其文本的影响和受文章长短对其词频向量大小的影响,通过结合apiori算法进行改进knn算法的方法对文本分类样本进行了分类实验,结果表明,...
  • 文本分类之卡方检验

    2020-06-11 17:34:18
    文本分类之卡方检验 定义 卡方检验是以卡方(χ2)分布为基础的一种假设检验方法,属于非参数检验的范畴,主要是比较两个及两个以上样本率(构成比)以及两个分类变量的关联性分析。根本思想就是在于比较理论频数和...
  • 利用SVM进行文本分类

    2018-03-13 21:33:00
    利用SVM算法进行文本分类 数据集 两位不同作家的作品(金庸&刘慈欣)切分出来的小样本。根据自己构建的词汇表,将样本转化为一个1000维的0-1向量(仅统计词汇是否出现)。再加上一个0-1标记作家 模型 SVM ...
  • 小样本学习

    2021-01-02 17:08:50
    过去一年,我们对Few-shot Learning进行了系统的梳理和研究,将Few-shot Learning和 Capsule Network 融合,提出了 Induction Network,在文本分类上做到了新的 state-of-the-art。 创新总是基于对已有成果的梳理...
  • ????????学习笔记全部在代码???????? ????????????希望大家可以学习交流???????????? 有不清楚的欢迎给我留言进行讨论 import numpy as np ...feature_extraction.text 文本特征提取 CountVectorizer
  • 阿里发表的小样本学习的方法,在文本分类领域效果还不错,主要还是 通过计算每个类相对应的特征向量来做有效的区分
  • 零基础入门NLP-新闻文本分类【Task3】Task3 基于机器学习的文本分类学习目标文本表示方法One-hotBag of WordsN-gramTF-IDF基于机器学习的文本分类Count Vectors + RidgeClassifierTF-IDF + RidgeClassifier本章结 ...
  • 基于朴素贝叶斯模型的中文文本分类 ...朴素贝叶斯模型是有监督分类模型,因此需要采用预处理好的训练数据集,我采用的是“复旦大学计算机信息与技术国际数据库中心自然语言处理小组”提供的小样本中文文本分类语料 ...
  • 如何为文本分类问题选择最优模型

    千次阅读 2019-02-27 13:58:06
    文本分类的应用现状: 垃圾邮件分类 情感分析 个性化推荐 舆情分析 影视评价 新闻主题 文本分类中的常见误区: 1. 深度模型一定由于传统的机器学习模型吗? 模型效果取决于训练数据集大小,算法,和样本的多样性:...
  • 小样本处理思路

    2020-06-16 10:08:48
    1.直接构建分类器进行文本分类 结果: 可想而知,由于数据量巨少,所以准确率只有1% 2.分类加实体提取相结合 主要思路: 首先对24类数据进行二分类,因为我处理的问题可以归为两个大类,首先对两个大类的数据...
  • 本文是作者一个tweet/微博文本分类实战项目的全程重现与总结。该项目的最大特点是使用了弱监督技术(Snorkel)来获得海量标注数据,同时使用预训练语言模型进行迁移学习。项目的主要步骤如下:采集一批已标注样本(~...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 270
精华内容 108
关键字:

小样本文本分类