自然语言处理中,在词的表示上,向量的方式无疑是最流行的一种。它可以作为神经网络的输入,也可直接用来计算。比如计算两个词的相似度时,就可以用这两个词向量的距离来衡量。词向量的训练需要大规模的语料,从而带来的是比较长的训练时间。spark框架基于内存计算,有忘加快词向量的训练速度。
以下是spark官网的代码(http://spark.apache.org/docs/latest/ml-features.html#word2vec)
package alg
import org.apache.spark.ml.feature.Word2Vec
import org.apache.spark.ml.linalg.Vector
import org.apache.spark.sql.{Row, SparkSession}
object word2vec {
def main(args:Array[String]):Unit={
val spark: SparkSession = SparkSession.builder
.appName("My")
.master("local[*]")
.getOrCreate()
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")
//vectorSize可以自动调节,通常为300左右
val word2vec=new Word2Vec().setInputCol("text").setOutputCol("result").setVectorSize(3).setMinCount(0)
val model=word2vec.fit(documentDF)
val result=model.transform(documentDF)
result.collect().foreach{ case Row(text: Seq[_], features: Vector) =>
println(s"Text: [${text.mkString(", ")}] => \nVector: $features\n") }
}
}