概述
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