ぴよ猫ちゃんの機械学習

AI、人工知能、機械学習について色々記事にしています。

IBM Watsonの楽しい使い方~社長をWatson Personality Insightsで性格診断してみた~

こんにちはー。管理人のピヨ猫でーす。

疑問

IBM WatsonってAIだっていうけど何が出来るの?

f:id:shibayu2002:20190310112521j:plain

IBM Watsonは画像認識とか音声認識とか色々なことが出来るよ。他社のAI製品では出来ない性格診断何かも出来るんだ。今回はIBM Watsonを使ったちょっと面白いことを記事にするね。

※ 半年ほど前の記事の焼きまわしです。綺麗に整理したく新しく記事にしたものです。

1.IBM Watsonの紹介

IBM Watsonとは

IBM WatsonとはIBM社が販売するAIソリューションです。
Watsonは2011年にアメリカのクイズ番組で優勝したことで一躍有名となりました。
www.ibm.com

IBM Watsonで出来ること

IBM Watsonを用いるとディープラーニングを自分でしなくても、Watsonが提供するAPIを用いてAIによる様々な分析を行うことが出来ます。

IBM Watsonで出来ること】

  • Watson Assistant 照会応答
  • Discovery 知識探索
  • Natural Language Understanding テキスト分析
  • Discovery News ニュース
  • Knowledge Studio 業界や分野ごとの言葉の使われ方の微妙な違いまでWatsonに学習させるアプリケーション
  • Visual Recognition 画像認識
  • Speech to Text 音声認識
  • Text to Speech 音声合成
  • Language Translator 言語変換
  • Natural Language Classifier 自然言語分類
  • Personality Insights 性格分析
  • Tone Analyzer 感情分析

www.ibm.com

2.IBM Watsonの面白機能 ~性格診断~

IBM Watson Personality Insights(性格分析)

IBM WatsonにはGoogleAWS機械学習APIには見られない性格診断というユニークな機能があります。
『Personality Insights 性格分析』という機能で、文章から性格を細かく診断することが出来ます。

www.ibm.com

IBM Watson Personality Insights(性格分析)を試す方法

IBM Watsonの性格診断(Personality Insights)はAPIを使わずに、IBM Watsonの性格診断(Personality Insights)のデモサイトでWatsonによる性格診断を試すことが出来ます。 personality-insights-demo.ng.bluemix.net

【やり方】
Watson性格診断のデモ

IBM Watson Personality Insights(性格分析)の診断項目

IBM Watson Personality Insights(性格分析)は人間の5大感情(ビッグファイブ )などを事細かに分析できます。
IBM Watson Personality Insights(性格分析)の分析項目】
IBM Watson Personality Insights(性格分析)の分析項目

試しに、東証1部上場企業の社長の性格を診断してみた

試しに、東証1部上場企業の社長の性格を診断してみました。簡単にやり方と結果を纏めます。

Google Custom Searchで社長様の言葉を一括取得

企業の社長はたいていは自社のHPで自分のメッセージを発信しています。診断したい企業のHPにいけば社長の言葉を入手できます。
手動でHPからコピペすれば良いのですが、今回は最終的にAPIで自動で診断する様にしたかったので、Google Custom Searchを使ってプログラムで社長の言葉を抜き出す様にしました。

なお、Google Custom SearchはGoogle検索エンジンをプログラムから呼ぶためのAPIになります。
qiita.com

【社長の言葉を抜き出すプログラム(Google Apps Script )】

var API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxx";
var CX_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxx";
var CUSTOME_SEARCH_API_URL = "https://www.googleapis.com/customsearch/v1?key="
            + API_KEY + "&cx= " + CX_KEY + "&q=";
var CEO_MESSAGE_SHEET_ID = "xxxxxxx";

