概述

Word2vec是一款由谷歌发布开源的自然语言处理算法,其目的是把words转换成vectors,从而可以用数学的方法来分析words之间的关系。Spark其该算法进行了封装,并在mllib中实现。

整体流程是spark离线训练模型,可以是1小时1训练也可以1天1训练,根据具体业务来判断,sparkstreaming在线分析。

由于历史问题,spark还在用1.5.0,接口上和2.1还是有点区别,大概看了下文档,流程上差不多

spark离线训练

如下代码,通过word2vec训练出一个模型,并且找出“导弹”的10个近义词

    val input = sc.textFile("word2vec.txt").map(line => line.split(" ").toSeq)
val word2vec = new Word2Vec()
word2vec.setMinCount(1)
word2vec.setNumPartitions(1)
word2vec.setNumIterations(1)
val model = word2vec.fit(input)
val synonyms = model.findSynonyms("导弹", 10)
for((synonym, cosineSimilarity) <- synonyms) {
println(s"$synonym $cosineSimilarity")
}
  model.save(sc,"myModelPath")

参数解释

参数

默认

解释

vectorSize

100

向量的维度,一般维度不会太大,通常在100-500

learningRate

0.025

Sets initial learning rate

numPartitions

1

分区个数,设置多个可以提高计算效率,但会少量的numpartitions有利于精确度

numIterations

1

迭代次数,应该小于等于numPartitions

经过粗略的测试,适当提高numPartition可以加快word2vec的计算速度

测试结果

每次测试的结果都有点不同,大致差不多

这里说明一点,结果中第一个字段是word,第二个字段是余弦相似度,由于sparkmllib考虑到计算效率,没有用完成的余弦相似度公式,所以结果会大于1,但这并不影响相似度的判断

测试数据下载地址,数据集为搜狗语料分类中的军事篇

http://files.cnblogs.com/files/ulysses-you/word2vec.zip

sparkstreaming在线分析

这个demo用了socket接口(这样测试是最方便的..),实现了在线对word2vec模型的调用

  val model = Word2VecModel.load(ssc.sparkContext, "myModelPath")
val lines = ssc.socketTextStream("localhost",9999)
// Split each line into words
val words = lines.flatMap(_.split(" "))
// Count each word in each batch
words.map{word =>
val synonyms = model.findSynonyms(word,10)
for((synonym, cosineSimilarity) <- synonyms) {
println(s"syn => $synonym $cosineSimilarity")
}
}

参考资料

//numPartitions和numIterations数量的相似问题

http://stackoverflow.com/questions/37582929/how-are-number-of-iterations-and-number-of-partitions-releated-in-apache-spark-w

//官方1.5.0版本的word2vec介绍

http://spark.apache.org/docs/1.5.0/mllib-feature-extraction.html#word2vec

最新文章

  1. [正则表达式]PCRE反向分组引用
  2. 【BFS】POJ 2251
  3. 微信企业号办公系统-图片预览放大功能-previewImage
  4. loj 1044(dp+记忆化搜索)
  5. 百度Site App的uaredirect.js实现手机访问,自动跳转网站手机版
  6. 怎么 才能显示Eclipse中Console的全部内容
  7. requirejs
  8. Oracle truncate和delete的区别
  9. myeclipse页面编辑框空格、回车符、对齐出现特殊字符
  10. hive操作语句使用详解
  11. 父节点使用css的transform: translate(0, 0)时position:fixed在chrome浏览器中无效
  12. php中对共享内存,消息队列的操作
  13. (十一)学习CSS之float属性
  14. java中字符输入输出流在输出结果的结尾多一个乱码字符:&#39;?&#39;
  15. svn常见问题汇总
  16. .NET 十五岁,谈谈我眼中的.NET
  17. mac下selenium+python环境搭建
  18. 基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作
  19. FileSaver.js 介绍
  20. 用java理解程序逻辑小结

热门文章

  1. js,jq获取元素位置属性及兼容性写法
  2. python 基础知识(待补充)
  3. SearchBar简单展示
  4. 老李分享:QTP的录制原理以及实现
  5. thinkphp3.2.x多图上传并且生成多张缩略图
  6. cassandra高级操作之JMX操作
  7. android开发之-数据存储Map、HashMap、Hashtable、concurenthashmap区别
  8. 读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”
  9. .dll 文件编写和使用
  10. PHPCMS笔记第二弹