1. 程式人生 > >spark scala word2vec 和多層分類感知器在情感分析中的實際應用

spark scala word2vec 和多層分類感知器在情感分析中的實際應用

predict output edi ext oop post format vector spa

轉自:http://www.cnblogs.com/canyangfeixue/p/7227998.html 對於威脅檢測算法使用神經網絡訓練有用!!!TODO待實驗

技術分享
/**
  * Created by lkl on 2017/7/21.
  */
//import com.ibm.spark.exercise.util.LogUtils
//import com.ibm.spark.exercise.util.LogUtils
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.classification.MultilayerPerceptronClassifier
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.ml.feature.{IndexToString, StringIndexer, Word2Vec}
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext
object mllib {


  final val VECTOR_SIZE = 1000
//  def main(args: Array[String]) {
//    if (args.length < 1) {
//      println("Usage:SMSClassifier SMSTextFile")
//      sys.exit(1)
//    }
  def main(args: Array[String]) {
    val conf = new SparkConf().setMaster("local").setAppName("test")
       val sc = new SparkContext(conf)
      val sqlContext = new org.apache.spark.sql.SQLContext(sc)

//    val role = "jdbc:mysql://192.168.0.37:3306/emotional?user=root&password=123456&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false"
//    import sqlContext.implicits._
//    val df = sc.textFile("hdfs://192.168.0.211:9000/user/hadoop/emotion/SMS.txt").map(line=>(line.split(" ")(0),line.split(" ")(1),line.split(" ")(2),line.split(" ")(3))).toDF("id","innserSessionid","words","value")
//    df.printSchema()
//    df.insertIntoJDBC(role, "SMS", true)
    val sqlCtx =new org.apache.spark.sql.SQLContext(sc)
    import sqlContext.implicits._
// 讀取hdfs 數據源,格式如下:以空格隔開,最後一列數字列是分析標題後,人為打上的標簽,
值是按照情緒程度,值選擇於【-1,-0.75,-0.5,-0.25,,0.25,0.50,0.75,1】其中之一。

// 10090 C779C882AA39436A89C463BCB406B838 漲停板,復盤,全,靠,新,股,撐,門面,萬科,A,尾盤,封板 0.75
// 10091 519A9C6AD0A845298B0B3924117C0B4F 一,行業,再現,重大,利好,板塊,反彈,仍,將,繼續 0.75
// 10092 C86CEC7DB9794311AF386C3D7B0B7CBD 槁城區,3,大,項目,新,獲,規劃證,開發,房企,系,同,一家 0
// 10093 FCEA2FFC1C2F4D6C808F2CBC2FF18A8C 完善,對,境外,企業,和,對外,投資,統計,監測 0.5
// 10094 204A77847F03404986331810E039DFC2 財聯社,電報 0
// 10095 E571B9EF451F4D5F8426A1FA06CD9EE6 審計署,部分,央企,業績,不,實 -0.5
// 10096 605264A2F6684CC4BB4B2A0B6A8FA078 廚衛,品牌,新,媒體,榜,看看,誰家,的,官微,最,愛,賣萌 0.25
val parsedRDD = sc.textFile("hdfs://192.168.0.211:9000/user/hadoop/emotion/SMS.txt").map(line=>{
val a = line.split(" ")
if(a.length == 4 ){
(line.split(" ")(3),line.split(" ")(2).split(","))
}else{
("","".split(","))
}
})

val msgDF = sqlCtx.createDataFrame(parsedRDD).toDF("label","message")
val labelIndexer = new StringIndexer().setInputCol("label").setOutputCol("indexedLabel").fit(msgDF)
val word2Vec = new Word2Vec().setInputCol("message").setOutputCol("features").setVectorSize(VECTOR_SIZE).setMinCount(1)

val layers = Array[Int](VECTOR_SIZE,250,500,200)
val mlpc = new MultilayerPerceptronClassifier().setLayers(layers).setBlockSize(512).setSeed(1234L).setMaxIter(128).setFeaturesCol("features").setLabelCol("indexedLabel").setPredictionCol("prediction")

val labelConverter = new IndexToString().setInputCol("prediction").setOutputCol("predictedLabel").setLabels(labelIndexer.labels)

val Array(trainingData, testData) = msgDF.randomSplit(Array(0.8, 0.2))
val pipeline = new Pipeline().setStages(Array(labelIndexer,word2Vec,mlpc,labelConverter))
val model = pipeline.fit(trainingData)
val predictionResultDF = model.transform(testData)
//below 2 lines are for debug use
predictionResultDF.printSchema
predictionResultDF.select("message","label","predictedLabel").show(30)
val evaluator = new MulticlassClassificationEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction").setMetricName("precision")
val predictionAccuracy = evaluator.evaluate(predictionResultDF)
println("Testing Accuracy is %2.4f".format(predictionAccuracy * 100) + "%")
// sc.stop

}
}
 
技術分享

結果如下:

技術分享
+--------------------+-----+--------------+
|             message|label|predictedLabel|
+--------------------+-----+--------------+
|[價格會, 一飛, 沖天, 神秘,...|  0.5|           0.5|
|[審計署, 部分, 央企, 業績,...| -0.5|           0.5|
|[廣電, 總局, 新浪, 微博, ...| -0.5|           0.5|
|[葉檀, 若, 粵, 港澳灣區, ...| 0.25|           0.5|
|      [萬達, 崩, 萬科, 起]|    0|           0.5|
|[外匯, 小白, 必, 看, 視頻...| 0.25|           0.5|
|[樂視, 回, 應發, 不, 出,...|-0.75|           0.5|
|[萬達, 電影, 高開, 1.69...|  0.5|           0.5|
|[萬科, A, 股, 6月, 23...| 0.75|           0.5|
|[金價, 周一, 反彈, 扭轉, ...|  0.5|           0.5|
|[收評, 兩, 市, 震蕩, 滬指...| 0.25|           0.5|
|[點睛, 軍工, 混改, 加速, ...|  0.5|           0.5|
|[棉花, 日報, 棉花, 短期, ...| 0.25|           0.5|
|[探秘, 巴鐵, 試驗線, 部分,...|-0.75|           0.5|
|[萬達, 復星, 股價, 暴跌, ...|-0.75|           0.5|
|[油價, 迎, 年內, 最, 大,...|-0.25|           0.5|
|[2017年, IPO, 被, 否...|-0.75|           0.5|
|[股, 轉, 監事長, 鄧映翎, ...| -0.5|           0.5|
|[發改委, 國內, 汽, 柴油, ...|-0.25|           0.5|
|[周報, 明晟, MSCI, 宣布...|  0.5|           0.5|
|[夏季, 達沃斯, 共識, 中國,...|  0.5|           0.5|
|[重磅, 又, 一, 家, 公司,...|-0.75|           0.5|
|[麥格裏, 重磅, 警告, OPE...| -0.5|           0.5|
|[韓國, 娛樂, 公司, TO-W...|  0.5|           0.5|
|       [新, 三, 板, 周報]|    0|           0.5|
|[分享, 華爾街, 對, 美國, ...|  0.5|           0.5|
|[盛和, 資源, 2015年, 公...|    0|           0.5|
|[交易, 實況, 黃金, 兩, 連...| -0.5|           0.5|
|[徽商, 銀行, 內鬥戲, 第二,...| -0.5|           0.5|
|[2017, 夏季, 達沃斯, 論...| 0.25|           0.5|
技術分享

spark scala word2vec 和多層分類感知器在情感分析中的實際應用