20
© 2016 IBM Corporation Apache Spark 入入 Tanaka Y.P 2016-08-26

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

Embed Size (px)

Citation preview

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

© 2016 IBM Corporation

Apache Spark 入門

Tanaka Y.P2016-08-26

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

© 2016 IBM Corporation2

自己紹介田中裕一( yuichi tanaka)主にアーキテクチャとサーバーサイドプログラムを担当することが多い。 Hadoop/Spark周りをよく触ります。Node.js、 Python、最近は Spark周りの仕事で Scalaを書くことが多い気がします。

休日は OSS 周りで遊んだり。

詳解 Apache Spark

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

© 2016 IBM Corporation3

アジェンダ

Spark の概要

Spark のテクノロジースタック

Spark と Hadoop

Spark コンポーネント- Spark Core

- SparkSQL

- DataFrame

- SparkStreaming

- MLlib

- GraphX

- DataSets

本日のサンプル(感情極性分析)

Notebook

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

© 2016 IBM Corporation4

Spark の概要

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

© 2016 IBM Corporation5

DataFrames

Spark のテクノロジースタック

Spark Core

SparkSQL Spark Streaming GraphX MLlib

HDFS Cassandra HBase ・・・

Packages

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

© 2016 IBM Corporation6

Apache Spark と Hadoop

Hadoop での MapReduce の処理例

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

© 2016 IBM Corporation7

Apache Spark の処理概要

Spark での RDD & DAG の処理例

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

© 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,820150614 23:00:00,0,1,8,20.9,8,2.6,8, 南南西 ,8,86,820150615 00:00:00,0,1,8,20.5,8,1.0,8, 南 ,8,86,820150615 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)

例:平均気温の計算

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

© 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

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

© 2016 IBM Corporation10

DataFrame API

Performance Less Code

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

© 2016 IBM Corporation11

DataFrame API

Preformance Less Code

SQL Spark DataFrame API

Spark RDD

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

© 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

例:センサーデータの出力値変更時にアラート

DStreamRDD

datadata

RDD

datadata

RDD

datadata

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

© 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 1 2 3 4 5 60

2

4

6

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

© 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))

12 3

45

67

89

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

© 2016 IBM Corporation16

DataSet API• Spark v1.6 で追加された新しい API

• まだ実験的な実装であることに注意

• 登場背景• RDD と DataFrame という二つの抽象概念ができてしまった。• RDD と DataFrame にそれぞれ長所があること• 2つの抽象概念を行き来する為のコストがかかる

• 二つの抽象概念をいいとこ取りした DataSetAPI の登場• DataFrame の速さはそのまま• オブジェクト・メソッドはコンパイル時のタイプセーフ提供• DataFrame とのシームレス変換

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

© 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,trueJacek Warszawa, Polska, 42,true

------------------------------------------- Batch: 0 ------------------------------------------- +-----+--------+-------+---+-----+ | name| city|country|age|alive| +-----+--------+-------+---+-----+ |Jacek|Warszawa| Polska| 42| true| +-----+--------+-------+---+-----+

complete output delta output

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

© 2016 IBM Corporation18

本日のサンプル(感情極性分析)• Spark を使った記事の感情極性分析を行います。(いわゆるネガポ

ジ)• AdTech や SNS 分析などで利用される分析• その記事が肯定的な内容なのか否定的な内容なのかの判定に利用

否定的な内容の記事

広告が出る

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

© 2016 IBM Corporation19

本日のサンプル(感情極性分析)• Spark を使った記事の感情極性分析を行います。(いわゆるネガポ

ジ)• 記事を読み込みword 毎に区切る• 単語極性対応表を使って記事の単語を評価• 評価値を元に Negative / Pojitive を数値で評価

記事

単語極性対応表

単語分割

kuromoji(ipadic)

辞書作成

マッチング 記事評価単語リス

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

© 2016 IBM Corporation20

本日のサンプル(感情極性分析)• 記事

• 記事タイトル , 本文 ,メディアの CSV• サンプル記事

• 飲酒運転、検挙数5分の1に減 「悪質」の割合は高まる• 領海侵入の沈静化要求=岸田氏「首脳会談の前提」―日中外相会談• 国交省、休日のダム見学、ツアーを実施することを発表 内部の一般開放も推進• 過去最多メダル獲得 リオ五輪日本選手団の解団式

• 辞書• 単語 ¥t 極性値 \t 用法• サンプルデータ

• 貪欲 n 〜である・になる(評価・感情)主観• 絆 p 〜がある・高まる(存在・性質)• 腕前 e 〜がある・高まる(存在・性質)• 腕利き p 〜である・になる(評価・感情)主観

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

© 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.