zoukankan      html  css  js  c++  java
  • 基于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数量的相似问题

    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

  • 相关阅读:
    GTK+(基于DirectFB)的字体处理
    控制的字体属性
    [linux手机平台]让应用程序单实例运行
    serif vs sans serif
    关于做事的几点感想
    推荐一部环保电影难以忽视的真相
    短信应用设计备忘录
    手机搜索设计备忘录
    一点概念,
    毕业了,怎么策划的让有意思点呢,
  • 原文地址:https://www.cnblogs.com/ulysses-you/p/6863585.html
Copyright © 2011-2022 走看看