摘要:本篇主要分享腾讯开源的文本分类项目NeuralClassifier。虽然实际项目中使用BERT进行文本分类,但是在不同的场景下我们可能还需要使用其他的文本分类算法,比如TextCNN、RCNN等等。通过NeuralClassifier开源项目我们可以方便快捷的使用这些模型。本篇并不会重点剖析某个算法,而是从整体的角度使用NeuralClassifier开源工程,更多的是以算法库的方式根据不同的业务场景为我们灵活的提供文本分类算法。

目录

01 不仅仅是BERT

02 腾讯开源文本分类项目NeuralClassifier

03 第一步先跑通它

04 改造成我们的基于中文的多分类任务

总结

01 不仅仅是BERT

之前说过BERT是NLP领域中具有里程碑意义的成果,具有效果好和应用范围广的优点。虽然实际项目中我们主要使用BERT来做文本分类任务,但是在不同的场景下我们可能还需要使用其他的文本分类算法。除此之外,我们不能仅仅只会用BERT,还需要掌握一些BERT出现之前的文本分类算法,能更好的帮助我们了解文本分类任务背景下模型的发展历史。

BERT之前主要用于文本分类的模型有TextCNN、RCNN、FastText等,这些模型也拥有各自的优点。充分了解这些模型各自的优缺点,才能在不同的场景下更好的使用这些模型。

之前看到腾讯开源了一个文本分类开源项目NeuralClassifier,里面集成了很多算法,其中就包括上面说的TextCNN、RCNN、FastText等。所以想基于该开源项目进行二次开发以便后续用于实际项目中。

02 腾讯开源文本分类项目NeuralClassifier

本篇的重点是讲解NeuralClassifier开源项目, 项目的github地址如下:

https://github.com/Tencent/NeuralNLP-NeuralClassifier

1. 项目整体架构

项目整体架构如下图所示:

图1 项目整体架构图

从下往上依次查看,最下面是输入的语句,因为原始项目中主要是针对英文分类,所以输入的句子序列是一系列词,这是主要识别的文本,所以是必须要有的。可选的输入是文本是否有关键词或者主题;

然后是Input Layer,这里可能是词、词的组合、字符和字符的组合等。如果有关键词或者主题也会作为特征进入模型;

接着是Embedding Layer,这里可以使用不同的Embedding方式,包括预训练编码、随机编码、位置编码等等;

然后是Encoder Layer,这里主要使用不同的算法,比如FastText、CNN、RCNN、Transformer等等;

最后就是Output Layer,根据不同的任务类型输出不同的结果。

2. 项目支持的任务类型

项目支持的任务类型主要有:

  • Binary-class text classifcation:二分类任务
  • Multi-class text classification:多分类任务
  • Multi-label text classification:多标签任务
  • Hiearchical (multi-label) text classification (HMC):多层多标签任务

前面三个比较好理解,咱们重点讲下第四个多层多标签任务。

实际项目中我们已经不再是单纯的多分类了,而是拥有一个比较复杂的类目体系,这个类目体系一般是以树的形式展示。对应本项目就是data/rcv1.taxonomy文件。详细解读下这个文件,第一行表示存在四个一级类目,分别是CCAT、ECAT、GCAT、MCAT。第二行代表CCAT这个一级类目下拥有的二级类目。依次类推,第三行代表C15这个二级类目下还有两个三级类目,第四行代表C151这个三级类目下还有两个四级类目。下图展示类目体系文件并通过EXCEL的方式更好的展示下这个层级类目:

图2 类目体系文件和EXCEL展示类目体系

为了方便显示,上图EXCEL中只展示了rcv1.taxonomy文件前9行的类目结构。这样小伙伴们应该对这个类目体系有一定的了解。实际项目中一般是三到四级的类目体系,这个主要根据业务复杂程度来定。

这里咱们举一反三,如果现在需要做一个多分类任务的话,那么我们这个类目体系的配置文件只需要一行就够了:Root label1 label2 label3…labelx

了解了类目体系,我们回过来说这个多层多标签任务。拿data目录下的训练集rcv1_train.json第一条数据对应到类目体系中,这条数据既属于CCAT一级类目,还属于C31二级类目,并且还属于C312三级类目。具体如下图所示:

图3 训练集数据抽样和类目对应展示

通俗的说,就是多层多标签任务会将这条文本数据的标签以及该标签的父级类目都加上。这点其实和我们在实际工作中的理解稍微有点不同。个人认为类目体系的层级结构一般是存在包含关系,比如C312是属于CCAT这个一级大类的,那么如果一条item打上了C312这个标签,那么应同时属于它的二级目录C31和一级目录CCAT。item打标一般是标注在最低的层级。这里的一个猜测是将标签的层级结构也添加到模型训练中可能有利于模型训练。

