您好、欢迎来到现金彩票网!
当前位置:红彩会 > 分类器 >

专栏 自然语言处理第一番之文本分类器

发布时间:2019-05-06 04:39 来源:未知 编辑:admin

  文本分类应该是自然语言处理中最普遍的一种应用,例如文章自动分类、邮件自动分类、垃圾邮件识别、用户情感分类等等,在生活中有很多例子,本文主要从传统和深度学习两块来向大家介绍如何构建一个文本分类器。

  传统的文本方法的主要流程是人工设计一些特征,从原始文档中提取特征,然后指定分类器如 LR、SVM,训练模型对文章进行分类,比较经典的特征提取方法如频次法、tf-idf、互信息方法、N-Gram。

  深度学习兴起之后,也有很多人开始使用一些经典的模型如 CNN、LSTM 这类方法来做特征的提取,在本文中,作者会简要描述一下各种方法,及其在文本分类任务中的一些实验。

  这里主要描述两种特征提取方法:频次法、tf-idf、互信息、N-Gram。

  频次法,顾名思义,十分简单。它记录每篇文章的次数分布,然后将分布输入机器学习模型,训练一个合适的分类模型。对这类数据进行分类,需要指出的是:在统计次数分布时,可合理提出假设,频次比较小的词对文章分类的影响比较小。因此,我们可合理地假设阈值,滤除频次小于阈值的词,减少特征空间维度。

  TF-IDF 相对于频次法,有更进一步的考量。词出现的次数能从一定程度反应文章的特点,即 TF,而 TF-IDF,增加了所谓的反文档频率,如果一个词在某个类别上出现的次数多,而在全部文本上出现的次数相对比较少,我们就认为这个词有更强大的文档区分能力。TF-IDF 是综合考虑了频次和反文档频率两个因素的方法。

  互信息方法也是一种基于统计的方法,计算文档中出现词和文档类别的相关程度,即互信息。

  基于 N-Gram 的方法是把文章序列,通过大小为 N 的窗口,形成一个个 Group。然后对这些 Group 做统计,滤除出现频次较低的 Group,再把这些 Group 组成特征空间,传入分类器,进行分类。

  最普通的基于 CNN 的方法就是 Keras 上的 example 做情感分析,接 Conv1D,指定大小的 window size 来遍历文章,加上一个 maxpool。如此多接入几个,得到特征表示,然后加上 FC,进行最终的分类输出。

  这类 CNN 的方法,通过设计不同的 window size 来建模不同尺度的关系,但是很明显,丢失了大部分的上下文关系,论文《Recurrent Convolutional Neural Networks for Text Classification》对此进行了研究。将每一个词形成向量化表示时,加上上文和下文的信息,每一个词的表示如下:

  和基于 CNN 的方法中第一种类似,直接暴力地在 embedding 之后加入 LSTM,然后输出到一个 FC 进行分类,基于 LSTM 的方法,我觉得这也是一种特征提取方式,可能比较偏向建模时序的特征;

  训练的语料来自于大概 31 个新闻类别的新闻语料,但是其中有一些新闻数目比较少,所以取了数量比较多的前 20 个新闻类比的新闻语料,每篇新闻稿字数从几百到几千不等,任务就是训练合适的分类器然后将新闻分为不同类别:

  然后,tokens set 以频率阈值进行滤除,然后对每篇文章做处理来进行向量化:

  最终得到了每篇文章的 bow 的向量,由于这块的代码是在我的笔记本电脑上运行的,直接跑占用内存太大,因为每一篇文章在 token set 中的表示是极其稀疏的,因此我们可以选择将其转为 csr 表示,然后进行模型训练,转为 csr 并保存中间结果代码如下:

  TF-IDF 和 Bow 的操作十分类似,只是在向量化使使用 tf-idf 的方法:

  语料处理的方法和传统的差不多,分词之后,使用 pretrain 的 word2vec。在这里我遇到一个坑,我一开始对自己的分词太自信了,最后模型一直不能收敛,后来向我们组博士请教,极有可能是由于分词的词序列中很多在 pretrained word2vec 里面是不存在的,而我这部分直接丢弃了,所有可能存在问题,分词添加了词典。然后,我对于 pre-trained word2vec 不存在的词做了一个随机初始化,然后就能收敛了,学习了!

  由于我们的任务是对文章进行分类,序列太长,直接接 LSTM 后直接爆内存,所以我在文章序列直接,接了两层 Conv1D+MaxPool1D 来提取维度较低的向量表示然后接入 LSTM。网络结构代码如下:

  整个实验的结果由于深度学习这部分都是在公司资源上运行的,没有真正意义上地去做一些 trick 来调参来提高性能,这里所有的代码的网络配置包括参数都仅供参考,更深地工作需要耗费更多的时间来做参数的优化。

  在本文的实验效果中,虽然基于深度学习的方法和传统方法相比没有什么优势,可能原因有几个方面:

  Pretrained Word2vec Model 并没有覆盖新闻中切分出来的词,而且比例还挺高,如果能用网络新闻语料训练出一个比较精准的 Pretrained Word2vec,效果应该会有很大的提升;

  可以增加模型训练收敛的 trick 以及优化器,看看是否有准确率的提升;

  当使用 DL Embedding 层时,如 Word2vec 中若不存在该词时,请不要随意扔掉,可选择随机初始化,可以的话统计不存在词数,如果数量较大,需分析相关原因;

  切词的好坏在一定程度上影响模型性能,但是如果使用不同的工具性能影响更大,因此,在使用 pretrain word2vec 和后面训练数据时,请确保使用相同分词工具,这在我的 task 上提升至少 0.07+;

  大的语料上的生成的比较通用的 word2vec 模型,可能比较有效。但是当你想提升准确率时,如果数据量够的话,可以考虑自己训练 word2vec,很有效;

  当上面都差不多没问题的时候,如果想再提升下,可以打开 Embedding 的 trainable,有比较合理的解释,word2vec 的 weight 是一个无监督学习任务,根据词的共现算的,结合 task 来再更新往往会更有效;

http://m3-ctech.com/fenleiqi/233.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有