- 队名:无敌风火轮
- 成绩:初赛第三,复赛第四,决赛第四
写在前面
这次比赛是我第一次完完整整参加下来的比赛。一开始的时候,自己遇到了挺多的困难,不过很幸运结识了很棒的队友们,一起努力和提高,并在北京一起参加了决赛。虽然最终很遗憾和前三擦肩而过,不过还是收获很大。决赛的队伍都有很好的思路和方法,答辩的时候学习到了很多。
本文旨在分享一下我们队的解决方法以供参考,并且总结记录一下别人的良好思路。代码稍微整理了一下,放在了github上抛砖引玉,有需要的可以自取~
题目描述
大赛官网对赛题的描述如下:
参赛队伍利用搜狐给定的数据集来训练模型,训练数据分为标注数据(数据集规模为5万条新闻和35万张新闻配图,标注为有营销意图的新闻、文本片段和配图),和未标注数据(数据规模为20万条新闻和100万张新闻配图)。比赛要求在给定新的新闻内容集合和配图集合之后(数据集规模为1万条新闻和7万张新闻配图),参赛队伍能识别出有营销意图的新闻、文本片段和配图。
赛题的三个任务较为明确,每个任务都不简单。个人觉得比较难的地方主要有三点:
- 标注的新闻标签有3类,分别是0(无营销性),1(部分营销),2(强营销性),其中各个类别之间的区分较为模糊,给直接分类带来了困难;
- 关于营销图片提取部分,图片数据量较大,同时营销性的定义也较为模糊;
- 营销文本提取的评分规则较为严苛,必须标点、空格等均匹配才能得分。这部分基本所有队都没有找到很好的解决方法,做了的队基本都是用的基于规则的提取方法。
总体思路
数据处理
去html标签
利用官方给的tool.py
去除html标签,得到filter文件。
分词
利用jieba
对训练集,验证集,未标注数据集进行分词,根据分词结果,添加了外部词典,保证分词的准确。
Word2vec特征
用训练集,测试集和未标注数据集组成训练语料,训练word2vec
词向量。
TFIDF特征
对训练集和测试集的数据集进行tfidf统计特征抽取,分别使用分词文本+ 词特征和未分词文本+字特征构建TFIDF词典。采用tri-ngram
, 词典大小为30000,除去出现频率大于0.95的停用词和出现概率小于3次的生僻词,建立VSM向量空间模型。
手工特征
在分词之前,通过正则匹配的方式提取出营销文本中比较重要的四个特征:电话号码,邮箱,网址以及与微信相关的特征,作为后续模型训练的特征。如果一篇文章中含有该特征,特征向量则为:
[电话号码,邮箱,网址,微信相关]
对应维度为1,否则为0。
新闻标签分类
一开始我们尝试的是直接三分类,但是效果有限。比赛后期我们转变了思路,一直用的二-二分类,取得了不错的效果。决赛的队伍好像也只有我们队这么做。
01-2 二分类
我们通过对数据的观察分析,认为标签为2的强营销新闻一般长度较短,容易以简单的特征区分。因此考虑先将三分类化为二分类问题,先识别出强营销性新闻,保证一个较高的baseline分数。
0-1 二分类
同理,由于01标签的数据表现特征相似,因此需要挖掘深层次的信息来区分。再对0-1的新闻进行分类,进一步提升结果。
营销图片提取
这个问题的一般思路是进行图片分类,我们一开始也采用了GoogleNet
进行图片分类,但是效果不佳,原因可能是图片的营销性定义和表现都不明显。最后直到决赛也没有看到有较好的图片分类模型。后来我们转换思路,用了tessract
进行OCR文字识别,同时使用CTPN
进行图片文字区域的定位,在时间和精度上都取得了不错的效果。
图像文本识别
OCR即光学字符识别,用来识别图片中的文字。我们首先对图片进行灰度化,然后使用tesseract
进行文本识别。
营销性分类
将新闻分句后建立模型,进行句子营销性分类,从而对OCR得到的文本进行二分类。
文本区域检测、筛选
使用Connectionist Text Proposal Network(CTPN)
检测文字区域,计算其面积。使用面积阈值对文字区域面积较小的营销图片进行剔除,修改为非营销图片。
营销文本提取
关键词提取
人工选取的一些营销关键词如下图。
营销文本提取
从结果文件中标签为1的新闻里,提取含有上述关键词的句子片段。此处提取句子基于含有html标签的数据集,保证精准。
主要模型
LightGBM
LightGBM
是现在很火的方法,采用Histogram算法,其思想是将连续的浮点特征离散成k个离散值,并构造宽度为k的Histogram。然后遍历训练数据,统计每个离散值在直方图中的累计统计量。在进行特征选择时,只需要根据直方图的离散值,遍历寻找最优的分割点。在我们的尝试中,它的效果好于XGBoost
,是我们的主力模型。
NBSVM
来自论文Baselines and Bigrams: Simple, Good Sentiment and Topic Classification,通过将 Naive Bayes
得到的概率与原始数据相结合的结果作为SVM
的输入(可以看作是对SVM
的一种正则化),将两种最常见的基础分类模型很好的结合起来,形成一种通用性强、效果更佳的基础模型。在我们的尝试中,它的效果好过LR
和SVM
,是我们早期的主力模型之一。
TextCNN
TextCNN
是利用卷积神经网络对文本进行分类的算法,它可以捕捉局部相关性,提取句子中类似n-gram的关键信息。
TextRNN
TextCNN
能够在很多任务里面能有不错的表现,但它有个最大问题是固定 filter_size的视野,一方面无法建模更长的序列信息,另一方面 filter_size的超参调节也很繁琐。
具体在文本分类任务中,Bi-directional RNN
从某种意义上可以理解为可以捕获变长且双向的的 n-gram 信息。
我们使用了Bi-LSTM
,Bi-GRU
等模型。
TextRCNN
TextRCNN
结合了CNN和RNN的特点,首先利用前向和后向RNN得到每个词的前向和后向上下文的表示,这样词的表示就变成词向量和前向后向上下文向量concat起来的形式了,最后再接跟TextCNN
相同卷积层,池化层即可,
CTPN
图片文本区域识别我们采用了CTPN模型,来自文章 Detecting Text in Natural Image with Connectionist Text Proposal Network,我们参考的是Github上的博主对它的TensorFlow实现。
CTPN
实际上是目标检测经典模型FasterRCNN
的一个改进,同样使用了RPN网络,区别在于固定了anchor的宽度和加入了Bi-RNN
层,用以检测出水平位置上的文本信息,并通过side-refinement
进行连接。具体原理可参考知乎专栏,讲解地很清楚。
模型提升
多维度融合
针对各个阶段特征和模型的特点,我们采用多维度处理和针对性使用不同的融合方法,得到了较大提升。
多维度
- 分词文本+wordtfidf和未分词文本+chartfidf构建词典
- 使用tfidf特征进行lgbm和使用word2vec特征进行lgbm
- 采用不同维度的word2vec向量
- 加入手工特征
融合
- 第一个二分类,根据特点采用二十五个结果的投票法;
- 深度学习模型直接输出类别精度较差,采用每个维度下的四个模型结果做概率平均融合,得到结果;
- 第二个二分类,考虑到之后进行的图片文字提取和P,R对分数的影响,以及三种最终模型的特征差异性较大,采用了贪婪投票法,只要三个最终模型有一判定为标签1即为1.
数据增强
我们通过对未标注数据进行标注,并按不同比例加入未标注数据来进行数据增强,这是大家都采用了的做法。
数据增强还有一种很好的方法是进行翻译,我们有考虑过但是没来得及做。最终的第一名就采用了翻译的方法。
面积筛选
在提供的训练集中,我们发现文字区域比较小,且文字带有一定的营销意图的图片在营销图片和非营销图片中都有大量出现。同时考虑到较小的文字区域很可能被忽视,所以我们最终将文字区域面积小于一定阈值的营销图片重分类为非营销。
总结思考
一些思考
- 简单的模型未必就效果不好,有队伍只使用了
XGBoost
,也有队伍直接用一个12层的MLP
直接进行三分类的,效果都很好,完爆我们的单模型分数; - 关于词向量的初始化,可以采用预训练的词向量进行权重初始化,可参考刚刚开源的上百种预训练中文词向量;还有一种比较好的方法是先冻结
embedding
层,将模型训练一段时间后再进行embedding
层初始化; - 采用
Semi-supervised
方法对未标注集进行更好的利用; - 针对训练集数据不平衡问题,是否有更好的解决方法;
- 新闻标签分类只利用了文本特征,但很多营销新闻只有图片有营销性,因此若能将图片特征和文本特征一起考虑进去进行分类,效果可能会更好;
- 使用图片识别下来的文本进行数据扩充和模型训练;
- 关于图片分类模型,直接分类效果不佳,可以考虑加入如
Attention
、Residual
、k-max-pooling
等技巧,对神经网络进行改进; - 第一名的队伍还用到了
snapshot emseble
,减少了模型训练时间;
总结
这次的比赛收获还是很大,决赛期间搜狐的招待也很周到,也结识到了很多优秀的朋友。希望大家以后江湖还能相见~