基于spark和sparkstreaming的word2vec
概述
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数量的相似问题
//官方1.5.0版本的word2vec介绍
http://spark.apache.org/docs/1.5.0/mllib-feature-extraction.html#word2vec
最新文章
- [正则表达式]PCRE反向分组引用
- 【BFS】POJ 2251
- 微信企业号办公系统-图片预览放大功能-previewImage
- loj 1044(dp+记忆化搜索)
- 百度Site App的uaredirect.js实现手机访问,自动跳转网站手机版
- 怎么 才能显示Eclipse中Console的全部内容
- requirejs
- Oracle truncate和delete的区别
- myeclipse页面编辑框空格、回车符、对齐出现特殊字符
- hive操作语句使用详解
- 父节点使用css的transform: translate(0, 0)时position:fixed在chrome浏览器中无效
- php中对共享内存,消息队列的操作
- (十一)学习CSS之float属性
- java中字符输入输出流在输出结果的结尾多一个乱码字符:&#39;?&#39;
- svn常见问题汇总
- .NET 十五岁,谈谈我眼中的.NET
- mac下selenium+python环境搭建
- 基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作
- FileSaver.js 介绍
- 用java理解程序逻辑小结
热门文章
- js,jq获取元素位置属性及兼容性写法
- python 基础知识(待补充)
- SearchBar简单展示
- 老李分享:QTP的录制原理以及实现
- thinkphp3.2.x多图上传并且生成多张缩略图
- cassandra高级操作之JMX操作
- android开发之-数据存储Map、HashMap、Hashtable、concurenthashmap区别
- 读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”
- .dll 文件编写和使用
- PHPCMS笔记第二弹