2019年6月23日日曜日

(Watson)Personality InsightsのJSONをR言語でパースしてみた

現在、Python勉強中ですが、どちらかと言うとR言語派の私は肩身が狭いです。。
いろんなサンプルスクリプトを調べても、Pythonばかりで。。
一矢を報いたくなったので、WatsonのAPIである「Personality Insights」から出力されたjsonをR言語でパースする、超簡単なスクリプトを書いみました。

ローカル環境でも出来るのですが、せっかくなので、Cloud上でAI開発が可能な「Watson Studio」(無料プラン)でやってみたいと思います。

※本エントリーは、私、小田一弥が一個人として勉強を兼ねて記載したものです。私の勤務先である日本アイ・ビー・エム株式会社の見解・見識ではない、個人としての記載内容としてご覧ください。 
 

「Personality Insights」からのjson取得


「Personality Insights(PI)」については、Qiitaなどで複数紹介されているのでご存知の方も多いと思いますが、簡単に言うと、言語学的分析とパーソナリティ理論を応用し、テキストから筆者の性格や特徴を推測するWatson APIのひとつです。

本来は、PythonやcURLからアクセスしてjsonを入手する必要があるのですが、やや敷居が高いので、コピペだけで済む方法をご紹介します。

1.「Personality Insights」のデモサイトにアクセスする。
デモサイトでは、スクリプトなど一切書かずに、PIの実行と出力結果を得ることができます。
自分で準備したテキストファイルでも分析可能ですが、今回は、リンクされている著名人のTwitterデータを使いますので、画面の「ツイート分析」をクリックしてください。
私は、「ダルビッシュ有」さんのツイートを選びました。


画面右下の「分析」画面を押すと、下記のような分析結果の画面が表示されるはずです。



2. JSONを取得する
画面をスクロールし、「JSONを見る」をクリックしてください。



JSONが表示されるので、ドラッグ&ドロップで全選択してください。
残念ながら、ショートカットキーだと、ページ全体が対象となるので、ドラッグ&ドロップのみです。


コピーした結果をエディターに貼ります。ファイル名は「PI_sample.json」にしました。
猛者たちの「スクリプトでやれよ」的な声が聞こえてくるかもしれませんが、そっと耳を塞ぎます。。


これでスクリプトを書かずに、JSONを入手することができました。

Watson StudioのR環境(Rstudio)でJSONをパースする


1.Watson Studioにアクセスする
以降の作業は「Watson Studio」で行いますが、登録の仕方はQiitaなど、他サイトをご覧ください。なお、当エントリーに記載する作業は、全て無料で実施可能です。何回も試行したとしても、勝手に課金されることはありませんので、ご安心ください。

まずは、下記サイトにある「ライト・アカウントを今すぐ登録」を選び、登録に必要な情報をインプットしてください。

Watson Studioへのアクセス手順で迷う方は、下記サイトをご覧ください。

Watson Studioセットアップガイド(ライトアカウント可)


2.新規プロジェクトを作成する
Watson Studioに入った後は、「Create a project」を選択してください。


3.「Standard」を選択
「Creat a project」画面が表示されるので、「Standard」を押してください。



4.プロジェクトネームを入力する
「Name」欄にお好きなプロジェクトネームを入力してください。
私は「PI_R_sample」としました。Descriptionは空欄でOKです。
入力が終わりましたら、右下の「Create」を押してください。



5.「Rstudio」を起動する
「Launch IDE」を押した後にプルダウンで表示される「Rstudio」を選択してください。
少し待つとRの統合開発環境である「Rstudio」が起動します。














RStudioが出ましたっ!!
右下の「Upload」を選択してください。


ファイルがアップされました。




6.Rスクリプトを実行する
左側のコンソールペインに下記スクリプトをコピー&ペーストし、enterを押してください。


# jsonliteパッケージのインストール
install.packages("jsonlite")

# jsonファイルのパースパッケージを呼び出し
library(jsonlite)

# jsonファイルをパース。" "内のファイル名は、都度書き換え
PI_result <- read_json("PI_sample.json", simplifyVector = TRUE)

# =====================PI項目名とスコアを抽出=====================

# ---------------------各「PIword_count」パート----------------

# count数を抽出。 countだけ%ではなく、N
word.name = "word_count"
word.count = unlist(PI_result$word_count)

# word_count項目名と%スコアをつなげたデータフレームを作成
word_count.df <- data.frame(word.name,word.count)
colnames(word_count.df) <- c("item","score")


# ---------------------各「PIBig5」パート----------------

# Big5big5_openness(知的好奇心)
# jsonをパースしたList形式からBig5big5_openness(知的好奇心)スコアを抽出
big5_openness.name <- unlist(PI_result$personality$name[[1]])
big5_openness.percentile <- unlist(PI_result$personality$percentile[[1]])

# openness項目名と%スコアをつなげたデータフレームを作成
big5_openness.df <- data.frame(big5_openness.name,big5_openness.percentile)
colnames(big5_openness.df) <- c("item","score")


# Big5big5_Conscientiousness(誠実性)
# jsonをパースしたList形式からBig5big5_Conscientiousness(誠実性)スコアを抽出
big5_conscientiousness.name <- unlist(PI_result$personality$name[[2]])
big5_conscientiousness.percentile <- unlist(PI_result$personality$percentile[[2]])