function myFunction() {
  var sheet = SpreadsheetApp.openById(
       CEO_MESSAGE_SHEET_ID).getActiveSheet();
  sheet.getDataRange().getValues().forEach(function(r){
  try {
    if(isFinite(r[0])){
      var data = JSON.parse(
        getResponse(CUSTOME_SEARCH_API_URL 
           + "'" + r[2] + " 社長 メッセージ" + "'"));
      sheet.getRange(r[0] + 1, 4).
          setValue(data.items[0].link);
      var htmlText = getResponse(
           data.items[0].link);
      htmlText = htmlText.replace(/>.*?>/g, "");
      htmlText = htmlText.replace(/[a-zA-Z0-9_\(\),
           "\~\^\!\+\*\{\}\\\/:=\.\?\-;<<\|&\[\]\']*/g, "");
      htmlText = htmlText.replace(/\s/g, "");
      htmlText = htmlText.replace(/^\r\n/g, "");
      sheet.getRange(r[0] + 1, 5).setValue(htmlText);
    }
  }catch(e){ Logger.log(e); }
  });
}

function getResponse(url) {
  var response = UrlFetchApp.fetch(url);
  return response.getContentText();
}

【実行結果】
社長の言葉の取得結果

社長のメッセージのページにある日本語を取ってるだけなので、サイトのメニューとか社長の言葉じゃない文言も取れてるけど、まーいいや(適当( ̄∇ ̄)) 占いみたいなもんだから、精緻に頑張ることもないかな。機械学習だから多少の雑音合っても特徴抽出してくれると勝手に期待( ̄∇ ̄)

診断結果

◆ A社長    ※ 何方を診断したものかは掲載致しません。
社長の性格診断

◆ B社長
社長の性格診断

3.IBM WatsonのAPIを使って東証1部上場企業の社長の性格の傾向を分析してみた

デモではなく実際にPersonality InsightsのAPIを使って性格診断をしてみました。

1.システム構成

社長の性格診断の方法はこんな感じです。

【処理の流れ】
社長の性格診断システム

GoogleとWatson(IBM)のコラボです。1社のサービスで作れれば覚えることが少なく楽なのですが、GoogleもWatsonもそれぞれ強みがあるので、両方を使いました。

2.ソースコード

Node.js使いました。10年Javaオンリーでしたが初挑戦です。
ソースはGITに上げてありますので興味がある方は是非使って下さい。
github.com

【ソース】

const request = require("request");
const fs = require('fs');
const readline = require("readline");
const path = require('path');
const config = require('config');
const PersonalityInsightsV3 = require('watson-developer-cloud/personality-insights/v3');
const Promise = require('promise');

const loadCEOMessagePage = (target) => {
  return new Promise((resolve, reject) => {
  request({
    'url': "https://www.googleapis.com/customsearch/v1"
      + "?key=" + config.apikey
      + "&cx=" + config.cxkey
      + "&q=" + encodeURIComponent("株式会社" + target + " 社長 メッセージ"),
    'method': 'GET',
    'encoding': 'UTF-8'
  }, (err, response, body) => {
    if (err) reject(err);
    var i = 0;
    JSON.parse(body).items.forEach((item) => {
    if (item.title.indexOf("挨拶") > 0 ||
    item.title.indexOf("メッセージ") > 0) {
    resolve(item.link);
  }
  if (i >= 10) reject("Not found CEO's message page.");
});});});
}

const loadCEOMessage = (url) => {
  return new Promise((resolve, reject) => {
  request({
    'url': url,
    'method': 'GET',
    'encoding': 'UTF-8'
  }, (err, response, body) => {
  if (err) reject(err);

  var html = body;
  if (typeof(html) != "string") reject("Undifind value");
    html = html.replace(/<.*?>/g, "");
    html = html.replace(/[a-zA-Z0-9_\(\),"\~\^\!\+\*\{\}\\\/:=\.\?\-;<>\|&\[\]\']*/g, "");
    html = html.replace(/\s/g, "");
    html = html.replace(/^\r\n/g, "");
    html = html.replace(/^.*?私/g, "私");
    html = html.replace(/年月株式.*/g, "");
    if (html.length >= 5000) reject("Message size is to learge.");
    else resolve(html);
  });});
}

const doWatson = (text) => {
  return new Promise((resolve, reject) => {
    const personalityInsights = new PersonalityInsightsV3({
      'iam_apikey': config.wapikey,
      'version_date': config.wapiver,
      'url' : 'https://gateway-tok.watsonplatform.net/personality-insights/api'
    });
   
personalityInsights.profile({
      'content': text,
      'content_type' : 'text/plain',
      'content_language' : 'ja',
      'accept_language' : 'ja',
      'raw_scores' : false,
      'consumption_preferences' : false
    }, (err, res) => {
    if (err) reject(err);
    else resolve(res);
  });});
}

const writeCSV = (code, name, url, json) => {
  var text = code;
  text = text + ", " + name;
  text = text + ", " + url;
  text = text + ", " + findValue(json.personality, '知的好奇心');
  text = text + ", " + findValue(findChildren(json.personality, '知的好奇心'), '大胆性');
 (割愛)
  text = text + ", " + findValue(json.values, '自己超越');
 
console.log(text);
}

const showHeader = () => {
 
var text = "コード";
 
text = text + ", " + "名称";
  text = text + ", " + "社長のメッセージURL";
 
text = text + ", " + "知的好奇心";
  text = text + ", " + "大胆性";
   (割愛)
  text = text + ", " + "自己超越";
 
console.log(text);
}

const findValue = (json, key) => {
  var value = 0.0;
  json.some((map) => {
  if(map.name == key) {
  value = map.percentile;
  return true;
  }});
  return value;
}

const findChildren = (json, key) => {
  var obj = null;
  json.some((map) => {
  if(map.name == key) {
  obj = map.children;
  return true;
  }});
  return obj;
}

const loadAll = () => {
  showHeader();
  var stream = fs.createReadStream(
  path.join(__dirname, config.corplist), "UTF-8");
  var reader = readline.createInterface({ input: stream });
  reader.on("line", (data) => {
    var cols = data.split(",");
    loadCEOMessagePage(cols[1]).then((pageUrl) => {
    loadCEOMessage(pageUrl).then((text) => {
    doWatson(text).then((res) => {
    writeCSV(cols[0], cols[1], pageUrl, res); }) }) });
  });
}

loadAll();

【実行結果】
社長の性格診断結果

3.社長の性格の分析結果

出来ましたーー (^▽^)/
ジャン 社長の性格診断結果
気持ち悪いグラフキター。なんだかわからない(-_-;)
注)掲載にあたって会社は特定できない様に会社コードはマスクしています。

上の図では全然わからないので、分類を絞ってグラフ化しました。

◆ 各要素の全体平均の分布

社長の性格診断結果
社長の性格診断結果

◆ 社長別の分布

社長の性格診断結果
社長の性格診断結果
社長の性格診断結果
社長の性格診断結果

4.社長の性格の傾向

  • 個性が強い
  • ビッグファイブの全てが平均を超えている。
  • 知的好奇心、誠実性が非常に強い
  • 知的好奇心は大胆性、誠実性は秩序性、自制力が高い
  • 自己主張が高く友好性、社交性は低い (トラン〇??)
  • 自由と安定への欲求が高く、また好奇心が高い
  • 変化を許容し自己超越に価値を見出している傾向がある

IBM WatsonのAPIを使った感想

IBM Watson Personality Insights(性格分析)APIの感想

人の性格データを集めるのは困難なので、性格分析を自分でデータを集めてディープラーニングをするのは非常に難しいですが、IBM Watson Personality Insights(性格分析)APIを使うと、労せずに性格診断が出来るので、IBM Watsonは非常に便利です。
性格診断だけだと唯の占いになりますが、例えば児童の作文をIBM Watson Personality Insights(性格分析)APIで性格分析して育成方針の参考にするなど、幾らでも活用方法があるなと思いました。

社長の性格分析の感想

社長の特性として自由と安定という相反する特性が高い傾向にありました。自由な発想をしつつ現実をしっかり見る。まさに天才の感性が必要の様です。また、自制力が非常に高く、誠実であることが条件の様です。

外向性は割と高く無い様です。但し、自己主張は高い様です。これは、ビジネスにおいては妥協しない姿勢も必要だからだと思います。また、自己超越したところに価値観を持っている様です。社会を動かすとかそういうところに価値観を持っているということでしょう。
世間を騒がすトラン〇さんがそんな感じな気がするので、この分析結果は的外れではなさそうです。Watson正しく分析している様に見えます。トラン〇さん起業家として活動続ければ良いのに・・・(-_-;)

社長になりたい方は参考にしてみると良いかもしれません。
【Watsonの診断結果から見えてきた社長に求められるポイント】

  • 自由な発想をしながら現実(安定)を見る
  • 自制心をしっかり持ち誠実であること
  • 時には妥協しない。自己主張をしっかりする。
  • 視点を個人ではなく社会に向けて活動する。

地味に苦労した点

  • content_languageなどをpersonalityInsights.profileのオプションではなく、PersonalityInsightsV3のコンストラクタに渡していて設定値が反映されなかった。
  • Google API、Watson APIの利用制限
    やっと一括で分析できるようにしたのに、Google APIは1日100回、Watsonは1ヶ月に1000回の制限がある  Σ( ̄ロ ̄lll)ガーン
    無料版には限界ありますね・・・。

また機械学習で何か面白いことをしてみたいと思います。宜しくお願いします。 f:id:shibayu2002:20190310112521j:plain


(参考)日本ディープラーニング協会(JDLA)のその他の推薦図書

◆◆AI白書 2019 / 情報処理推進機構AI白書編集委員会/編 / 角川アスキー総合研究所

価格:3,888円
(2019/4/3 22:46時点)
感想(0件)

人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書) [ 松尾豊 ]

価格:1,512円
(2019/4/3 22:46時点)
感想(2件)