読者です 読者をやめる 読者になる 読者になる

Research Tips

研究に関するメモ(専門的すぎない記事を書きたい)

PythonからIBM Personality Insights Service APIを叩いてみた

はじめに

IBMが開発しているIBM Personality Insights Service APIは、テキストを入力すると、人格特性(Big-five、Value、Needs)のスコアを出力してくれるというAPIです。
どういうこと?と思う方は以下のリンクから試してみましょう。
Personality Insights
性格診断のちゃんとしたやつ、みたいなイメージですね。入力できる言語は英語、スペイン語、日本語、アラビア語に対応しています。
今回は、このAPIPython 2.7から叩く方法を紹介します(おそらく3.x系でも同じ)。

手順

手順1:API資格情報の取得
  1. IBM Bluemix - Next-Generation Cloud App Development Platformにアクセス。アカウントを作成後、ログインする。
  2. ダッシュボードにアクセスし、スペースを作成する。スペースとは、いわゆる開発環境のことです。データセンターを「米国南部」「シドニー」「英国」から選択するよう要求されますが、(APIを叩くだけなら)気にせずデフォルトのままで大丈夫です。
  3. スペースの作成後、メニューが表示される。
  4. その中から、「サービス&API」を選択する。こんな画面が表示される。f:id:tmngtm:20161014183137p:plain この画面の中から、「Personality Insights」を選択。
  5. Personality Insightsの画面から、スペース名やアプリ名を入力するように要求される。適当に名前を付けて「作成」をクリック。
  6. 「ダッシュボード」からPerosnality Insightsが利用できるようになる。ダッシュボードからPersonality Insightsにアクセスし、左のメニューバーから「サービス資格情報」をクリック。
  7. すると以下のような画面が表示される。f:id:tmngtm:20161014190317p:plain ここに表示されているpasswordとusernameの値(赤で隠されているところ)はAPIを叩く際の資格情報となる。後ほどサンプルコードでも出てくる。これにて資格情報の取得は完了!!
手順2:Pythonコードの実装

Requestsというライブラリを使うので、インストールしておく。

pip install requests


以下のようなコードを作成する。

#watson_api.py
# -*- coding:utf-8 -*-

import json
import requests
from requests.auth import HTTPBasicAuth

#input: plain text (string) --> output: bigfive, needs, and values
def get_personality(Text):
  
  #endpoint url
  api_url = "https://gateway.watsonplatform.net/personality-insights/api/v2/profile"
  #username and pssword for this api
  api_username = "XXXXX"          #手順1で取得したusername
  api_password = "YYYYY"          #手順1で取得したpassword

  #set query
  query = {
    "include_raw": "false",
    "headers": "false"
  }

  #set header
  headers = {
    "Content-Type": "text/plain", #入力テキストの形式.今回はstringのテキストを渡す設定.
    "Content-Language": "en",     #入力言語モードの設定.jaとすると日本語の入力を受け付ける.
    "Accept": "application/json", #応答ファイルの形式.今回はjson形式で受け取る.
    "Accept-Language": "en",      #処理言語モードの設定.jaとすると日本語として処理する.
    "include_raw": "false"
  }

  #set body
  body = Text

  #post
  response = requests.post(
    api_url,
    auth = HTTPBasicAuth(api_username, api_password),
    params = query,
    headers = headers,
    data = body
    )

  return response

if __name__ == "__main__":

  #input text
  text = "sample text. at least 600 words." #統計的に信頼できる値を獲得する場合には最低でも600単語必要.

  #get personality
  pers = get_personality(text)
  j_pers = pers.json()  #json format

  print json.dumps(j_pers, indent = 4)

エンドポイントURLは、手順1で取得した資格情報の"url"とは別物であることに注意しましょう(末尾に /v2/profile が追加されています)。
APIの詳細な設定について知りたい人は、公式のAPIトライアウトページにアクセス!
Personality Insights v2 API Explorer
エラーコードまで丁寧に解説されています。


さて、実行。

python watson_api.py


こんな感じで値が表示されたらOK。

{
    "warnings": [], 
    "tree": {
        "children": [
            {
                "children": [
                    {
                        "category": "personality", 
                        "percentage": 0.9972301565213472, 
                        "children": [
                            {
                                "category": "personality", 
                                "name": "Openness", 
                                "sampling_error": 0.0597829776, 
                                "id": "Openness", 
                                "percentage": 0.9972301565213472, 
                                "children": [
                                    {
                                        "category": "personality", 
                                        "percentage": 0.9032241090941042, 
                                        "id": "Adventurousness", 
                                        "sampling_error": 0.05072314, 
                                        "name": "Adventurousness"
                                    }, 
                                    {
                                        "category": "personality", 
                                        "percentage": 0.863707003271354, 
                                        "id": "Artistic interests", 
                                        "sampling_error": 0.1034981212, 
                                        "name": "Artistic interests"
                                    }, 
                                    {
                                        "category": "personality", 
                                        "percentage": 0.16516298671132595, 
                                        "id": "Emotionality", 
                                        "sampling_error": 0.0474305476, 
                                        "name": "Emotionality"
                                    }, 
                                    {
                                        "category": "personality", 
                                        "percentage": 0.8630065982824178, 
                                        "id": "Imagination", 
                                        "sampling_error": 0.06374967, 
                                        "name": "Imagination"
                                    }, 
                                    {
                                        "category": "personality", 
                                        "percentage": 0.9741200782232922, 
                                        "id": "Intellect", 
                                        "sampling_error": 0.055623082000000004, 
                                        "name": "Intellect"
                                    }, 
                                    {
                                        "category": "personality", 
                                        "percentage": 0.9999380670028959, 
                                        "id": "Liberalism", 
                                        "sampling_error": 0.0831092496, 
                                        "name": "Authority-challenging"
                                    }
                                ]
                            }, 
                            {
                                "category": "personality", 
                                "name": "Conscientiousness", 
                                "sampling_error": 0.07542104720000001, 
                                "id": "Conscientiousness", 
                                "percentage": 0.271517171388969, 
                                "children": [
                                    {
                                        "category": "personality", 
                                        "percentage": 0.8392060674139132, 
                                        "id": "Achievement striving", 
                                        "sampling_error": 0.0979948704, 
                                        "name": "Achievement striving"
                                    }, 
    ...
}


Big-Five personalityはOpenness、Conscientiousness、Extraversion、Agreeableness、Neuroticism(俗にOCEANと呼ばれたり呼ばれなかったりする)から構成される人格特性です。
返ってきたjson形式のファイルの中で、それぞれの名前が付いたidが含まれるオブジェクト内のpercentageの値が、そのidの人格特性のスコアです。
上の例でいうと、Openness=0.9972301565213472、Conscientiousness=0.271517171388969てな感じですね。

おわりに

このAPIは、最初の30日間は無料トライアル可能で、以降は、月100回までは無料で利用でき、100回を超えると料金が発生します(Bluemixから料金設定は確認できます)。
また、クレジットカード情報を登録した場合、その瞬間に無料トライアル期間は強制的に終了してしまうそうです( ̄エ ̄;)。
たくさん使いたい人は、クレジットカードを登録せずに最初の30日間で使いまくりましょう。

以上!