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