2. 项目支持的算法

图4 项目支持的算法

3. 项目需要的开发环境

  • Python 3
  • PyTorch 0.4+
  • Numpy 1.14.3+

03 第一步先跑通它

复用一张前面讲ALBERT时用到的图片,以实用性为主的我一般都是先跑通项目。好处之前也说过,一方面可以增加自信心,另一方面也能快速应用到实际项目中。

通过github将项目下载到服务器下。模型训练通过以下命令:

python train.py conf/train.json

这里需要着重讲下train.json文件,这个文件是相关的任务配置信息,包括任务类型、使用算法、训练集目录、类目体系目录以及模型训练中的相关参数等。如果只是跑通样例代码,那么不用任何改动。原始配置中任务类型是多标签任务("label_type":
"multi_label"),具有层级结构("hierarchical": true),使用TextCNN算法("model_name":
"TextCNN"),并且在data目录下配置了训练集、验证集和测试集。这是模型训练流程最主要的几个参数,其他更多的是模型内部的参数,这里默认就好。

模型验证和预测流程通过以下命令:

python eval.py conf/train.json

python predict.py conf/train.json data/predict.json

小结下,这节咱们主要是跑通项目提供的例子,例子中是多层多标签任务,使用TextCNN算法,包括模型训练、验证和预测流程。

04 改造成我们的基于中文的多分类任务

这里咱们通过一个实际项目改造,假如我们现在需要构建一个多分类模型。项目改造的github地址如下:https://github.com/wilsonlsm006/NeuralNLP-NeuralClassifier

原始项目中是英文的文本分类任务,对应到实际项目中主要是中文的文本分类,所以数据预处理方面要做两个改造:

改造1:我们之前的模型输入数据都是读取csv文件,字段为item,label。而本项目中的数据是从json文件读取,数据格式是:

图6 数据标准输入格式

其中doc_label和doc_token分别对应上面的label和item,都是必选项。doc_keyword和doc_topic可选,分别代表关键词和主题。

改造2:原始项目中使用英文,而实际项目中使用的中文,所以涉及到中文分词的问题。这里主要使用目前比较火的jieba分词和北大开源的pkuseg分词。

上面的两个改造代码都放在data_process.py文件中,其中包括使用jieba和pkuseg分词,还包括csv文件转换成模型标准输入json文件的的代码。代码有详细的注释,应该比较通俗易懂。如果小伙伴们遇到什么问题可以随时在公众号里滴滴我。

数据预处理改造完成后需要根据实际项目修改模型配置文件。这里因为我们是多分类任务,所以我们需要设置"label_type":
"single_label"。因为不需要分层,所以设置"hierarchical":
false。这里还构造了一个我们自己的类目体系,因为不存在分层,所以标签都在同一层级,类目体系只有一行,设置为Root 0
1。模型使用TextCNN算法,所以"model_name":"TextCNN"。相关的训练集、验证集和测试集都存放在data2目录下,这三个文件是我们通过上面的数据处理器将csv文件加工成json数据格式。

激动人心的时候到了,只需要通过以下命令就可以进行模型训练:

python train.py conf/train2.json

小结下:本节主要通过一个多分类模型入手对原项目进行二次开发,第一步是将csv文件抽取数据加工成模型标准的输入格式json文件。因为实际项目是对中文进行文本分类,而原项目主要是对英文,所以涉及到中文的分词,主要使用目前比较火的jieba分词和北大开源的pkuseg分词。这样咱们就完成了一个实际项目的改造。

总结

本篇主要分享腾讯开源的文本分类项目NeuralClassifier。虽然实际项目中使用BERT进行文本分类,但是在不同的场景下我们可能还需要使用其他的文本分类算法,比如TextCNN、RCNN等等。通过NeuralClassifier开源项目我们可以方便快捷的使用这些模型。然后从项目架构、支持的任务类型、支持的文本分类算法等方面重点讲解开源项目NeuralClassifier。接着,根据项目说明跑通了项目实例。最后,从实际需求出发,添加数据预处理功能,将项目改造成多分类模型。本篇并不会重点剖析某个算法,而是从整体的角度使用NeuralClassifier开源工程,更多的是以算法库的方式根据不同的业务场景为我们灵活的提供文本分类算法。

发布于 10:32

