スッキリわかるPython入門

国本・中山の性格を分析する(その2)

国本・中山の性格を分析する(その2)

こんにちは、スッキリJava&サーブレット&Python著者の国本です(カレー好き)。

前回は、IBM Cloudが提供する「Watson Personality Insights」のデモを触ってみました。今回は、PythonからWatson Personality Insightsを利用してみましょう。それには下記の手順が必要です。

1.  IBM Cloud にライト・アカウントを登録
2. IBM CloudでWatson Personality Insightsを開始

「アカウント登録! えっ、お金いるの?」と思われた方がいるかもしれませんがご安心を。IBM Cloudのアカウントにはライト・プラン(ライト・アカウント)があり、今回の記事の内容は無料で行う事ができます。

それぞれの手順は、各リンク先を参照してくだくさい。

それぞれができたら、Pythonプログラムから性格分析を行ってみます。
Pythonプログラムの開発環境は、AnacondaでインストールされるJupyter Labを前提に解説します。

step
1
Pythonにibm-watsonライブラリを追加


PythonからIBM CloudのWatsonのサービス(Personality Insights等)を利用するには「ibm-watson」というライブラリが必要です。このライブラリを下記のコマンでインストールしましょう。

pip install ibm-watson

step
2
PythonからWatson Personality Insightsにアクセス


PythonからWatson Personality Insightsにアクセスするには「PersonalityInsightsV3」オブジェクトを利用します。このオブジェクトは下記のコードで生成することができます。PersonalityInsightsV3関数(コンストラクタ)の引数iam_apikeyとurlには、作成したPersonality Insightsのapikeyとurlの値(こちらの手順X参照)をペーストします。

from ibm_watson import PersonalityInsightsV3
personality_insights = PersonalityInsightsV3(
    version='2017-10-13',
    iam_apikey='作成したPersonality Insightsのapikeyの値',
    url='作成したPersonality Instightsのurlの値'
)

次に、性格診断の基となるデータを用意します。例では中山氏のブログの内容をコピペした「nakayama.txt」というファイルを読み込んでいます。用意したファイルをJupyterLabのノートブックと同じ場所に配置してください(input関数を利用して変数に直接入力しても構いませんが、分析には100単語以上必要です)。

with open('./nakayama.txt') as file:
text = file.read()

オブジェクトと分析データが用意できたので、性格分析を行います。変数profileには分析結果(ディクショナリ型)が格納されます。

profile = personality_insights.profile(
    content=text, # 入力データ(分析データ)
    accept='application/json', #出力(結果)データの形式
    content_type='text/plain', #入力データの形式
    content_language='ja' #入力データの言語
).get_result()

変数profileに格納された分析結果を出力して確認してみましょう。分析結果の構造が複雑なため、print関数で出力すると見づらくなります。そのため標準ライブラリのpprint関数を使用しています。pprint関数は整形して出力をしてくれます。

from pprint import pprint
pprint(profile)

分析結果が大量に出力されて、若干引いちゃうかもしれませんが、まず注目していただきたいのは5つのキーです(下図の赤字の箇所)。

今回は個性に注目したいので、キー'personality'を指定して個性の分析結果を取得します。取得した個性の分析結果を出力して内容を確認しましょう。

personality = profile['personality']
pprint(personality)

またまた結果が大量に表示されて引いちゃうかもしれませんが、要素が5つのリストであることに注目してください。リストの各にはビッグ・ファイブ特性の分析結果がディクショナリで格納されています。

試しに0番目の要素に格納されている「知的好奇心(openness)」の分析結果を取得して出力してみましょう。

factor = personality[0]
pprint(factor)

キー'children'の内容は、ちょっと複雑なので今のところはおいておきましょう。とりあえず、特性の名前はキー'name'、スコアはキー'percentile'で取得できます。

print('{}は{}です'.format(factor['name'], factor['percentile']))  # profile[0]['percentile']でも可

ビッグ・ファイブ特性には6つの下位特性があります。下位特性の分析結果は、キー'children'で取得できます。試しに変数factorに格納している「知的好奇心(openness)」の分析結果から、その下位特性の分析結果を取得してみましょう。

children = factor['children']  # personality[0]['children']でも可
pprint(children)

要素数6のリストが出力されます。各要素に各サブ特性の分析結果がディクショナリで格納されています。

試しに0番の要素に格納されている「大胆性(Adventurousness)」の分析結果を取得してみましょう。特性の名前はキー'name'、スコアはキー'percentile'で取得できます。

child = children[0] # personality[0]['children'][0]でも可
print('{}は{}です'.format(child['name'] , child['percentile']))

うまく出力されましたか? ここまでの内容を踏まえ、各ビッグ・ファイブ特性とその各下位特性のスコアを全て取得するには下記のようになります。

# ビッグファイブ特性を順に取得
for factor in profile['personality']:
    name = factor['name'] # 取得したビッグファイブ特性の名前
    percentile = factor['percentile'] # # 取得したビッグファイブ特性の値
    print('{}は、{}%'.format(name, percentile*100))
    # 下位特性を順に取得
    for child in factor['children']:
         name = child['name'] # 取得した下位特性の名前
         percentile = child['percentile'] # 取得した下位特性の値
         print('- {}は、{}%'.format(name, percentile*100))

実行結果

Opennessは、99.99934091540277%
- Adventurousnessは、99.76106582812814%
- Artistic interestsは、74.78009431112018%
- Emotionalityは、36.05540768791361%
- Imaginationは、89.06037303601755%
- Intellectは、99.99551552550344%
- Authority-challengingは、91.11966235055911%
Conscientiousnessは、88.9878811507938%
- Achievement strivingは、99.42088498548753%
- Cautiousnessは、34.17407251348455%
- Dutifulnessは、57.60746196675319%
- Orderlinessは、55.68903760145226%
- Self-disciplineは、99.97536517236978%
- Self-efficacyは、99.98429702319727%
Extraversionは、99.20343547585368%
- Activity levelは、83.87089224377723%
- Assertivenessは、98.29556136241476%
- Cheerfulnessは、96.32405364846086%
- Excitement-seekingは、56.45331266697369%
- Outgoingは、79.12241313924561%
- Gregariousnessは、45.62942389185874%
Agreeablenessは、45.74734818822525%
- Altruismは、72.48220018992617%
- Cooperationは、81.27538654556703%
- Modestyは、37.37499308864777%
- Uncompromisingは、75.49618590357446%
- Sympathyは、95.59517435861432%
- Trustは、51.99679027502303%
Emotional rangeは、62.1420985129403%
- Fieryは、7.606056897375196%
- Prone to worryは、1.3877432465218165%
- Melancholyは、0.962285868575552%
- Immoderationは、35.07229149423367%
- Self-consciousnessは、1.7870077425369502%
- Susceptible to stressは、0.15445791205182524%

今回は特性のスコアを出力して終わっていますが、これらを活用することで様々なサービスを創り出す事ができます。例えば、下記はAdobeさんがやられているサービスの事例です。
https://blogs.adobe.com/japan/dx-ibm_watson_and_dmp/

個人的には、来春の新人研修のチーム分けとかにつかったらおもしろそうだなあと思っています。

さて、長くなってしまったので、ここで一旦区切ります。
次回は、Pythonで取得した結果を用いて、私と中山氏の性格の類似度を算出してみたいと思います。

-スッキリわかるPython入門
-