一、业务场景
在机器学习中,有时会遇到同义词识别问题。现需要使用Spark ML库来解决同义词识别问题。
二、数据集说明
本案例所使用的数据集为纯文本文件,说明如下:
数据集路径:/data/dataset/ml/synonymous.txt
三、操作步骤
阶段一、启动HDFS、Spark集群服务和zeppelin服务器
1、启动HDFS集群
在Linux终端窗口下,输入以下命令,启动HDFS集群:
1. $ start-dfs.sh
2、启动Spark集群
在Linux终端窗口下,输入以下命令,启动Spark集群:
1. $ cd /opt/spark 2. $ ./sbin/start-all.sh
3、启动zeppelin服务器
在Linux终端窗口下,输入以下命令,启动zeppelin服务器:
1. $ zeppelin-daemon.sh start
4、验证以上进程是否已启动
在Linux终端窗口下,输入以下命令,查看启动的服务进程:
1. $ jps
如果显示以下6个进程,则说明各项服务启动正常,可以继续下一阶段。
1. 2288 NameNode 2. 2402 DataNode 3. 2603 SecondaryNameNode 4. 2769 Master 5. 2891 Worker 6. 2984 ZeppelinServer
阶段二、准备案例中用到的数据集
1、将本案例要用到的数据集上传到HDFS文件系统的/data/dataset/目录下。在Linux终端窗口下,输入以下命令:
1. $ hdfs dfs -mkdir -p /data/dataset 2. $ hdfs dfs -put /data/dataset/ml/synonymous.txt /data/dataset/
2、在Linux终端窗口下,输入以下命令,查看HDFS上是否已经上传了该数据集:
1. $ hdfs dfs -ls /data/dataset/
这时应该看到数据集文件synonymous.txt已经上传到了HDFS的/data/dataset/目录下。
阶段三、对数据集进行探索和分析
1、新建一个zeppelin notebook文件,并命名为”tyc_project”。
2、加载数据集。在notebook单元格中,输入以下代码:
1. val filePath = "hdfs://localhost:9000/data/dataset/synonymous.txt" 2. val synonymousRDD = sc.textFile(filePath) 3. synonymousRDD.collect.foreach(println)
同时按下【Shift+Enter】键,执行以上代码,输出内容如下:
Unified data analytics engine Spark People use Hive for data analytics MapReduce is not fading away mysql sqlserver and oracle all is sql
3、将数据集从RDD转换为DataFrame。在notebook单元格中,输入以下代码:
1. // 从RDD转换为DataFrame 2. val documentRDD = synonymousRDD.map(line => line.split(" ")) 3. val documentDF = documentRDD.toDF("word") 4. 5. // 显示 6. documentDF.show(false)
同时按下【Shift+Enter】,执行以上代码,输出内容如下:
4、需要使用Word2Vec estimator来计算单词的嵌入和发现类似的单词(识别同义词)。在notebook单元格中,输入以下代码,构造一个Word2Vec,并指定输入列和生成的特征列:
1. // 使用Word2Vec estimator来计算单词的嵌入和发现类似的单词(识别同义词) 2. import org.apache.spark.ml.feature.Word2Vec 3. 4. val word2Vec = new Word2Vec().setInputCol("word"). 5. setOutputCol("feature"). 6. setVectorSize(3). 7. setMinCount(0)
同时按下【Shift+Enter】,执行以上代码,输出内容如下:
word2Vec: org.apache.spark.ml.feature.Word2Vec = w2v_1aa5649a64e5
5、使用上一步得到的estimator来拟合数据,得到一个模型对象。在notebook单元格中,输入以下代码:
1. val model = word2Vec.fit(documentDF)
同时按下【Shift+Enter】,执行以上代码,输出内容如下:
model: org.apache.spark.ml.feature.Word2VecModel = w2v_1aa5649a64e5
由以上输出内容可以看出,在拟合数据后,得到一个Word2VecModel的模型对象。
6、使用得到的模型对DataFrame documentDF进行转换,得到特征列。在notebook单元格中,输入以下代码:
1. val result = model.transform(documentDF) 2. result.show(false)
同时按下【Shift+Enter】,执行以上代码,输出内容如下:
上面输出表格中的”feature”列就是生成的特征列。
7、找出与Spark相似的3个单词。在notebook单元格中,输入以下代码:
1. model.findSynonyms("Spark", 3).show
同时按下【Shift+Enter】,执行以上代码,输出内容如下:
由以上输出内容可以看出,与单词”Spark”最接近的单词有”engine”、”MapReduce”和”Hive”。
8、找出与Hive相似的3个单词。在notebook单元格中,输入以下代码:
1. model.findSynonyms("Hive", 3).show
同时按下【Shift+Enter】,执行以上代码,输出内容如下:
由以上输出内容可以看出,与单词”Hive”最接近的单词有”spark”、”fading”和”engine”。
阶段四、自我练习
请使用Spark ML库,在本案例项目数据集基础上,回答以下问题:
1、请找出与SQL最接近的5个同义词。