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会根据训练集中各词之间的紧密程度设置不同的相识度,因此,要想获得较好的预测结果,需要有合适的训练集!

最新文章

  1. SAP 传感器辅助定位
  2. Ubuntu14.04搭建Caffe(仅CPU)
  3. GIM企业即时通讯
  4. 5050 [JL] 他爱上了鸭蛋
  5. mysql5.7.9 源码安装 (转)
  6. c/c++面试总结(1)
  7. linux 命令学习大全
  8. Arrays常用API的事例
  9. Oracle 优化——位图、函数等索引介绍
  10. 十一、观察者模式(Observable、Observer)
  11. runnable与handler结合使用,其实跟在Thread中的run()中sleep的效果是一样的
  12. pyhton:图像旋转
  13. NHibernate从入门到精通系列(2)——NHibernate环境与结构体系
  14. 一款Android图文识别与扫描软件
  15. LINQ to SQL 的常见异常及解决办法
  16. C语言的数据类型的本质和提高学习
  17. win 10 slmgr.vbs -xpr 无法运行,被豆麦笔记打开解决方法
  18. java基础面试题常出现(一)
  19. logstash_output_mongodb插件用途及安装详解
  20. Wifi Troughput Test using iperf

热门文章

  1. redis epoll 原理梗概
  2. Python Socket请求网站获取数据
  3. 国外程序员整理的 C++ 资源大全 (zt)
  4. 博客维护停止,需要的伙伴们移步http://blog.csdn.net/panhouye
  5. ACM学习大纲
  6. 【详解】Spring Security 之 SecurityContext
  7. linux nohup
  8. 开发php的扩展模块(centos环境下)
  9. OpenCV3三种超像素分割算法源码以及效果
  10. 使用GitHub搭建个人博客