自然语言处理赛流程
在NLP赛中,如今很多思路和CV赛是类似的,甚至Pipeline思路也是一致的。
简介
随着CV(计算机视觉)大量研究人员的涌入,相对而言,计算机视觉的发展进入了一个饱和时期,而自然语言处理的路还有很长,很多NLP科学家认为未来十年是NLP黄金的十年。
过去几年我们也看到了NLP领域很多突破性的成果,BERT、XLNet等模型的出现为NLP带来一些新的可能性,这些模型也被广泛使用在比赛中。
NLP主要有一些任务如文本分类、文本相似度、序列标注、阅读理解、机器翻译、信息抽取等,目前很多数据科学竞赛平台都举办了NLP比赛,并且最近有愈演愈烈之势。
赛前准备
参加NLP比赛必须要对赛题有充分的理解,也就是对赛题的背景知识有充足的了解。此外,可以查阅是否有过类似的任务,看看前人的解决方案,或者在其他人的baseline基础上修改(注意,从头开始码一个赛题的源码是很累且没有必要的,有很多人会开放他们的baseline源码,在这些baseline基础上修改会事半功倍。这点在Kaggle上尤为明显,Kaggle是一个非常优秀的比赛平台。)
到了比赛后期,如果已经没有什么突破了,就到了组队的时机,一般选择排名差不多的组队,融合多人的结果会取得更好的效果。(前期不建议组队是因为一个队伍是有提交限制的,分开是为了更好的在一起。)
工具选择
NLP是个复杂的任务,要想取得不错的效果需要使用各种库,下面推荐几个常用的工具包。
- Gensim
- NLTK
- TextBlob
- CoreNLP
- TensorFlow
数据探索
在NLP比赛中一般不使用EDA(探索性数据分析)来称呼自然语言任务中的数据探索,这是因为其数据大多格式统一(文本文件配以一个说明性表格文件)没必要进行过多的探索,达不到分析的地步(只需要示例性地探索说明文件和文本文件即可)。
-
数据集存储信息
通过shell脚本或者Python脚本了解数据集中数据的基本信息,如文本格式,标注方式(文件夹名称标注一批文本或者csv文件逐一标注每个文本,前者更加常用,适用于分布式存储和分类回归等多种任务)等。使用Python脚本更加灵活且保证整个项目的流程化。
-
文本格式
抽样显示文本及其标签或者标注,确认是否需要对文本进行进一步处理,如文本分类中每个文本是给的是否为分词后的结果。
作为比赛参与者,一般关系下面的信息即可。
- 文本长度
- 字频、词频
- 标签的分布
数据预处理
数据决定了模型的上限,算法只是逼近这个上限,所以数据预处理很重要。这一部分主要介绍数据预处理的一些思路,分为中文和英文两种思路。
中文
- 非文本内容删除(正则表达式)
- 处理中文编码问题(转为UTF8)
- 中文分词(Jiaba分词、pkuseg等)
- 引入停用词(哈工大停用词表,停用词取出后的效果不一定很好,特别对于RNN这种序列模型)
- 特征工程
英文
- 非文本内容删除
- 拼写检查及更正
- 词干提取及词形还原(NLTK工具包)
- 大小写转化
- 特征工程
Pipeline制定
目前对NLP比赛,分为两种方法,为传统方法和深度方法。不过近年来,深度方法取得了更好的效果,所以比赛中较好的表现大多都采用了深度方法,尤其是一些新模型。
文本特征构建及建模
文本特征的构建核心的思路就是为每个文本(一句或者一段或者一篇文章)生成一个结构化的特征,方便分类器的训练。
如何生成这种文本的结构化特征,目前主要有两种整体思路,分别为传统方法(机器学习方法)和深度学习方法。
-
传统方法
主要有LDA主题模型、LSI主题模型、TFIDF(词频逆文档频率)等文本特征提取的方法。一般采用传统方法进行特征提取,也会使用传统的机器学习模型进行建模处理,常用的机器学习模型有逻辑回归(LR)、支持向量机(SVM)、LightGBM等。
-
深度方法
主要采用深度网络进行特征提取,是一种自动进行特征编码的机器学习模型,主要有CNN、RNN、Transformer等。使用深度方法进行特征提取则一般构建端到端的系统,所以不会采用其他的传统分类器或者回归器,会在特征的输出层结一个全连接层作为分类或者回归模型。这一步也会有很多网络结构的设计方法,但是我们一般采用前人发明的很不错的结构基础上进行修改,如BERT等。
模型应用
企业提出比赛当然是希望能在业界使用,过于冗余的模型就算metric刷得好看也是不会受到青睐的。
补充说明
本文较为简略的说明了自然语言处理类比赛的主要流程及方法,由于篇幅限制没有过细展开,具体的相关问题可以查看我的其他博客。博客同步至我的个人博客网站,欢迎查看。如有错误,欢迎指正。