- Author:yudake
- date:2018/2/22
github 地址: github.com/yudake/porn
背景
信息爆炸是当今互联网的一大特征, 人们可以在互联网上搜索到各种各样的信息互联网因为其传播的便利性, 也成了很多作者发表文章的地方现如今很多知名的作者都是通过发表网络小说而依据成名, 包括我最喜欢的网络小说作家之一天下霸唱同时很多经典的名著也被制作成了电子书, 方便人们阅读
但是, 有些作者发表的文章充斥着色情与暴力, 一旦被青少年看到, 会产生难以想象的后果我们需要对网络上的文章进行检测, 以标记出其是否为色情文章, 如果是, 那么我们就要将其过滤不予显示而人工检测在信息爆炸的今天几乎不可能实现所以, 我们提出了基于神经网络的色情文章检测
具体的模型工作原理可以参考我翻译的一个关于 NLP 中 CNN 研究的博文
数据
我们的数据保存在 csv 文件中, 共两列, 分别是:
label:
1: 色情文章;
0: 非色情文章;
fiction: 数据
其中色情文章 11999 篇, 非色情文章 11749 篇, 共 23748 篇文章
数据处理
因为色情文章中往往会有较多的标点符号, 而且网络小说中也会有各种乱码存在, 对我们提取特征造成困难所以, 我们先把文章中的特殊字符与标点符号去掉
然后, 我们考虑到一篇小说可能会有上万字甚至更多而文本卷积神经网络要求所有输入数据有一个统一的长度, 如此长的数据对计算压力要求太高而且如此长的数据对于模型来说没有很大意义
考虑到一篇文章内, 往往中间部分的内容比较能够代表本篇文章的主旨, 所以我们数据的选取方式如下所示:
如果文章大于 3000 个词, 则选取中间的 1500 个词;
如果文章小于 3000 个词, 但是大于 1500 个词, 则选取最后 1500 个词;
如果文章不大于 1500 个词, 则利用特殊符号补全到 1500 个词
我们的数据是中文数据, 不像英文单词可以利用空格进行区分单词我们使用的 jieba 库对文章进行分词
将选取好的数据转换成数字后, 文章数据如图所示:
模型
其中 conv1 的卷积核大小为 2, 也就是对嵌入矩阵的相邻两行进行卷积计算, conv2 的卷积核大小为 3,conv3 的卷积核大小为 4,conv4 的卷积核大小为 5 每个卷积的维度为 2, 也就是有两个大小相同的卷积核进行卷积经过卷积之后生成了两个 1499*1 向量, 两个 1498*1 向量, 两个 1497*1 向量, 两个 1496*1 向量
在池化层对 8 个向量进行最大池化, 分别从每个卷积提取出 1 个特征值将 8 个特征值拼接成一个 8*1 维向量, 至此, 我们就把文章中的特征提取出来了
最后, 我们将提取出来的特征送入 softmax 层进行分类, 获得最终结果
神经网络具体工作流程见翻译的博文
训练
参数设置
batch_size = 16
循环次数 = 3
学习率 = 0.005
嵌入矩阵维度 = 32
交叉验证机与测试集选取
我们选取 2000 条数据作为测试集, 剩余数据作为训练集
然后在每次训练循环中随机抽取剩余数据的 10% 作为交叉验证集
Accurate 变化
可以看出, 在训练稳定之后, 训练集上的准确率保持在 90% 以上, 平均准确率在 98% 以上
在交叉验证集和测试集的平均准确率也在 98% 以上
by yudake.
来源: https://juejin.im/entry/5a8f8954f265da4e82635ddc