# consciousness項目名と%スコアをつなげたデータフレームを作成
big5_conscientiousness.df <- data.frame(big5_conscientiousness.name,big5_conscientiousness.percentile)
colnames(big5_conscientiousness.df) <- c("item","score")


# Big5big5_Extraversion(外向性)
# jsonをパースしたList形式からBig5big5_Extraversion(外向性)スコアを抽出
big5_extraversion.name <- unlist(PI_result$personality$name[[3]])
big5_extraversion.percentile <- unlist(PI_result$personality$percentile[[3]])

# Extraversion項目名と%スコアをつなげたデータフレームを作成
big5_extraversion.df <- data.frame(big5_extraversion.name,big5_extraversion.percentile)
colnames(big5_extraversion.df) <- c("item","score")


# Big5big5_Agreeableness(協調性)
# jsonをパースしたList形式からBig5big5_Agreeableness(協調性)スコアを抽出
big5_agreeableness.name <- unlist(PI_result$personality$name[[4]])
big5_agreeableness.percentile <- unlist(PI_result$personality$percentile[[4]])

# Agreeableness項目名と%スコアをつなげたデータフレームを作成
big5_agreeableness.df <- data.frame(big5_agreeableness.name,big5_agreeableness.percentile)
colnames(big5_agreeableness.df) <- c("item","score")


# Big5big5_Emotional_range(感情起伏)
# jsonをパースしたList形式からBig5big5_Emotional_range(感情起伏)スコアを抽出
big5_emotional_range.name <- unlist(PI_result$personality$name[[5]])
big5_emotional_range.percentile <- unlist(PI_result$personality$percentile[[5]])

# Emotional_range項目名と%スコアをつなげたデータフレームを作成
big5_emotional_range.df <- data.frame(big5_emotional_range.name,big5_emotional_range.percentile)
colnames(big5_emotional_range.df) <- c("item","score")


# ---------------------各「PINeed(欲求)」パート----------------

# jsonをパースしたList形式からNeed(欲求)スコアを抽出
need.name <- unlist(PI_result$needs$name)
need.percentile <- unlist(PI_result$needs$percentile)

# Need項目名と%スコアをつなげたデータフレームを作成
need.df <- data.frame(need.name,need.percentile)
colnames(need.df) <- c("item","score")


# ---------------------各「PIValue(価値)」パート----------------

# jsonをパースしたList形式からValue(価値)スコアを抽出
value.name <- unlist(PI_result$value$name)
value.percentile <- unlist(PI_result$value$percentile)

# Value項目名と%スコアをつなげたデータフレームを作成
value.df <- data.frame(value.name,value.percentile)
colnames(value.df) <- c("item","score")


# ---------------------各「PI:各パートの行結合」パート----------------

# 個別データフレームの行結合(バインド)
pi_merge.df <- rbind(
  word_count.df,
  big5_openness.df,
  big5_conscientiousness.df,
  big5_extraversion.df,
  big5_agreeableness.df,
  big5_emotional_range.df,
  need.df,
  value.df)


# PIデータフレームのCSV書き出し
write.csv(pi_merge.df,"pi_merge.df.csv")

7.CSVファイルをダウンロードする
Rスクリプトが完了すると、右下にCSVファイルが表示されるはずです。
「More」から「Export」を選び、CSVファイルをダウンロードしてください。







ダウンロード後のCSVファイルを開くと、PIのスコアが一覧化されています。


当エントリーは手順を全て記載したので手間のかかる作業のように見えますが、実際は、特別なスキル無しに20分あればCSVファイル取得まで行けると思います。

想定ユースケースなど



実務上のユースケースとしては、異なるセグメントやグループに属する方の発話テキストを個別のJSONとして読み込ませ、各人のPIスコアを比較し、そこから何らかの分析の切り口を見つけ出すといった使い方は面白いと思います。

ただし、「PIスコアから、ターゲットのインサイトが全てわかる」「打ち手イメージの導出まで繋がる」とは考えない方がいいと思います。これは、PIの機能どうこうという問題ではなく、結局、読み込ませるデータの内容や、分析者の目的や意図によって「(解釈上の)PIスコアの意味」が変わってくるものだと思うからです。
(ex.アウドドアグッズメーカーと、文房具メーカーのレビューを読み込ませた場合の”Openness”の意味合いは違うはず)

個人的には、非構造化データ分析時に、最初の取っ掛かりとしてPIにかけると、新たな分析仮説がイメージしやすい場合もあって有用かなと思っています。

ご参考:その他のWatson関連エントリー


Watson Studioの「Data Refinery」機能で「馬の疝痛(せんつう)」データを眺めてみた。
https://sapporomkt.blogspot.com/2019/06/watson-studiodata-refinery.html

Watson AnalyticsとMeCabで「老人と海」を軽く可視化してみた。
https://sapporomkt.blogspot.com/2017/08/watson-analyticsmecab.html

Watson Explorerでディズニーの人気作品をテキストマイニング
http://sapporomkt.blogspot.jp/2017/04/watson-explorer.html

いま話題のIBM「Bluemix(ワトソンくん)」が「老人と海」をサマったら。
http://sapporomkt.blogspot.jp/2015/11/ibmbluemix.html

0 件のコメント:

コメントを投稿