Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Apache Sparkを使った感情極性分析

1,963 views

Published on

Sparkの概要とSparkを使った感情極性分析のサンプルの紹介です。

Published in: Technology
  • Be the first to comment

Apache Sparkを使った感情極性分析

  1. 1. © 2016 IBM Corporation Apache Spark入門 Tanaka Y.P 2016-08-26
  2. 2. © 2016 IBM Corporation2 自己紹介 田中裕一(yuichi tanaka) 主にアーキテクチャとサーバーサイドプログラムを担当 することが多い。Hadoop/Spark周りをよく触ります。 Node.js、Python、最近はSpark周りの仕事でScalaを書く ことが多い気がします。 休日はOSS周りで遊んだり。 詳解 Apache Spark
  3. 3. © 2016 IBM Corporation3 アジェンダ  Sparkの概要  Sparkのテクノロジースタック  SparkとHadoop  Sparkコンポーネント  Spark Core  SparkSQL  DataFrame  SparkStreaming  MLlib  GraphX  DataSets  本日のサンプル(感情極性分析)  Notebook
  4. 4. © 2016 IBM Corporation4 Sparkの概要
  5. 5. © 2016 IBM Corporation5 DataFrames Sparkのテクノロジースタック Spark Core SparkSQL Spark Streaming GraphX MLlib HDFS Cassandra HBase ・・・ Packages
  6. 6. © 2016 IBM Corporation6 Apache SparkとHadoop HadoopでのMapReduceの処理例
  7. 7. © 2016 IBM Corporation7 Apache Sparkの処理概要 SparkでのRDD&DAGの処理例
  8. 8. © 2016 IBM Corporation8 • Java, Scala, Pythonを利用してETLを実行可能 • RDD(Reslient Distributed Datasets)はScalaのコレクションの Seqのようなもので、データを順番に保持 • RDDの内部はパーティションに分かれている。パーティション 毎にデータを保持(HDFSブロック数に依存) • 分散処理する際にはパーティション毎に並列に処理 • mapやfilter等の基本的な操作の場合、データの順序は変わ らない。 val csv = spark.textFile("tokyo.csv") val pairs = csv.map(line => (line.split(","))) .map(x => (x(0).take(8), (x(4).toFloat, 1))) .reduceByKey( (x,y) => (x._1 + y._1, x._2 + y._2) ) .map(x => (x._1, x._2._1/x._2._2) ) .sortByKey()  Spark CoreはSparkのエンジン Spark Core 20150614 22:00:00,0,1,8,20.9,8,3.0,8,南南西,8,85,8 20150614 23:00:00,0,1,8,20.9,8,2.6,8,南南西,8,86,8 20150615 00:00:00,0,1,8,20.5,8,1.0,8,南,8,86,8 20150615 1:00:00,0,1,8,20.4,8,0.7,8,南,8,88,8 (2015/6/14,22.565218) (2015/6/15,24.550001) (2015/6/16,23.358332) (2015/6/17,21.583334) 例:平均気温の計算
  9. 9. © 2016 IBM Corporation9 • SQLを利用したデータ操作が可 能 • トランザクションなし • Parquet 、Json、Hive だけで なくJDBCやODBCもサポート • Thrift JDBC/ODBCによる外部 からの接続 • 後述のDataFrameをラップする 形で実装 {"name":"貝嶋", "address":{"city":"川崎", "state":"神奈川"}} {"name":"土屋", "address":{"city":"豊洲", "state":"東京"}} {“name”:“山田", "address":{"city":"横浜", "state":"神奈川"}} {"name":"岸代", "address":{"city":"後楽園", "state":"東京"}} val people = sqlContext.jsonFile("test.json") people.registerTempTable("people") val nameAndAddress = sqlContext.sql("SELECT name, address.city, address.state FROM people WHERE address.state="神奈川"") nameAndAddress.collect.foreach(println) {"name":"貝嶋", "address":{"city":"川崎", "state":"神奈川"}} {“name”:“山田", "address":{"city":"横浜", "state":"神奈川"}} 例:住所データ(json)からの特定データの抽出 • SparkSQLによるデータ操作 Spark SQL
  10. 10. © 2016 IBM Corporation10 DataFrame API  Performance  Less Code
  11. 11. © 2016 IBM Corporation11 DataFrame API  Preformance  Less Code SQL Spark DataFrame API Spark RDD
  12. 12. © 2016 IBM Corporation13 • Sparkによるミニ(マイクロ)バッチの実行 • DStreamと呼ばれるRDDを操作 • 指定間隔ごとにまとめられたRDDを処理(Windows処 理も可能) • 通常のSparkプログラミングとほぼ同様 たとえば、定期的に流入するデータの「移動平均値」の連続計 算 val tstream = ssc.socketTextStream(hostname, port) var mdtxt = tstream.map(x => x.split(",")) .map(x => ( x(0), (x(0), x(1), x(2).toInt) ) ) .updateStateByKey(updateFunc _) mdtxt.print() センサーデータ: (Dev1, 201501010000, 0) (Dev2, 201501010000, 0) (Dev1, 201501010001, 1) Alert: Dev1 Status changed : 1  Sparkでストリーム処理 Spark Streaming 例:センサーデータの出力値変更時にアラート DStream RDD data data RDD data data RDD data data
  13. 13. © 2016 IBM Corporation14 • MLlibとRが利用可能 MLlibはScalaで、SparkRはRで 記述可能 • アルゴリズム(MLlib) • SVM、ロジスティック回帰、決定木、K- means、ALSなど • IBMはSystemMLをSparkに提供 val data = spark.textFile("kdata.txt") val parsedData = data.map(x => Vectors.dense(x.split(',').map(_.toDouble))).cache() val numClusters = 3 val numIterations = 10 val clusters = KMeans.train(parsedData, numClusters, numIterations)  Sparkで機械学習 SparkR, Mllib データ: ( 直近購買月[n日前], 期間内購買回数 ) (5,1),(4,2),(5,3),(1,2),(2,4),(2,5),(2,6),(1,4),(1,5),(1,2),(1,5),(5,5) クラスタ結果: ([中心], 人数) ([1.0, 2.0], 2), ([1.5, 4.833333333333333], 6), ([4.666666666666666, 2.0], 3), ([5.0, 5.0], 1) 例:顧客のクラスタ分け 0 2 4 6 0 2 4 6
  14. 14. © 2016 IBM Corporation15 • グラフデータを並列分散環境で処理するための フレームワーク • グラフ構造データを用いた解析を行う • 「点」と「辺」からなるデータ • SNSでのつながり、データ間の関連性 など • 表構造では扱うことが難しい関係を見つけ出す • データ間のつながりの抽出 • 輪の抽出 • 距離の計測 • 影響の計測 • グラフDBとの兼ね合い(これから) val graphWithDistance = Pregel( graph.mapVertices((id:VertexId, attr:Int) => List((id, 0))), List[(VertexId, Int)](), Int.MaxValue,EdgeDirection.Out)((id, attr, msg) => mergeVertexRoute(attr, msg.map(a=> (a._1, a._2 + 1))),edge => { val isCyclic = edge.srcAttr.filter(_._1 == edge.dstId).nonEmpty if(isCyclic) Iterator.empty else Iterator((edge.dstId, edge.srcAttr)) },(m1, m2) => m1 ++ m2 )  Sparkでグラフ処理を Spark GraphX つながりの検索 例: つながりと距離を見つけ出す 1,((1,0), (6,1), (9,1), (7,1), (4,2)) 1 2 3 4 5 6 7 89
  15. 15. © 2016 IBM Corporation16 DataSet API • Spark v1.6で追加された新しいAPI • まだ実験的な実装であることに注意 • 登場背景 • RDDとDataFrameという二つの抽象概念ができてしまった。 • RDDとDataFrameにそれぞれ長所があること • 2つの抽象概念を行き来する為のコストがかかる • 二つの抽象概念をいいとこ取りしたDataSetAPIの登場 • DataFrameの速さはそのまま • オブジェクト・メソッドはコンパイル時のタイプセーフ提供 • DataFrameとのシームレス変換
  16. 16. © 2016 IBM Corporation17 Structured Streaming • Spark v2.0で追加される予定の新しいAPI • Datasetの上に実装されたHigh-levelのStreamingAPI • Streamingデータを構造化データとして 継続的に処理可能 val in = spark.readStream .schema(schemaImp) .format("csv") .option("header", true) .option("maxFilesPerTrigger", 1) .load("csv-logs") Jacek Warszawa, Polska, 42,true Jacek Warszawa, Polska, 42,true ------------------------------------------- Batch: 0 ------------------------------------------- +-----+--------+-------+---+-----+ | name| city|country|age|alive| +-----+--------+-------+---+-----+ |Jacek|Warszawa| Polska| 42| true| +-----+--------+-------+---+-----+ complete output delta output
  17. 17. © 2016 IBM Corporation18 本日のサンプル(感情極性分析) • Sparkを使った記事の感情極性分析を行います。(いわゆるネガポ ジ) • AdTechやSNS分析などで利用される分析 • その記事が肯定的な内容なのか否定的な内容なのかの判定に利用 否定的な内容の記事 広告が出る
  18. 18. © 2016 IBM Corporation19 本日のサンプル(感情極性分析) • Sparkを使った記事の感情極性分析を行います。(いわゆるネガポ ジ) • 記事を読み込みword毎に区切る • 単語極性対応表を使って記事の単語を評価 • 評価値を元にNegative / Pojitiveを数値で評価 記事 単語極性 対応表 単語分割 kuromoji (ipadic) 辞書作成 マッチング 記事評価単語リスト
  19. 19. © 2016 IBM Corporation20 本日のサンプル(感情極性分析) • 記事 • 記事タイトル,本文,メディアのCSV • サンプル記事 • 飲酒運転、検挙数5分の1に減 「悪質」の割合は高まる • 領海侵入の沈静化要求=岸田氏「首脳会談の前提」―日中外相会談 • 国交省、休日のダム見学、ツアーを実施することを発表 内部の一般開放も推進 • 過去最多メダル獲得 リオ五輪日本選手団の解団式 • 辞書 • 単語¥t極性値t用法 • サンプルデータ • 貪欲 n 〜である・になる(評価・感情)主観 • 絆 p 〜がある・高まる(存在・性質) • 腕前 e 〜がある・高まる(存在・性質) • 腕利き p 〜である・になる(評価・感情)主観
  20. 20. © 2016 IBM Corporation21 参考 • 辞書 • 日本語評価極性辞書 • 東山昌彦, 乾健太郎, 松本裕治, 述語の選択選好性に着目した名詞評価極性の獲得, 言語処理学会第14 回年次大会論文集, pp.584-587, 2008. / Masahiko Higashiyama, Kentaro Inui, Yuji Matsumoto. Learning Sentiment of Nouns from Selectional Preferences of Verbs and Adjectives, Proceedings of the 14th Annual Meeting of the Association for Natural Language Processing, pp.584-587, 2008.

×