注:本文为赛前所写,仅队内提供大致思路,和实际的解题流程有一定出入,仅供参考,有一些错误,笔者并没有更正(主要是没空),如想深入交流请私信。
1.对留言进行分类
1.1对数据进行分析。
- 观察数据集规模,是否有空值,是否重复记录
- 留言的长度,最大最小值和极差。可绘制词数直方图,确定padding长度。
- 有多少个一级分类,涉及到多少种分类
- 未登陆词有哪些,关键是地名
1.2 数据预处理
- 整体数据集去重复
- 对回复文本去除数字标点符号去停用词,并进行分词处理
- 建立词索引词典,将词语id表示
- 简单地词频向量化,每条回复用一个词频向量表示 X i X_{i} Xi,一维稀疏向量。
- 使用word2vec词向量表示,每个词向量的维数为k,每条回复中有n个词,每条回复用一个矩阵表示 R i R_{i} Ri, R i R_{i} Ri是一个 k × n k \times n k×n的矩阵
- 为每一个标签进行量化。或者onehot化
1.3 Baseline模型
使用朴素贝叶斯训练一个多分类模型,输入使用词频向量(经过tf-idf特征提取),使用测试集测试,计算F-score作为baseline
或者SVM,或者多层感知机,在此基础上可以使用组合方法提高准确率。
1.4 CNN神经网络模型
首先使用语料库(笔者做完之后发现使用词向量反而准确率降低了,原因可能是使用的维基百科语料库中的语料和训练数据差异太大,因此可以使用tensorflow 中embedding层自行训练)训练出word2vec模型,把每一个词用向量表示出来。假设用零向量填充,得到一个回复矩阵。
开始使用CNN训练多分类模型,计算F-score。调整参数,词向量的维度、卷积核大小(必须和词向量的维度匹配,只能一个方向移动)、batch_size、卷积层和池化层的层数、激活函数、优化器选择、正则化处理。