天天看点

sparkmllib算法之操作-第三篇(Word2Vec)1、定义2、原理3、spark代码实现

1、定义

如果用一句比较简单的话来总结,word2vec是用一个一层的神经网络(即CBOW)把one-hot形式的稀疏词向量映射称为一个n维(n一般为几百)的稠密向量的过程。为了加快模型训练速度,其中的tricks包括Hierarchical softmax,negative sampling, Huffman Tree等。

2、原理

word2vec可以分为两部分:模型与通过模型获得的词向量。

word2vec,字面意思,将 word 转化为 vector,word 是顺序有意义的实体,比如文档中单词、用户依次点击的商品。

word2vec 是 NLP 领域的重要算法,它的功能是将 word 用 K 维的 dense vector 来表达,训练集是语料库,不含标点,以空格断句。因此可以看作是种特征处理方法。

word2vec 两种实现方式:Skip-gram:用一个词语作为输入,来预测它周围的上下文。同义词 p(word1|word2)

CBOW :用一个词语的上下文作为输入,来预测这个词语本身。完形填空p(word1|word2,word3)

3、spark代码实现

3.1、添加依赖包

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>
           

3.2、spark代码实现

object CalcCorrelation {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder().appName("CalcCorrelation").master("local[4]").getOrCreate()
    val sc: SparkContext = spark.sparkContext
    sc.setLogLevel("WARN")

    word2VecTest(spark)
    
    }

 /**
   * word2Vec
   *
   * @param spark
   */
  private def word2VecTest(spark: SparkSession): Unit = {
    val documentDF = spark.createDataFrame(Seq(
      "Hi I heard about Spark".split(" "),
      "I wish Java could use case classes".split(" "),
      "Logistic regression models are neat".split(" ")
    ).map(Tuple1.apply)).toDF("text")

    val vec: Word2Vec = new Word2Vec()
      .setInputCol("text")
      .setOutputCol("words")
      .setVectorSize(5)
      .setMinCount(0)

    val model: Word2VecModel = vec.fit(documentDF)
    val result: DataFrame = model.transform(documentDF)
    result.select("words").take(3).foreach(println)
  }
}
           

有问题请联系QQ:765120845

继续阅读