Spark NLP实现本文挖掘

该博客介绍了如何利用Spark的NLP库结合Word2Vec技术进行文本挖掘。首先,文章强调了理解NLP相关理论的重要性,然后讲解了Spark中的MLib、RDD、DataFrame和Graph的基本概念。在技术配置上,博客指出需要Spark 2.2.0、JDK 1.8.0和Scala 2.1.x。最后,博主分享了创建DataFrame并计算文本相似度的步骤,当相似度超过0.85时,认为文本之间存在紧密关系。

  • 本机运用的技术栈为NLP(Word2Vec)关于NLP的相关理论请提前梳理清楚
  • Spark mlib,rdd,dataframe,graph(顶点,边,连通图等基本概念)
  • Spark 2.2.0,JDK 1.8.0 ,Scala 2.1.X

如下思路图:

1.如下创建一个DataFrame

       import spark.implicits._
      val documentDF = spark.createDataFrame(Seq(
        ("1","北京市朝阳区春晓园北区7号楼".wordSplit()),
        ("2","北京市海淀区学院路20号院甲2号楼".wordSplit()),
        ("3","北京市西城区复兴门北大街4号楼6".wordSplit()),
        ("4","北京市西城区西交民巷64号院1号楼2".wordSplit()),
        ("5","北京市海淀区花园路10号院3号楼7".wordSplit())

      )).toDF("id","name")
2.对DataFrame 利用Word2vec进行模型转换
      //设置特征向量维数为5
      val word2Vec = new Word2Vec().setInputCol("name").setOutputCol("outName").setVectorSize(5).setMinCount(0)
      val word2Vec_model = word2Vec.fit(documentDF) //训练模型
      val result = word2Vec_model.transform(documentDF) //把文档转换成特征向量
      import spark.implicits._
      val tmpDF=result.map(x=>{
        val outName=x.getAs[DenseVector]("outName")
        val id=x.getAs[String]("id")
        (s"$id&$outName")
      }).toDF("outname")

3. 如图计算文本之间的相似度

      val graphDF=resultDF.mapPartitions(x=>{
        x.map(x=>{
          val str1=x.getAs[Seq[Double]]("v2")
          val str2=x.getAs[Seq[Double]]("v4")
          val v1=x.getAs[String]("v1")
          val v2=x.getAs[String]("v3")
          val simV=(similarValue(str1,str2)).toDouble
          (v1,v2,str1,str2,simV)
        })
      }).toDF("v1","v2","str1","str2","simV")


4.根据文本之间的相似度进行判断,如果相似度>0.85以上我们认为两个文本是非常相近的,那么认为这两个是有连图的关系

  graphDF.show()
      //图顶点的RDD
      val vertexRDD=graphDF.mapPartitions(x=>{
        x.map(x=>{
          val soure=x.getAs[String]("v1").toLong
          val desc=x.getAs[String]("v2").toLong
          val height=x.getAs[Double]("simV")
          (soure,(desc,height))
        })
      }).rdd
      //图边的RDD
      val edgeRDD=graphDF.mapPartitions(x=>{
        x.map(x=>{
          val soure=x.getAs[String]("v1").toLong
          val desc=x.getAs[String]("v2").toLong
          Edge(soure,desc,1.0)
        })
      }).rdd
      val graph = Graph(vertexRDD, edgeRDD)
      //算出连通图
      graph.connectedComponents().vertices.map(x=>{(x._2,x._1)}).groupByKey().foreach(println)
      spark.stop()
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值