代码放在github上:click me

一、数据说明

数据集为英文语料集,一共包含20种类别的邮件,除了类别soc.religion.christian的邮件数为997以外每个类别的邮件数都是1000。每份邮件内部包含发送者,接受者,正文等信息。

二、实验方法

2.1 数据预处理

数据预处理阶段采用了几种方案进行测试

  1. 直接将邮件内容按空格分词

  2. 使用stanford corenlp进行分词,然后使用停词表过滤分词结果

  3. 使用stanford corenlp进行分词,并根据词性和停词表过滤分词结果

综合上面三种方案,测试结果最好的是方案二的预处理方式。将所有的邮件预处理之后写入一个文件中,文件每行对应一封邮件,形式如"类别\t按空格分隔的邮件分词"

comp.os.ms-windows.misc    I search Ms-Windows logo picture start Windows
misc.forsale ITEMS for SALEI offer item I reserve the right refuse offer Howard Miller
comp.sys.ibm.pc.hardware I hd bad suggest inadequate power supply how wattage

2.2 pipeline建模

基于spark的pipeline构建端到端的分类模型

  • 将数据预处理后得到的文件上传到hdfs上,spark从hdfs上读取文本数据并转换成DataFrame

  • 为DataFrame的邮件类别列建立索引,然后将DataFrame作为Word2Vec的输入获取句子的向量表示

  • 句子向量输入到含有2层隐藏层的多层感知机(MLP)中进行分类学习

  • 将预测结果的索引列转换成可读的邮件类别标签

graph LR
A[dataset] -- input --> B[Word2Vec]
B[Word2Vec] -- embeddings --> C[MLP]
C[MLP] -- output --> D[prediction]

三、实验结果

将数据集随机划分成8:2,80%的数据作为训练集,20%的数据作为测试集。经过合理的调参,在测试集上的accuracy和F1 score可以达到90.5%左右,关键参数设置如下

 // Word2Vec超参
final val W2V_MAX_ITER = 5 // Word2Vec迭代次数
final val EMBEDDING_SIZE = 128 // 词向量长度
final val MIN_COUNT = 1 // default: 5, 词汇表阈值即至少出现min_count次才放入词汇表中
final val WINDOW_SIZE = 5 // default: 5, 上下文窗口大小[-WINDOW_SIZE,WINDOW_SIZE]
// MLP超参
final val MLP_MAX_ITER = 300 // MLP迭代次数
final val SEED = 1234L // 随机数种子,初始化网络权重用
final val HIDDEN1_SIZE = 64 // 第一层隐藏层节点数
final val HIDDEN2_SIZE = 32 // 第二层隐藏层节点数
final val LABEL_SIZE = 20 // 输出层节点数

邮件预测结果输出在hdfs上,文件内容每行的de左边是真实label,右边是预测label

四、实验运行

4.1 环境要求

hadoop-2.7.5

spark-2.3.0

stanford corenlp 3.9.2

4.2 源代码说明

Maven项目文件结构如下

src/main/scala下为源代码,其中Segment.java和EnglishSegment.java用于英文分词,DataPreprocess.scala基于分词作数据预处理,MailClassifier.scala对应邮件分类模型。input下为数据集,output下为数据预处理结果MailCollection和预测结果prediction,target下为maven打好的jar包Mail.jar以及运行脚本submit.sh,pom.xml为maven配置。

4.3 运行方式

将数据集20_newsgroup放在input目录下,确保pom.xml中的依赖包都满足以后运行DataPreprocess得到预处理的结果MailCollection输出到output目录下。启动hadoop的hdfs,将MailCollection上传到hdfs上以便spark读取。然后启动spark,命令行下进入到target路径下运行./submit.sh提交任务,submit.sh内容如下

spark-submit --class MailClassifier --master spark://master:7077 --conf spark.driver.memory=10g --conf spark.executor.memory=4g --conf spark.executor.cores=2 --conf spark.kryoserializer.buffer=512m --conf spark.kryoserializer.buffer.max=1g Mail.jar input/MailCollection output

运行MailClassifier需要两个命令行参数,其中input/MailCollection为上传到hdfs上的路径名,output为预测结果输出到hdfs上的路径名,提交任务前确保输出路径在hdfs上不存在,否则程序会删除输出输出路径以确保程序正确运行。

