概述

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的计算速度

测试结果

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

基于spark和sparkstreaming的word2vec-LMLPHP

这里说明一点,结果中第一个字段是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

04-18 19:26