Word2Vec

word2Vec

spark描述:
    Word2Vec是一个Estimator(评估器),它采用表示文档的单词序列,并训练一个Word2VecModel,
    该模型将每个单词映射到一个唯一的固定大小向量.
    Word2VecModel使用文档中所有单词的平均值将每个文档转换为向量;
    该向量然后可用作预测,文档相似性计算等功能
概念:
    Word2Vec是一种著名的词嵌入(Word Embedding)方法,它可以计算每个单词在其给定的语料库环境下的分布式词向量(Distributed Representation,亦直接被称为词向量).
    词向量表示可以在一定程度上刻画每个单词的语义
    如果词的语义相近,它们的词向量在向量空间中也相互接近,这使得词语的向量化建模更加精确,可以改善现有方法并提高鲁棒性,
    词向量已被证明在许多自然语言处理问题,如: 机器翻译,标注问题,实体识别等问题中具有非常重要的作用.

Spark中的Word2Vec

概念:
    Word2Vec是一个Estimator,它采用一系列代表文档的词语来训练wordVecModel,
    该模型将每个词语映射到一个固定大小的向量.
    Word2Vec使用文档中每个词语的平均数来讲文档转换为向量,然后这个向量可以作为预测的特征,来计算文档相似度计算等等

Word2Vec的两种模型

1. CBOW
思想:其思想是通过每个词的上下文窗口词词向量来预测中心词的词向量,
2. Skip-gram
思想: 是通过每个中心词来预测其上下文窗口词,并根据预测结果来修正中心词的词向量.

Ml库中的Word2Vec实现

概念: 
    1. 在Ml库中,Word2Vec的实现使用的是skip-gram模型,Skip-gram的训练目标是学习词表征向量分布,其优化目标是在给定中心词
的词向量的情况下,最大优以下似然函数.
    2. ML与经典的Word2Vec实现采用了相同的策略,使用Huffman树来进行层次Softmax(Hierachical Softmax)方法来进行优化,

案例实现:

描述:
    在下面的代码段中,我们首先用一组文档,其中一个词语序列代表一个文档,对于每一个文档,我们将其转换为一个特征向量.
    此特征向量可以被传递到一个学习算法
代码实现: 
import org.apache.spark.ml.feature.Word2Vec
import org.apache.spark.sql.SparkSession

object W2VecDemo {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().
      master("local").
      appName("TF-IDFDemo").
      getOrCreate()
    //--1. 首先,导入Word2Vec所需要的包,并创建三个词语序列,每个代表一个文档
    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")
    //--2. 新建一个Word2Vec,显然,它是一个Estimator,设置相应的超参数,这里设置特征向量的维度为3
    //--Word2Vec模型还有其他可设置的超参数,具体的超参数描述可以
    // 参考(http://spark.apache.org/docs/1.6.2/api/scala/index.html#org.apache.spark.ml.feature.Word2Vec)
    val word2Vec = new Word2Vec()
      .setInputCol("text")
      .setOutputCol("result")
      .setVectorSize(3)
      .setMinCount(0)
    //训练Word2Vec模型
    val model= word2Vec.fit(documentDF)
    //--4. 利用Word2VecModel把文档转变成特征向量
    val result = model.transform(documentDF)
    result.select("result").take(3).foreach(println)
    //--打印原始结果和向量结果
    result.collect().foreach{
        case Row(text:Seq[_],features:Vector)=>
        println(s"Text:[${text.mkString(",")}]=>\nVector:$features\n")}
    }
  }
}

结果:

[[-0.028139343485236168,0.04554025698453188,-0.013317196490243079]]
[[0.06872416580361979,-0.02604914902310286,0.02165239889706884]]
[[0.023467857390642166,0.027799883112311366,0.0331136979162693]]
可以看到,文档被转变为了一个3维的特征向量,这些特征向量就可以被应用到相关的机器学习方法中.

你可能感兴趣的:(Word2Vec)