一. 前言
由于参加了搜狐的第一届算法大赛,所以对第二届的竞赛还是比较关注和期待的。第二届是关于新闻内容(文本和图片)识别:是否为营销文章(0,非营销;1,部分营销;2,完全营销)。营销大部分根据文本判定,少部分根据图片判别。具体可见官网。该方案只考虑了文本的识别,最终名次:第七名。
二. 代码说明
针对该比赛,我们使用的是python3和java8的语言环境,代码中主要涉及的包有:numpy、pandas、sklearn、gensim、tensorflow、keras、xgboost、HanLP。代码中主要分为特征提取、常用工具与模型构建的三类文件,下面对各代码文件作简要说明:
data目录: 数据及模型存储路径。
keras_retinanet目录:目标检测算法retinanet代码目录(最终未采用)。
utils目录:HanLP工具java代码,包含分词代码与词性特征提取代码,由于java代码分词速度远比pyhanlp快,最终采用java代码做分词和词性特征提取。
preprocess.py:主要实现对数据进行预处理:过滤只有图片没有片段的1类新闻、数据清洗、文本分词(jieba和HanLP)。
feat_TF-IDF_stack.py:TF-IDF stacking特征生成,包含TF-IDF特征提取,各基础模型(LogisticRegression、MultinomialNB、BernoulliNB)的5折训练及训练集特征提取,测试集stacking特征提取。每个模型输出[num_samples x 3]的特征。
feat_nature_stack.py:词性stacking特征生成 ,根据java代码输出的词性统计特征,运用各基础模型(LogisticRegression,MultinomialNB,BernoulliNB)对训练集做词性stacking特征提取,测试集stacking特征提取。每个模型输出[num_samples x 3]的特征。
feat_w2v_model.py:词向量特征提取提取,输出包括:[num_samples x 300]的求和词向量,[num_samples x 300]的均值词向量以及TF-IDF与词向量的权值词向量。最终采用均值词向量作为文本的词向量特征。
feat_d2v_model.py:Doc2vec stacking特征,主要提取了Doc2vec两种训练方法的特征,运用神经网络分别做5折stacking,为训练集和测试集提取两类[num_samples x 3]的stacking特征。
feat_statistic.py:统计特征提取,主要包含:标题及文本长度、图片数量、文本中关于钱出现的次数、网站出现次数、电话出现次数、日期出现次数、营销词汇出现次数等各类统计特征。
get_segs.py: 为预测为1类的新闻添加营销片段。
predict.py:加载模型预测并输出提交结果文件。
tools_py3.py:主办方提供的tool.py对应的python3版本,来及群内分享。
param.py:各类参数配置代码:jieba、hanlp分词工具选择,是否去停词,是否训练,各类数据、模型保存路径。
utils.py:主要工具代码:日志打印、数据读取、去除BOM、sklearn模型的加载与保存、评估函数
STFIWF.py:改进的TF-IDF特征提取代码,考虑标签与词频的关系,主要参考自[here]。
detect.py:图片二维码、小程序、电话、网址检测代码(最终未采用)。
xgb_blending.py模型线下验证、模型训练代码。
三. 最优结果生成文档
1). 模型说明
分类模型:我们主要运用了四类基础模型对部分特征做stacking,输出若干个[num_samples x 3]的stacking特征,拼接 上均值词向量特征与文本统计特征,用于最后xgb模型训练。针对TF-IDF与词性这类稀疏特征,我们采用LogisticRegression、MultinomialNB和BernoulliNB的基础模型,而对于Doc2vec的dbow与dm特征,我们使用keras搭建的神经网络模型。最后参数抖动训练五个xgb模型,将5个xgb模型的输出结果求均值作为最后的输出结果,按照概率最大得到最终类别预测结果。
片段提取:对于营销片段提取,我们采用规则匹配的方法。即:针对,预测为1类的新闻文本,直接判断测试集中新闻文本是否包含训练集中的营销片段,若能匹配到,则提取作为营销片段的预测输出。
模型结构如下:
模型结构图
2). 特征说明
我们从 5个方面对新闻文本进行特征构建,分别是:基于TF-IDF的特征、基于词性的特征、基于 Word2Vec 的特征、基于 Doc2Vec 的特征和文本统计特征。
基于TF-IDF的特征
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术。tf-idf 是一种统计方法,用以评估一字词对于一个文档集或一个语料库中的其中一份文档的重要程度。字词的重要性随着它在文档中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF的不足在于:单词在文档中的出现次数TF对于整体权重影响过大;没有考虑到单词在不同类间的分布差异。于是,我们没有采用sklearn中的TfidfVectorizer 提取特征,而是参考[here]使用改进后的TfidfVectorizer 提取文本TF-IDF特征。但是TF-IDF属于高维稀疏向量,直接使用树模型进行训练不仅速度较慢且效果不一定很好。于是,我们采用了一种比较流行的做法,就是做一层 stacking,将高维稀疏特征转化为低维稠密向量。在这里我们尝试了很多个基础模型,最终使用了LogisticRegression,MultinomialNB和BernoulliNB。基于词性的特征
我们使用了HanLP汉语言处理工具包提取了文本的词性特征,共148类,并统计各类词性出现的次数与比例、以及整体的信息熵。词性统计特征同样拥有TF-IDF稀疏的特性,于是我们采用了同样的三个基模型对词性统计特征做了一层stacking。- 基于 Word2Vec 的特征
Word2Vec 方法,可以将词语直接表示成一个固定长度的向量。对于Word2Vec特征,我们选定的维数为300维,并将训练数据(打标数据与未打标数据)中词频低于5的词语过滤掉。一篇文档的词向量特征,我们尝试了对每个词求和、求均值、基于TF-IDF加权的操作。最终由于词向量求和效果不好,加权操作计算量过大而选择均值词向量作为文档的Word2Vec 特征向量。 - 基于 Doc2Vec 的特征
使用 Doc2Vec 方法,可以将文档直接表示成一个固定长度的向量。根据训练文档向量的网络结构的不同,可以分为 Distributed Memory(DM)与 Distributed Bag of Words(DBOW)两种模型。其中 DM 模型不仅考虑了词的上下文语义特征,还考虑到了词序信息。DBOW 模型则忽略了上下文词序信息,而专注于文档中的各个词的语义信息。我们同时采用了 DBOW 和 DM 这两种模型构建文档向量,希望能够保留文档中完整的信息。
我们选择Doc2Vec的维数为300,并采用迭代的训练方法,进行多次重复训练,每一次都需要对训练数据(打标数据与未打标数据)重新打乱,以提高分类精度,DBOW 模型的迭代次数为 5,DM 模型的迭代次数为 10。我们对这两类文档向量分别做了一层 stacking,使用了一个简易的神经网络模型,只有一层 300 维的隐含层,进行训练并构建下一层模型需要的特征。 - 文本统计特征
本次竞赛要求尽可能识别营销类别的文章,于是营销词汇如:“优惠”、“特惠”、“加盟”、“利润空间大”、“免费”、“实惠””……;同时,我们发现1类文章多为转载文章,片段中的词汇如:“来源”、“转载”、“出自”,“版权”……;这些词汇对文本分类会起着重要的作用。我们基于训练数据建立了两个字典,并统计标题、文本中出现第一类词汇的次数,内容文本最后一句中第二类词汇出现的次数。另外还统计了文本长度、标题长度、图片数量、关于钱的内容、时间、日期、微信、QQ、ID等各类特征。3). 提升改进
- 更加细致的数据清洗工作,运用正则表达式做各种文本替换:时间、日期、电话、网址、微信、QQ、ID、关于钱的内容、打折信息、【】《》里的内容等。
- 选择更好的基础模型,在若干个基础模型中选择了较优的几个模型。
- 修改、增加部分统计信息。