广告行业中那些趣事系列7:实战腾讯开源的文本分类项目NeuralClassifier的更多相关文章

  1. 广告行业中那些趣事系列6:BERT线上化ALBERT优化原理及项目实践(附github)

    摘要:BERT因为效果好和适用范围广两大优点,所以在NLP领域具有里程碑意义.实际项目中主要使用BERT来做文本分类任务,其实就是给文本打标签.因为原生态BERT预训练模型动辄几百兆甚至上千兆的大小, ...

  2. 广告行业中那些趣事系列8:详解BERT中分类器源码

    最新最全的文章请关注我的微信公众号:数据拾光者. 摘要:BERT是近几年NLP领域中具有里程碑意义的存在.因为效果好和应用范围广所以被广泛应用于科学研究和工程项目中.广告系列中前几篇文章有从理论的方面 ...

  3. 广告行业中那些趣事系列9:一网打尽Youtube深度学习推荐系统

    最新最全的文章请关注我的微信公众号:数据拾光者. 摘要:本篇主要分析Youtube深度学习推荐系统,借鉴模型框架以及工程中优秀的解决方案从而应用于实际项目.首先讲了下用户.广告主和抖音这一类视频平台三 ...

  4. 广告行业中那些趣事系列10:推荐系统中不得不说的DSSM双塔模型

    摘要:本篇主要介绍了项目中用于商业兴趣建模的DSSM双塔模型.作为推荐领域中大火的双塔模型,因为效果不错并且对工业界十分友好,所以被各大厂广泛应用于推荐系统中.通过构建user和item两个独立的子网 ...

  5. 广告行业中常说的 CPC,CPM,CPD,CPT,CPA,CPS 等词的意思是什么?

    广告投放流程主要分为展示和转化,CPC/CPM/CPD/CPT/CPA/CPS等代表的是不同的结算模式 展示端的结算方式有: CPM(Cost Per Mille) 每千人成本:只要向足够量级的用户展 ...

  6. ML学习分享系列(2)_计算广告小窥[中]

    原作:面包包包包包包 改动:寒小阳 && 龙心尘 时间:2016年2月 出处:http://blog.csdn.net/Breada/article/details/50697030 ...

  7. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  8. nginx高性能WEB服务器系列之五--实战项目线上nginx多站点配置

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  9. Go 在游戏行业中的工程实践

    在今年 1 月由七牛云主办的 ECUG Con 十周年盛会上,真有趣技术总监陈明达带来了题为< Go 在游戏行业中的工程实践>的精彩分享,深入讲解了 Go 的工程经验,错误和异常处理,in ...

随机推荐

  1. js mvvm:闲来无事,实现一个只具最基本数据双向绑定的mvvm

    近期项目内用knockoutjs. 想模拟实现数据双向绑定的基本功能. 只具有最基本的功能,且很多细节未曾考虑,也未优化精简. 能想到的缺少的模块 1事件监听,自定义访问器事件 2模版 3父子级 编码 ...

  2. VS自身的单元测试方法DEMO

    ///用来修饰测试类 [TestClass()] public class Program { private TestContext testContextInstance; /// <sum ...

  3. Caused by: com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 0, fastjson-version 1.2

    环境: vue.js 问题: 当添加评论时 重新查询数据刷新数据控制台异常Caused by: com.alibaba.fastjson.JSONException: syntax error, ex ...

  4. Python 搭建webdriver环境遇到的问题总结

    安装过程是参考<selenium2Python自动化测试实战>中Pythonwebdriver环境搭建章节 在安装过程中,遇到了一些问题,总结一下,为日后自己再遇到相同问题做个笔记以便查看 ...

  5. 吴裕雄--天生自然KITTEN编程:滂沱大雨

  6. 【转】Android Monkey 命令行可用的全部选项

    常规 事件 约束限制 调试 原文参见:http://www.douban.com/note/257030384/ 常规 –help 列出简单的用法. -v 命令行的每一个 -v 将增加反馈信息的级别. ...

  7. IPSec 传输模式下ESP报文的装包与拆包过程 - 择日而终的博客

    一.IPsec简介 IPSec ( IP Security )是IETF(Internet Engineering Task Force,Internet工程任务组)的IPSec小组建立的一组IP安全 ...

  8. JavaScript是如何工作的(一)

    简评:JavaScript 是越来越受欢迎了,很多团队都在采用这些语言工作.前端.后端.嵌入式设备等等,都可以看见它的身影.虽然我们知其然,但又知其所以然吗? 大家应该都知道 JavaScript 是 ...

  9. LeetCode 题解 | 237. 删除链表中的节点

    题目描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: hea ...

  10. AndroidStudio3.x中api、compile和implementation的区别

    首先在AndroidStudio3.x中compile已经过时 由implementation和api来代替 其次compile与api完全等同 3.x中可以完全将compile换成api mplem ...