【Spark原理系列】Spark Word2Vec原理示例源码分析详解

【Spark原理系列】 S p a r k Spark Spark W o r d 2 V e c Word2Vec Word2Vec原理参数示例源码分析详解 点击这里看全文

W o r d 2 V e c Word2Vec Word2Vec

W o r d 2 V e c Word2Vec Word2Vec 是一种计算单词的分布式向量表示的方法。分布式表示的主要优势在于相似的单词在向量空间中靠近,这使得对新模式的泛化更容易,模型估计更稳健。分布式向量表示已被证明在许多自然语言处理应用中非常有用,如命名实体识别、消歧、解析、标记和机器翻译。

模型

在我们的 W o r d 2 V e c Word2Vec Word2Vec实现中,我们使用了 s k i p − g r a m skip-gram skipgram 模型。 s k i p − g r a m skip-gram skipgram 的训练目标是学习单词向量表示,在同一个句子中预测其上下文。数学上,给定一系列训练单词 w 1 , w 2 , … , w T w1,w2,…,wT w1,w2,,wT s k i p − g r a m skip-gram skipgram 模型的目标是最大化平均对数似然函数

1 T ∑ t = 1 T ∑ j = − k j = k l o g p ( w t + j w t ) \frac{1}{T}\sum_{t=1}^T\sum_{j=-k}^{j=k}logp(\frac{w_{t+j}}{w_t}) T1t=1Tj=kj=klogp(wtwt+j)
其中 k k k 是训练窗口的大小。

s k i p − g r a m skip-gram skipgram 模型中,每个单词 w w w 与两个向量 u w u_w uw v w v_w vw 相关联,它们分别是 w w w 的单词和上下文的向量表示。正确预测给定单词 w i w_i wi 的概率取决于 s o f t m a x softmax softmax 模型,即

p ( w i ∣ w j ) = exp ⁡ ( u w i T ⋅ v w j ) ∑ l = 1 V e x p ( u l ⊤ v w j ) p(wi|wj)=\frac{\exp (u_{w_i}^T⋅v_{w_j})}{∑_{l=1}^V exp(u_l^⊤ v_{w_j})} p(wiwj)=l=1Vexp(ulvwj)exp(uwiTvwj)

其中 V V V 是词汇表大小。

s k i p − g r a m skip-gram skipgram 模型使用 s o f t m a x softmax softmax开销较大,因为计算 log ⁡ p ( w i ∣ w j ) \log{p(wi|wj)} logp(wiwj) 的成本与 V V V 成正比,而 V V V 可能很容易达到数百万级别。为了加速 W o r d 2 V e c Word2Vec Word2Vec的训练,我们使用了分层softmax,将计算 log ⁡ p ( w i ∣ w j ) \log{p(wi|wj)} logp(wiwj)的复杂度降低到 O ( l o g ( V ) ) O(log(V)) O(log(V))

参数方法

Word2VecBase是一个trait,定义了Word2VecWord2VecModel的参数。

下面是它的主要方法:

  • vectorSize: 词向量的维度,默认为100。
  • windowSize: 窗口大小(上下文词的范围),默认为5。
  • numPartitions: 分区数,默认为1。
  • minCount: 词汇表中一个词必须出现的最少次数,默认为5。
  • maxSentenceLength: 输入数据中每个句子的最大长度(以单词计),超过该阈值的句子将被分割成多个片段,默认为1000。

Word2Vec是一个Estimator,用于训练一个将单词转换为向量表示的模型。

以下是它的一些重要方法:

  • setInputColsetOutputColsetVectorSize等:设置参数的方法。
  • fit(dataset: Dataset[_]): Word2VecModel:使用给定的数据集进行训练,并返回训练得到的Word2VecModel
  • transformSchema(schema: StructType): StructType:根据输入模式转换并返回输出模式。

Word2VecModel是由Word2Vec训练得到的模型,它包含一个Map(String, Vector),将单词映射为向量表示。

Word2VecWord2VecModel都提供了序列化和反序列化的方法。

Word2Vec的伴生对象提供了加载模型的方法。

示例

下面的示例演示了如何加载文本文件,将其解析为 Seq[String] 类型的 RDD,构建 Word2Vec 实例,然后用输入数据拟合一个 Word2VecModel。最后,我们展示指定单词的前40个同义词。要运行这个示例,首先下载 text8 数据并将其解压到您喜欢的目录中。这里我们假设提取的文件是 text8,并且与您运行 Spark shell 的目录相同。

数据sample_lda_data.txt

1 2 6 0 2 3 1 1 0 0 3
1 3 0 1 3 0 0 2 0 0 1
1 4 1 0 0 4 9 0 1 2 0
2 1 0 3 0 0 5 0 2 3 9
3 1 1 9 3 0 2 0 0 1 3
4 2 0 3 4 5 1 1 1 4 0
2 1 0 3 0 0 5 0 2 2 9
1 1 1 9 2 1 2 0 0 1 3
4 4 0 3 4 2 1 3 0 0 0
2 8 2 0 3 0 2 0 2 7 2
1 1 1 9 0 2 2 0 0 3 3
4 1 0 0 4 5 1 3 0 1 0

示例代码

import org.apache.spark.mllib.feature.{
   Word2Vec, Word2VecModel}

val input = sc.textFile("data/mllib/sample_lda_data.txt").map(line => line.split(" ").toSeq)

val word2vec = new Word2Vec()

val model = word2vec.fit(input)

val synonyms = model.findSynonyms("1", 5)

for((synonym, cosineSimilarity) <- synonyms) {
   
  println(s"$synonym $cosineSimilarity")
}

// Save and load model
model.save(sc, "myModelPath")
val sameModel = Word2VecModel.load(sc, "myModelPath")

源码

注意:ml中的word2vec源码训练模型的时候调用复用了mllib中的word2vec

ml中Word2Vec源码

package org.apache.spark.ml.feature

import org.apache.hadoop.fs.Path

import org.apache.spark.annotation.Since
import org.apache.spark.internal.config.Kryo.KRYO_SERIALIZER_MAX_BUFFER_SIZE
import org.apache.spark.ml.{
   Estimator, Model}
import org.apache.spark.ml.linalg.{
   BLAS, Vector, Vectors, VectorUDT}
import org.apache.spark.ml.param._
import org.apache.spark.ml.param.shared._
import org.apache.spark.ml.util._
import org.apache.spark.mllib.feature
import org.apache.spark.sql.{
   DataFrame, Dataset, SparkSession}
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.util.{
   Utils, VersionUtils}
/**
 * Word2Vec和Word2VecModel的参数。
 */
private[feature] trait Word2VecBase extends Params
  with HasInputCol with HasOutputCol with HasMaxIter with HasStepSize with
  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值