1 import com.hankcs.hanlp.tokenizer.NLPTokenizer
import org.apache.hadoop.io.{LongWritable, Text}
import org.apache.hadoop.mapred.TextInputFormat
import org.apache.log4j.{Level, Logger}
import org.apache.spark.ml.feature.Word2Vec
import org.apache.spark.sql.SparkSession /**
* Created by zhen on 2018/11/20.
*/
object Word2Vec {
Logger.getLogger("org").setLevel(Level.WARN) // 设置日志级别
def main(args: Array[String]) {
val spark = SparkSession.builder()
.appName("Word2Vec")
.master("local[2]")
.getOrCreate()
val sc = spark.sparkContext val trainDataPath = "E://BDS/newsparkml/src/news_tensite_xml.smarty.dat"
// 数据预处理
val rdd = sc.hadoopFile(trainDataPath, classOf[TextInputFormat], classOf[LongWritable], classOf[Text])
.map(pair => new String(pair._2.getBytes, 0, pair._2.getLength, "GBK"))
.filter(row => row.contains("content"))
.map(row =>
if(row.contains("content")){
row.substring(row.indexOf(">")+1, row.lastIndexOf("<")).trim()
}else{
null
}
)
.filter(row => !row.equals(null))
// 分词
val segmentResult = rdd.mapPartitions( row =>{
row.map(word => {
val nlpList = NLPTokenizer.segment(word)
import scala.collection.JavaConverters._
nlpList.asScala.map(term => {
term.word.trim()
})
.filter(word => word.length>1) //过滤掉长度小于2的词
.mkString(" ")
})
})
val regex = """^\d+$""".r
//val size = 5
segmentResult.saveAsTextFile("E:/BDS/newsparkml/src/分词结果")
// 加载分词训练数据
val input = sc.textFile("E:/BDS/newsparkml/src/分词结果")
//.filter(row => row.split(" ").length>=size)
.filter(row => regex.findFirstMatchIn(row) == None) //过滤掉无用的数字关键词
.map(row => {
val split = row.split(" ")
val array : Array[String] = new Array[String](split.length)
for(i<- 0 until split.length){
array(i) = split(i)
}
new Tuple1(array)
}) val dataFrame = spark.sqlContext.createDataFrame(input).toDF("text")
dataFrame.foreach(println(_))
//创建Word2Vec对象
val word2Vec = new Word2Vec()
.setInputCol("text")
.setOutputCol("result")
.setVectorSize(50)
.setNumPartitions(64)
//训练模型
val model = word2Vec.fit(dataFrame)
//缓存模型
model.save("E:/BDS/newsparkml/src/Word2VecModel")
//保存词向量数据
/*val vector = model.getVectors.map{
case (word, vector) => Seq(word, vector)
}
vector.toJavaRDD.saveAsTextFile("E:/BDS/newsparkml/src/Word2VecData")*/
//预测
val like = model.findSynonyms("中国", 10)
like.foreach(println(_))
/*for((item, literacy) <- like){
print(s"$item $literacy")
}*/
}
}

分词结果:

分词结果部分数据:

模型:

结果:

分析:

  预测结果与训练集数据紧密相关,Word2Vec会根据训练集中各词之间的紧密程度设置不同的相识度,因此,要想获得较好的预测结果,需要有合适的训练集!

Spark Word2Vec算法代码实现的更多相关文章

  1. LaTeX 算法代码排版 --latex2e范例总结

    LaTeX 写作: 算法代码排版 --latex2e范例总结 latex2e 宏包的使用范例: \usepackage[ruled]{algorithm2e}                     ...

  2. KMP算法代码

    以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码 ...

  3. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技 ...

  4. 经常使用MD5算法代码

    经常使用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请參考 维基百科:MD5  MD5加密后 ...

  5. 带你找到五一最省的旅游路线【dijkstra算法代码实现】

    算法推导过程参见[dijkstra算法推导详解] 此文为[dijkstra算法代码实现] https://www.cnblogs.com/Halburt/p/10767389.html package ...

  6. LDPC译码算法代码概述

    程序说明 V0.0 2015/1/24 LDPC译码算法代码概述   概述   本文介绍了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum ...

  7. 『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&代码讲解+资源打包下载】

    一,什么是TicTacToe(井字棋) 本游戏为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎. ...

  8. 【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)

    阅读须知 本博客涉及到的资源: 正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197 负样本:http://download.csdn.n ...

  9. 编程算法 - 高速排序算法 代码(C)

    高速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的高速排序算法, 作为一个编程者, 不论什么时候都要完整的手写. 代码: /* * m ...

随机推荐

  1. 使用request爬取拉钩网信息

    通过cookies信息爬取 分析header和cookies 通过subtext粘贴处理header和cookies信息 处理后,方便粘贴到代码中 爬取拉钩信息代码 import requests c ...

  2. 【sping揭秘】18、使用spring访问数据

    统一的数据访问异常层次体系 基于基本的jdbc封装dao层访问接口,封装不论是访问,csv文件,关系数据库(RDBMS),ladp都可以封装成一个个DAO对象来进行访问 抛出问题 可是对于我们忽略了一 ...

  3. 测试工具之Jmeter(创建一个简单测试用例)

    前面介绍了如何使用badboy录制jmeter脚本,以及如何导入脚本并进行测试 这里介绍下手动创建测试用例,主要步骤如下: 1.创建线程组 第一次打开Jmeter只有一个测试计划,右键“测试计划”选择 ...

  4. Studying

    美团spark实践:http://tech.meituan.com/spark-in-meituan.html CDH5.6.0-HBase1.0.0:http://archive.cloudera. ...

  5. webpack-loader是怎样炼成的

    目录 啰嗦两句 loader 是干什么的 loader 的工具箱 --context loader 实战 啰嗦两句 学习这件事从学习动机上来看,可以分成两种情况:主动学习和被动学习.主动学习就是,某天 ...

  6. Create and Embed an Application Manifest (UAC)

    http://msdn.microsoft.com/en-us/library/bb756929.aspx 可以在VS2008中设置当执行exe时弹出提升管理员权限对话框:xx Property-&g ...

  7. CentOS 6.5 网络服务器功能的实现②:运用光盘(镜像)制作一个本地yum源

    在用Linux安装软件时(rpm安装方式),有时会出现“包依赖”的现象.因此,我们可以用yum工具来实现一次性安装所有rpm工具包的功能. 实例:在此服务器上用yum的方式安装DHCP服务和TFTP服 ...

  8. 基于vue2.0实现仿百度前端分页效果(二)

    前言 上篇文章中,已经使用vue实现前端分页效果,这篇文章我们单独将分页抽离出来实现一个分页组件 先看实现效果图 代码实现 按照惯例,我们在冻手实现的时候还是先想一想vue实现组件的思路 1.需要提前 ...

  9. Hibernate学习(二)———— 一级缓存和三种状态解析

    一.一级缓存和快照 什么是一级缓存呢? 很简单,每次hibernate跟数据库打交道时,都是通过session来对要操作的对象取得关联,然后在进行操作,那么具体的过程是什么样的呢? 1.首先sessi ...

  10. MVC中 jquery.validate取消忽略对hidden的验证

    <script type="text/javascript"> $.validator.setDefaults({ //取消 忽略对hidden的验证 ignore: ...