基于spark邮件自动分类的更多相关文章

  1. 基于Spark Mllib的文本分类

    基于Spark Mllib的文本分类 文本分类是一个典型的机器学习问题,其主要目标是通过对已有语料库文本数据训练得到分类模型,进而对新文本进行类别标签的预测.这在很多领域都有现实的应用场景,如新闻网站 ...

  2. 基于Spark ALS构建商品推荐引擎

    基于Spark ALS构建商品推荐引擎   一般来讲,推荐引擎试图对用户与某类物品之间的联系建模,其想法是预测人们可能喜好的物品并通过探索物品之间的联系来辅助这个过程,让用户能更快速.更准确的获得所需 ...

  3. 【基于spark IM 的二次开发笔记】第一天 各种配置

    [基于spark IM 的二次开发笔记]第一天 各种配置 http://juforg.iteye.com/blog/1870487 http://www.igniterealtime.org/down ...

  4. 大数据实时处理-基于Spark的大数据实时处理及应用技术培训

    随着互联网.移动互联网和物联网的发展,我们已经切实地迎来了一个大数据 的时代.大数据是指无法在一定时间内用常规软件工具对其内容进行抓取.管理和处理的数据集合,对大数据的分析已经成为一个非常重要且紧迫的 ...

  5. 基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言

    基于Spark和SparkSQL的NetFlow流量的初步分析--scala语言 标签: NetFlow Spark SparkSQL 本文主要是介绍如何使用Spark做一些简单的NetFlow数据的 ...

  6. UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现

      UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现   测试数据 java代码 package com.hzf.spark.study; import ...

  7. UserView--第一种方式set去重,基于Spark算子的java代码实现

    UserView--第一种方式set去重,基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import java.util.Ha ...

  8. 基于Spark自动扩展scikit-learn (spark-sklearn)(转载)

    转载自:https://blog.csdn.net/sunbow0/article/details/50848719 1.基于Spark自动扩展scikit-learn(spark-sklearn)1 ...

  9. 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用

    https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...

随机推荐

  1. 利用java反射动态调用方法,生成grid数据

    项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...

  2. cdn.bootcss.com无法访问 解决方法

    今天angularjs的网站突然加载报错,提示Refused to execute script from 'https://cdnjs.com/' because its MIME type ('t ...

  3. NGUI的sprite的使用(九宫切图)

    一,图集的添加和背景图的选择 图集的选择Atlas和背景图的选择Sprite 二,type的sliced切背景图的使用 当选择Sprite后的edit时,我们就可以设置当前背景图的边距,也有切图的意思 ...

  4. Mac下安装nodejs,然后安装Vue-devtools工具

    一.安装nodejs 1.这一步简单,只要上官网下载下来,直接按照提示安装就可以,mac版本的安装方法很简单. 下载nodejs的官方网址是:  nodejs.org    ,浏览器输入就可以跳转到了 ...

  5. ES6——变量

    ES6变量: 1.var 可以重复声明: 无法限制修改: 没有块级作用域:(如,{...},if(){..} ...) 2.let 不可以重复声明,变量—可以重复修改,有块级作用域: let a = ...

  6. java 指定日期后n天

    RT 算时间本来就是我的弱项:不废话了,贴代码 想传什么参数自己在改改就ok,传入String,放回String public class Text { public static void main ...

  7. java ArrayList练习题

    package java06; /* *随机产生6的1——33的数字,并存储到列表中,再进行遍历 * */ import java.util.ArrayList; import java.util.R ...

  8. C#基础知识之类和结构

    虽然项目中一直在使用类.结构体等类型,仔细琢磨,还真无法系统的说出个所以然.记录一下类.结构体.类和结构体区别 一.类 对于类,大家都特别熟悉.简单的介绍一下类的结构,然后记录一下Class需要注意的 ...

  9. MySQL系列之二四种隔离级别及加锁

    事务 1.定义:所有操作必须成功完成,否则在每个操作中所作的所有更改都会备撤销. 2.事务的ACID 原子性atomicity   一致性consistency   隔离性isolation   持续 ...

  10. 前端每日实战:49# 视频演示如何用纯 CSS 创作一支诱人的冰棍

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/vrxzMw 可交互视频教程 此视频 ...