まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:insights

Watson API Explorer を実際に使って Watson API を体験してみます。今回は一人の人が書いたテキスト(メールや報告文やインターネットでの書き込みなど)を元にして、その文章の中で使われている単語の傾向や頻度などから、その人の性格を分析する、という Personality Insights API を使ってみます。

なお、このブログエントリはこの続きです。Watson API Explorer そのものの紹介など、まずはこちらの内容を一度確認ください:
Watson API Explorer の使いかた

また、Natrual Language Classifier API についてはこちらで紹介しました。今回はこれの Personality Insights 版になります:
Watson API Explorer で Natural Language Classifier を体験する


実をいうと NLC(Natural Language Classifier) の時と比べて、今回の方がシンプルな紹介になっています。NLC ではデータを学習させて、学習状況を確認して、問い合わせて、、、と色々な API が用意されていましたが、その点では Personality Insights の API は1つだけ(Deprecated な API を含めても2つだけ)なので、その紹介も簡単なのでした。


では実際に Personality Insights を使ってみましょう。まずは Personality Insights を利用するための資格情報を入手する必要があります。 IBM Bluemix にログインし、カタログ画面から Watson カテゴリ内の Personal Insights を選択してインスタンスを作成します:
2016070301


インスタンスを作成したら、そのインスタンスの「サービス資格情報」を確認します。画面内に資格情報が JSON フォーマットのテキストで表示されます。この中の username と password の値が必要になるので、メモしておきましょう。ここまでは前回と同じですね:
2016070302


ここまでの準備ができれば Watson API Explorer で Personality Insights を試してみることができます。まずは Watson API Explorer にウェブブラウザでアクセスします:
2016063000


画面内の "Personality Insights" と書かれたリンクを探してクリックします:
2016070303


すると以下のような Personality Insights API の OpenAPI document が表示されます。
2016070304


画面右上の欄に先ほどメモした username と password をそれぞれ入力します。これで API を実行することが可能になります:
2016070305


実際に性格分析を試してみましょう。性格分析を行うのは画面内リストの上にある POST /v2/profile という API です。 この API を選択します:
2016070306


この API の説明を読むと分かるのですが、性格分析はものすごくシンプルな API を呼ぶだけだったりします。まずリクエストヘッダの中で性格分析を実行するテキスト(後述)の言語を指定する必要があります。 Personality Insights API は日本語テキストにも対応しており、日本語テキストから性格を分析する場合は Content-Language ヘッダの値を "ja" に設定します:
2016070301


そして性格を分析する本文をリクエストボディ(Body)に与えます。シンプルなテキストで与える場合は Content-Type を text/plain にする必要があるので、同時に設定しておきます。なおどの言語のテキストにも言えることですが、ある程度以上の分量(というか単語量)がないと性格分析は動作できないので、それなりの分量のテキストを用意して Body に入力してください。実際にはここで与えるテキストは送信メールや SNS への書き込みなどから自動的に取得して取り出すようなものを使うイメージです:
2016070302


与える情報はこれだけです。最後に "Try it out!" ボタンをクリックして API を実行します:
2016070303


与えたテキストの分量が少なすぎたりすると 200 以外のステータスコードになって失敗しますが、HTTP ステータスコード 200 が返ってくれば成功です。その場合、Response Body には性格分析結果の JSON テキストが返ってくるはずです:
2016070304


なお日本語テキストの場合、動作するためには最低でも 70 単語が必要で、ある程度の精度を求めるには 3,500 単語以上、一般的には 6,000 単語以上必要である、とのことです(という警告メッセージがアウトプットされた JSON テキストの中に書かれています)。なので、例えばメールにしても1回に送信するメールの中身だけだと、動くことは動くが、あまり精度の高い結果にはならないことが予想されます。アプリケーションとして実装するには、それなりの量のインプットデータを入手する仕組みと併せて実装する必要があるように思えます。

アウトプットされた結果の意味も Watson API Explorer の画面で解説されているのですが、簡単に日本語でも紹介しておきます。

API 実行が成功した場合の JSON テキストは以下のようになっているはずです:
{
  "id": "*UNKNOWN*",
  "source": "*UNKNOWN*",
  "word_count": 250,
  "word_count_message": "There were 250 words in the input. We need a minimum of 3,500, preferably 6,000 or more, to compute statistically significant estimates",
  "processed_lang": "ja",
  "tree": {
    "id": "r",
    "name": "root",
    "children": [
      {
        "id": "personality",
        "name": "Big 5",
        "children": [
          {
            "id": "Openness_parent",
            "name": "Openness",
            "category": "personality",
            "percentage": 0.8817962669891322,
            "children": [
              {
                "id": "Openness",
                "name": "Openness",
                "category": "personality",
                "percentage": 0.8817962669891322,
                "sampling_error": 0.06374453499999999,
                "children": [
                  {
                    "id": "Adventurousness",
                    "name": "Adventurousness",
                    "category": "personality",
                    "percentage": 0.6949448384206791,
                    "sampling_error": 0.053405595
                  },
                  {
                    "id": "Artistic interests",
                    "name": "Artistic interests",
                    "category": "personality",
                    "percentage": 0.5663919553503082,
                    "sampling_error": 0.108869125
                  },
                     :
                     :

この結果は結構深い階層構造になっています。まず結果の "tree" 要素の中に性格分析結果が含まれています。その下の "children" の中は3つの要素からなるカテゴリー別の分析結果(の配列)になっていて、最初の1つ目が "Big 5" と呼ばれる手法に従っての性格分析結果になっています。"Big 5" という名前の通り、5つのカテゴリに分けた性格分析がされており、その子要素(children)の最初は "Openness"(開放性)に関する分析結果になっています。Openness の下にも更に細分化された性格分析の結果が含まれており、上記例ですと "Adventurousness"(冒険性)が 0.6949.. つまり約 69.5 %、そのサンプリングエラー値が約 5.3% である、という結果になっています。同様に "Artistic interests"(芸術への理解)の値は約 56.6% で、サンプリングエラー値は約 10.9% である、とされています。このような形での性格分析結果が1つの JSON テキストでまとめて得られてた、ということが分かります。


Watson Personality Insights API による性格分析というのはこのようなものです。つまり入力したテキストに対する分析結果を JSON テキストで返す、という非常にシンプルなものです。この結果をどのように視覚化するか、という部分に関しては原則的には利用者に任されていますが、一例がもう1つの API (POST /v2/visualize ※deprecated)として提供されています。

先ほどの POST /v2/profile の結果の JSON テキストをそのまま POST /v2/visualize を展開した Body に入力します。Content-Type を application/json に設定しておきます:
2016070305


この状態で "Try it out!" ボタンをクリックすると、/v2/profile の結果を使った視覚化処理が行われ、実際にウェブページ内で視覚化を行うための HTML(の一部)が Response Body に返されます:
2016070306


Response Body の中身は HTML 内で使える <script> タグ(<script> ~</script>)なので、これに適当な HTML タグを与えてブラウザで開くと、性格分析結果がこのようなパイチャートのグラフになって表現することができます:
2016070307


ただ、このパイチャート形式のグラフで表現するのはあくまで一例であって、これを使わなければならない、というものではありません。実際に API 自体も deprecated 扱いになっていますし、参考程度に使ってください。

なお、Personality Insights の API そのものの詳細については以下のリファレンスを参照ください:
http://www.ibm.com/watson/developercloud/personality-insights/api/v2/


 

祝 IBM Watson サミット 2016 開催記念!

本当は政治家相手のを作ってましたが、こっちの総選挙が近いので急遽AKB版を作りました。「自分と性格の近い/遠い総選挙メンバーを調べる」というサービスです:


僕個人のプロフィールを知っている人であればなんとなく想像しているかもしれませんが、このサービスは IBM WatsonPersonality Insights という、個人の性格分析 API を使って開発しています。

具体的には、今回の総選挙に立候補を表明したメンバー(http://sousenkyo.akb48.co.jp/member.php)の中で、ツイッターアカウントを持っている人を対象に上記 Watson API を使って性格を分析しています。この分析済みのデータと、利用する人(あなた)のツイッターデータから分析した性格を比較します。性格分析には Big 5 と呼ばれる5つの視点からの性格分析を行い、それぞれの項目ごとと全体とで利用者に似た性格のメンバーと、性格の遠いメンバーとを調べて図示します。

インプットデータにツイッターのツイートを使うため、ツイッターのアカウントを持っていること(そしてある程度の量をツイートしていること)が前提になります。ただツイッターアカウントを持っていなくても、各メンバーの性格を参照することは可能です(その場合、自分との比較はできません):
2016052203


実際に比較する場合は画面右上のツイッターアイコンをクリック(タップ)してツイッターにログイン、するだけで、結果を表示してくれます。スマホから利用する場合は結果のチャートが潰れてしまうのを避けるため、画面を横向き(横長)にして実行してください。


性格は客観的な分析が難しく、本人でもわかっていない部分があったりしますが、このサービスではツイッターというツールを使い、その中で使われている語彙や単語の傾向などから性格を分析します。なお、インプットデータは直近400件のツイートデータです。AKB メンバーの性格分析には2016/05/20時点での直近400データを使いました。利用者の性格はリアルタイムに直近400データを使います(なので、一度調査した後にいくつかツイートして、再度調べると結果が変わる可能性があります)。自分の推しメンと性格が近いのか遠いのか、そして自分の知らない一面に気付くと同時に、新たな増しメンの可能性を追求していますw

※400件ツイートしてないとダメ、というわけではないのですが、あまりにデータが少ないと性格分析ができないため、目安として400件を意識してください。


あとはまあ普通の同様のサービスのように、結果をシェアする、といった機能も含めました。ちなみに「フレッシュレモン推し」の僕の(2016/05/22 時点での)結果はこんな感じでした:
http://akb-finder.mybluemix.net/result.jsp?id=dotnsf

(全体的に似てるのは入山さん)
2016052201


(Big 5 個別だと東さんと森田さんが近そう。確かにレーダーチャート的にはそっくり)
2016052202


正直、まだ画面構成やデバッグなど不十分な点は自覚していますが、できれば総選挙前に(自分の票をどこに入れるのかの参考にするために)リリースしたかったので、この段階でリリースすることにしました。特に見栄えの未熟な点はご容赦ください。



以下はこのサービスで使っている技術についての解説です。こういう人工知能的なテクノロジーに興味がある人向けです。

まずこのサービスで使っている性格分析 API である IBM Watson Personality Insights について日本語で紹介している資料はまだあまり多くないのですが、以下の PDF はその技術解説や日本語化の裏話、将来的な可能性についての読み物として公開されているものです。興味ある方はご一読いただくことをオススメします:
http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?htmlfid=CO113416JPJA

技術的な視点では、このような人の性格分析がウェブの API として、それも(日本語の)テキストをインプットするだけで性格をアウトプットしてくれる、という簡易さが今後のユーザー向けサービスを大きく変える可能性を秘めていると思っています。

PDF の中でも触れられていますが、人の性格を分析するのは決して簡単なことではありません。にも関わらず、多くのベータユーザーの皆さんの協力や、研究の成果によって、「一人の人が書いたテキスト」から性格の傾向を分析することに成功し、ある程度の実証ができるようになりました。そしてその機能が誰でも(ウェブ上に公開された API として)利用できるようになりました。まずこの点で画期的なブレイクスルーが実現しています。

「一人の人が書いたテキスト」をどのようにして集めるか、という問題もあります。ただウェブであれば、このサービスで実現したようなツイッターや facebook といった SNS のデータを使うことができます。企業内利用であればユーザーの送信メールや社内掲示板や電子報告書などからもデータを取得することが可能です(プライバシーポリシーにもよりますけど、技術的には簡単ですよね)。またサービス利用者からの問い合わせ内容を再利用することも可能です。

そして性格が分析できると、「似た人」や「遠い人」、「何が似ているのか?」といった要素がわかってきます。そして似た人の行動を(個人情報を開示しない形で)提供する、という新しいリコメンドの可能性も見えてきます。それらが(充分な量の)テキストから取得できるようになる、という可能性を秘めていることになります。

ただし、「性格分析結果のどこまでを個人情報として扱うべきか?」などの新しい問題も出てきます。「個人を特定可能なのか?」、「性格分析の精度は?」、「法の整備は?」、「会社としてのポリシーをどうすべきか?」などなど。 人工知能技術の発展によって、どこまでロボットの人格を認めるべきかという議論の必要性が考えられますが、同時にそのロボットの判断結果をどこまでセキュアに保護すべきか?という議論も必要になってくるわけです。

私も API を使ってアプリやサービスを作っている立場として、色々な意味で新しい世界に踏み込みつつあることを実感しています。


というわけで、言い出しっぺの役割もあると思い、今年はフレッシュレモンこと市川美織さんに加えて入山杏奈さんの2名に票を投じることを宣言します!



IBM Bluemix から提供されているワトソン関連の API の中には、入力テキストを元に性格を分析する、という Perosnality Insights API があります:
2016040103


僕の以前のブログエントリでもリリース時にレポートしています。その時の様子はこちらを参照ください:
Bluemix の性格分析 API が正式サービス化  (←改めて見ると中身のないエントリだ・・・)



この Personality Insights API のリリースノートを眺めていて気付いたのですが・・・
2016040101


なんと、いつの間にか日本語対応していたっぽいです! POST 時の JSON パラメータか、あるいは HTTP リクエストヘッダで Content-Language を ja にすればよい、とのこと。

今日(2016/Apr/01)エイプリルフールだけどマジか!? ということで試してみました。HttpClient ライブラリを使った Java でのサンプルですが、こんな感じで:
String pi_url = "https://gateway.watsonplatform.net/personality-insights/api";
String pi_username = "(ユーザー名)", pi_password = "(パスワード)";
String body = "・・・・・(日本語テキスト)・・・・・";

HttpClient client = new HttpClient();
byte[] b64data = Base64.encodeBase64( ( pi_username + ":" + pi_password ).getBytes() );

PostMethod post = new PostMethod( pi_url + "/v2/profile" );
post.setRequestHeader( "Content-Language", "ja" ); //. 日本語であることを宣言
				
post.setRequestHeader( "Authorization", "Basic " + new String( b64data ) );
post.setRequestHeader( "Content-Type", "text/plain" );
post.setRequestBody( body ); //. 日本語テキストをポスト
				
int sc = client.executeMethod( post );
String out = post.getResponseBodyAsString(); //. 結果


結果の out 変数を出力すると、このような値が含まれていました:
2016040102

 ↑僕の最近のツイッターからインプットテキストを作りました。「チャレンジが足りない」とか言われてる気がする・・・ 



結果の JSON テキストが返ってきています。しかも "proccessed_lang" の値がちゃんと "ja" になっているので、日本語テキストとして処理された、ということになります。JSON の結果そのものは英語で返されていますが、日本語のテキストを元に性格分析ができるようになった、ということです。おおーっ!これは使いみちありそうだぞ。

例えばメールや SNS など、特定の1名のユーザーが入力したテキスト情報を充分な量集めてこの API を実行すれば、そのユーザーの性格という属性の塊を得ることができるようになるわけです。電話などでの会話の音声データをテキスト化してインプットデータとする、ということも考えられます。そして Personality Insights API を実行した結果を使って、そのユーザーの性格にあった対応や返答をプロアクティブに行うこともできるようになるわけで、それが日本語でも可能になったわけです。

色々楽しみが増えました。なお Personality Insights API の具体的な使い方を含めた API リファレンスはこちらを参照ください:
https://watson-api-explorer.mybluemix.net/apis/personality-insights-v2#!/personality-insights/


↑この API リファレンス内の記述だと、まだ英語とスペイン語のみ、という記述になってますね。ドキュメントが追いついてないくらいの最新情報でした!


IBM Bluemix から提供されている各種 API の中に Insights for Twitter サービスがあります:
2015102901


Twitter のつぶやきデータに、IBM が付与した感情やユーザーの推定属性をデータベース化して、検索 API として提供しているものです。(Twitter 社が提供している)標準 API ではできないような検索絞り込みが出来たり、標準 API では制限されているような、時間あたり API 利用回数制約もなく使える、という特徴があります。

この Insights for Twitter API には2つの価格プランがあります:
2015102902


1つは Free プランで、もう1つは Entry プランです。上の図を見ると、Free プランは無料で月に500万件までのツイートを取得可能、Entry プランは月額21万円で月に100万件のツイートを取得可能、と書かれているように見えます。。

「え? 逆じゃないの??」

と思うかもしれませんが、実は正しいのです。この価格について、もう少しきちんと説明します。

実はこの2つのプランは取得できるデータに違いがあります。Free プランで取得できるデータ源は decahose と呼ばれているもので、ツイートデータ全体の約10分の1が母集団になっています(つまり、検索データベースの中に含まれていないツイートも多い)。標準の Twitter API を一般の開発者が使う場合もこの decahose を対象にツイートデータを取得できる、というものです。一方 Entry プランで取得できるデータ源は firehose と呼ばれる全ツイートデータです。標準 Twitter API を使う一般の開発者がアクセスできるものではなく、限られた環境下でのみ提供されているものです。Bluemix の Insights for Twitter API の Entry プランを申し込んでいただいた場合は、そこにアクセスできるようになる、ということになります:

Free プラン比較Entry プラン
無料料金月額21万円
500万1ヶ月間に取得できるレコード量100万
decahose
全ツイートの10分の1
データ源firehose
全ツイート


Free プランで取得できるデータは、オリジナルの Twitter API で取得できるデータと比べてデータ源は変わりません。ただ IBM のインサイト情報が付与されており、感情やユーザー属性を指定した便利な検索が可能になっています。
一方、Entry プランを使うと便利な検索機能に加え、一般の開発者権限ではアクセスすることのできない firehose にアクセスすることができる(より実態に近いデータを集めることができる)、という点が大きな違いと言えます。


・・・って、軽く書いちゃったけど、firehose にアクセスできる環境が入手できるって凄いことだよね。しかも体験期間中であれば無料ってこと? (O.O ;


IBM が提唱する新しい人工知能である「コグニティブコンピューティング」、その柱となる Watson アナリティクスの API を使った PHP プログラムを作ってみます。API そのものは REST のウェブ API なので、PHP 以外の別言語であっても簡単に移植できると思います(PHP だと記述がシンプル&見やすい、という理由で選んでいます)。


まず最初にこのサービスの内容を簡単に紹介します。まずはこちらのデモサイトにアクセスしてみてください:
https://watson-pi-demo.mybluemix.net/

2015060801


画面左のテキストエリアに長文が入力されています。これはサンプルで、ある一人の人が誰かに宛てて書いたメールの本文だと思ってください。そして、この Personality Insights API はそのメール本文で使われている単語や文法を元に、書いた人の性格を分析して、その結果を返してくれる、というものです。実際に分析を実行するには "Analyze" ボタンをクリックします。

すると画面右に分析結果が一覧表示されます:
2015060802


分析結果はカテゴライズされていて、例えば "Openness(社交性)" が 94%、その Openness を更に細分化すると、Adventurousness(冒険性) が 72%、Artistic interests(芸術への興味) が16%、・・・ といった感じになっています。

また、これは人工知能とは異なりますが、オプションとしてこの結果を視覚化する機能も提供されています(deprecated)。画面を下にスクロールするとグラフ化された結果が確認できます:
2015060803


Watson Personal Insights API は、このように「入力したテキスト」を元に「性格分析結果の JSON」を返す API です。最新の API 詳細についてはリファレンスを参照ください:
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/apis/#!/personality-insights

このリファレンスにも記述されていますが、性格分析を行う機能は /v2/profile という API で提供されています。このエンドポイントに対して、入力テキストをそのまま POST すればよい、という簡単な API のようです。


というわけで、実際にこのサービスを使って性格分析を行う、という内容のシンプルなプログラムを PHP で記述してみます。 

なお、この API は現在対応言語が英語のみとなっているため、ポストする入力テキストは英語で記述されている必要があり、かつある程度の精度を確保する目的で 100 単語以上をポストする必要があります。場合によっては事前に翻訳してから実行する、という処理が必要になることをご了承ください。


IBM Bluemix にログインし、(PHP の)ランタイムを1つ作成してください。ここまでの手順がよく分からない場合はこちらのエントリを参照してください:
http://dotnsf.blog.jp/archives/1000961115.html

この例では dotnsf-watsonpi という名前の PHP ランタイムを1つ作成しています。ここで「サービスまたは API の追加」をクリックします:
2015060901


サービスの一覧が表示されます。非常に多くのサービスが並んでいますが、Watson カテゴリ内の "Personality Insights" サービスをクリックして選びます:
2015060902


サービス内容を確認します。この Personality Insights API は有料サービスであり、API を月に100回実行するまでは無料です。それ以降は1回の実行につき63円かかります(Bluemix の30日間無料トライアル期間中であれば101回目以降も無料です)。この価格に関しては今後変更される可能性があるので、最新の情報についてはその都度確認してください。最後に先程作成したランタイムの名前(この例では dotnsf-pi)が選択されていることを確認して「作成」ボタンをクリックします。更に再ステージングについて問われたら「再ステージ」をクリック:
2015060903


これで PHP のランタイムに Watson Personality Insights サービスがバインドされました。この時点で API を利用するための資格情報を確認できます。資格情報を確認するには Personality Insights サービスアイコンの「資格情報の表示」と書かれた部分をクリックします:
2015060904


画面が縦に広がって、このような情報が出力されます:
2015060905


出力された中身はこのような内容の JSON テキストになっています。ここに API を実行するために不可欠な情報(特に赤字部分)が書かれています。なお username と password はこの API を実行する際に指定するユーザー名とパスワードで、実際にはランダムに生成された文字列になっています:
{
  "personality_insights": [
    {
      "name": "Personality Insights-74",
      "label": "personality_insights",
      "plan": "IBM Watson Personality Insights Monthly Plan",
      "credentials": {
        "url": "https://gateway.watsonplatform.net/personality-insights/api",
        "username": "(username)",
        "password": "(password)"
      }
    }
  ]
}

この url の情報と、上記の API リファレンスを組み合わせると API が実行できます。例えば上記デモサイトで行ったような、あるテキストメッセージを書いた人の性格を API で問い合わせる場合を調べてみます。

リファレンスによると "/v2/profile" という関数が目的の検索機能であり、ここに POST メソッドの本文としてメール本文の内容を付与して実行すればいい、ということが書かれています:
2015060906


実際に API を実行するプログラムを記述する際の API エンドポイントは上記 JSON に書かれていた url 値である "https://gateway.watsonplatform.net/personality-insights/api" に、リファレンスの内容を足した "https://gateway.watsonplatform.net/personality-insights/api/v2/profile" になります。この URL に JSON 内の username および password の情報を使って Basic アクセスをして、性格を解析したいテキスト本文を POST する、という処理内容を記述することになります。

では書かれている通りの内容で PHP プログラム(wpi.php とします)を作ってみると、こんな感じになりますかね。エラーハンドリングなどは省略して、なるべくシンプルにしています。TIPS として触れておくと HTTP リクエストヘッダに "Content-Type: text/plain" の指定が必須です:
<?php
// エンドポイント
$url = 'https://gateway.watsonplatform.net/personality-insights/api/v2/profile';

// 認証
$username = '(username)'; // JSON に書かれていた内容を指定
$password = '(password)'; // JSON に書かれていた内容を指定

// 本文(198単語)
$data = "Call me Ishmael. Some years ago-never mind how long precisely-having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen and regulating the circulation. Whenever I find myself growing grim about the mouth; whenever it is a damp, drizzly November in my soul; whenever I find myself involuntarily pausing before coffin warehouses, and bringing up the rear of every funeral I meet; and especially whenever my hypos get such an upper hand of me, that it requires a strong moral principle to prevent me from deliberately stepping into the street, and methodically knocking people's hats off-then, I account it high time to get to sea as soon as I can. This is my substitute for pistol and ball. With a philosophical flourish Cato throws himself upon his sword; I quietly take to the ship. There is nothing surprising in this. If they but knew it, almost all men in their degree, some time or other, cherish very nearly the same feelings towards the ocean with me.";

// POST で API 実行
$headers = array(
    'Authorization: Basic '.base64_encode($username.':'.$password),
    'Content-Type: text/plain' // 必須指定
);
$options = array('http' => array(
    'method' => 'POST',
    'content' => $data,
    'header' => implode("\r\n", $headers)
));
$result = file_get_contents($url, false, stream_context_create($options));

// 結果を出力
echo $result;
?>

このプログラム(wpi.php)を実行すると、こんな感じの結果が出力されます(見やすいように改行と赤字コメントを加えています。ただ性格分析は僕の専門ではないので、おかしな翻訳やコメントになっていたらごめんなさい):
$php -f wpi.php

{
 "id":"*UNKNOWN*",
 "source":"*UNKNOWN*",
 "word_count":198, 単語数
 "word_count_message":"There were 198 significant words in the text, we recommend text with at least 100 (and preferably 2,000) words",
 "tree":{ 分析結果のツリーはここから
  "id":"r",
  "name":"root",
  "children":[
   {
    "id":"personality",
    "name":"Big 5 ", ビッグ5と呼ばれる性格分析結果
    "children":[
     {
      "id":"Neuroticism_parent",
      "name":"Emotional range", 感受性
      "category":"personality",
      "percentage":0.8918895452867617, 89%
      "children":[ 感受性の子要素
       {
        "id":"Openness",
        "name":"Openness", 社交性
        "category":"personality",
        "percentage":0.715912798590218, 72%
        "sampling_error":0.28262000000000004, そのサンプリングエラー率 28%
        "children":[ 社交性の子要素
         {
          "id":"Adventurousness",
          "name":"Adventurousness", 冒険心
          "category":"personality",
          "percentage":0.24200589364589645, 24%
          "sampling_error":0.2349836 そのサンプリングエラー率 23%
         },
         {
          "id":"Artistic interests",
          "name":"Artistic interests", 芸術への興味
          "category":"personality",
          "percentage":0.1779719351186918, 18%
          "sampling_error":0.47357392 そのサンプリングエラー率 47%
         },
         {
          "id":"Emotionality",
          "name":"Emotionality",
          "category":"personality","percentage":0.8348632312299376,
          "sampling_error":0.26339703999999997
         },
         {
          "id":"Imagination",
          "name":"Imagination",
          "category":"personality",
          "percentage":0.40246782944324716,
          "sampling_error":0.31812512000000004
         },
         {
          "id":"Intellect",
          "name":"Intellect",
          "category":"personality",
          "percentage":0.5337358423377544,
          "sampling_error":0.28229272
         },
         {
          "id":"Liberalism",
          "name":"Authority-challenging",
          "category":"personality",
          "percentage":0.9036798826551202,
          "sampling_error":0.36567567999999995
         }
        ]
       },       {
        "id":"Conscientiousness",
        "name":"Conscientiousness",
        "category":"personality",
        "percentage":0.5445535670078625,
        "sampling_error":0.35129408,
        "children":[
         {
          "id":"Achievement striving",
          "name":"Achievement striving",
          "category":"personality",
          "percentage":0.2700341317349067,
          "sampling_error":0.32485944
         },
         {
          "id":"Cautiousness",
          "name":"Cautiousness",
          "category":"personality",
          "percentage":0.742529850394309,
          "sampling_error":0.36339328000000004
         },
         {
          "id":"Dutifulness",
          "name":"Dutifulness",
          "category":"personality",
          "percentage":0.3009058388302808,
          "sampling_error":0.44760968
         },
         {
          "id":"Orderliness",
          "name":"Orderliness",
          "category":"personality",
          "percentage":0.9511955761089055,
          "sampling_error":0.294814
         },
         {
          "id":"Self-discipline",
          "name":"Self-discipline",
          "category":"personality",
          "percentage":0.2560312591429979,
          "sampling_error":0.38256207999999997
         },
         {
          "id":"Self-efficacy",
          "name":"Self-efficacy",
          "category":"personality",
          "percentage":0.6787093695767238,
          "sampling_error":0.41188784
         }
        ]
       },
       {
        "id":"Extraversion",
        "name":"Extraversion",
        "category":"personality",
        "percentage":0.14544123271874,
        "sampling_error":0.38825928,
        "children":[
         {
          "id":"Activity level",
          "name":"Activity level",
          "category":"personality",
          "percentage":0.032364142051857475,
          "sampling_error":0.48726208000000004
         },
         {
          "id":"Assertiveness",
          "name":"Assertiveness",
          "category":"personality",
          "percentage":0.1717311752830918,
          "sampling_error":0.4465296
         },
         {
          "id":"Cheerfulness",
          "name":"Cheerfulness",
          "category":"personality",
          "percentage":0.1353039029992872,
          "sampling_error":0.34023712
         },
         {
          "id":"Excitement-seeking",
          "name":"Excitement-seeking",
          "category":"personality",
          "percentage":0.031036118864266764,
          "sampling_error":0.36140536
         },
         {
          "id":"Friendliness",
          "name":"Outgoing",
          "category":"personality",
          "percentage":0.04360600032167501,
          "sampling_error":0.41489215999999995
         },
         {
          "id":"Gregariousness",
          "name":"Gregariousness",
          "category":"personality",
          "percentage":0.00993996956776937,
          "sampling_error":0.42565192
         }
        ]
       },
       {
        "id":"Agreeableness",
        "name":"Agreeableness",
        "category":"personality",
        "percentage":0.41731474192057555,
        "sampling_error":0.37315656,
        "children":[
         {
          "id":"Altruism",
          "name":"Altruism",
          "category":"personality",
          "percentage":0.1893141565019656,
          "sampling_error":0.4574676
         },
         {
          "id":"Cooperation",
          "name":"Cooperation",
          "category":"personality",
          "percentage":0.7569715715364396,
          "sampling_error":0.42429936
         },
         {
          "id":"Modesty",
          "name":"Modesty",
          "category":"personality",
          "percentage":0.05410449484777291,
          "sampling_error":0.43126808000000005
         },
         {
          "id":"Morality",
          "name":"Uncompromising",
          "category":"personality",
          "percentage":0.6031683897259557,
          "sampling_error":0.40826744000000004
         },
         {
          "id":"Sympathy",
          "name":"Sympathy",
          "category":"personality",
          "percentage":1.0,
          "sampling_error":0.47322736
         },
         {
          "id":"Trust",
          "name":"Trust",
          "category":"personality",
          "percentage":0.18556199834989792,
          "sampling_error":0.4375552
         }
        ]
       },
       {
        "id":"Neuroticism",
        "name":"Emotional range",
        "category":"personality",
        "percentage":0.8918895452867617,
        "sampling_error":0.28468672,
        "children":[
         {
          "id":"Anger",
          "name":"Fiery",
          "category":"personality",
          "percentage":0.8060263824156899,
          "sampling_error":0.25980440000000005
         },
         {
          "id":"Anxiety",
          "name":"Prone to worry",
          "category":"personality",
          "percentage":0.7723866874361663,
          "sampling_error":0.29556752
         },
         {
          "id":"Depression",
          "name":"Melancholy",
          "category":"personality",
          "percentage":0.5106478670677633,
          "sampling_error":0.3757664
         },
         {
          "id":"Immoderation",
          "name":"Immoderation",
          "category":"personality",
          "percentage":0.6744415372949466,
          "sampling_error":0.26551199999999997
         },
         {
          "id":"Self-consciousness",
          "name":"Self-consciousness",
          "category":"personality",
          "percentage":0.7924144626881476,
          "sampling_error":0.4019884
         },
         {
          "id":"Vulnerability",
          "name":"Susceptible to stress",
          "category":"personality",
          "percentage":0.9138950516717607,
          "sampling_error":0.29872272
         }
        ]
       }
      ]
     }
    ]
   },
   {
    "id":"needs",
    "name":"Needs",
    "children":[
     {
      "id":"Closeness_parent",
      "name":"Closeness",
      "category":"needs",
      "percentage":1.0,
      "children":[
       {
        "id":"Challenge",
        "name":"Challenge",
        "category":"needs",
        "percentage":0.9821912864702969,
        "sampling_error":0.81476168
       },
       {
        "id":"Closeness",
        "name":"Closeness",
        "category":"needs",
        "percentage":1.0,
        "sampling_error":0.8723808799999999
       },
       {
        "id":"Curiosity",
        "name":"Curiosity",
        "category":"needs",
        "percentage":1.0,
        "sampling_error":0.78142888
       },
       {
        "id":"Excitement",
        "name":"Excitement",
        "category":"needs",
        "percentage":1.0,
        "sampling_error":0.7837571999999999
       },
       {
        "id":"Harmony",
        "name":"Harmony",
        "category":"needs",
        "percentage":1.0,
        "sampling_error":0.82233096
       },
       {
        "id":"Ideal",
        "name":"Ideal",
        "category":"needs",
        "percentage":0.04112302144450648,
        "sampling_error":0.77215992
       },
       {
        "id":"Liberty",
        "name":"Liberty",
        "category":"needs",
        "percentage":0.0033214357670770067,
        "sampling_error":0.81046376
       },
       {
        "id":"Love",
        "name":"Love",
        "category":"needs",
        "percentage":1.0,
        "sampling_error":0.85773144
       },
       {
        "id":"Practicality",
        "name":"Practicality",
        "category":"needs",
        "percentage":1.0,
        "sampling_error":0.83880064
       },
       {
        "id":"Self-expression",
        "name":"Self-expression",
        "category":"needs",
        "percentage":0.0068972518833839295,
        "sampling_error":0.79480384
       },
       {
        "id":"Stability",
        "name":"Stability",
        "category":"needs",
        "percentage":0.07939535553110567,
        "sampling_error":0.80823464
       },
       {
        "id":"Structure",
        "name":"Structure",
        "category":"needs",
        "percentage":0.02549425311812723,
        "sampling_error":0.06421888
       }
      ]
     }
    ]
   },
   {
    "id":"values",
    "name":"Values",
    "children":[
     {
      "id":"Conservation_parent",
      "name":"Conservation",
      "category":"values",
      "percentage":0.00995039863428774,
      "children":[
       {
        "id":"Conservation",
        "name":"Conservation",
        "category":"values",
        "percentage":0.00995039863428774,
        "sampling_error":0.4966044
       },
       {
        "id":"Openness to change",
        "name":"Openness to change",
        "category":"values",
        "percentage":0.9711138591560894,
        "sampling_error":0.5254172
       },
       {
        "id":"Hedonism",
        "name":"Hedonism",
        "category":"values",
        "percentage":0.9245332640747028,
        "sampling_error":0.51724872
       },
       {
        "id":"Self-enhancement",
        "name":"Self-enhancement",
        "category":"values",
        "percentage":0.3464581176518462,
        "sampling_error":0.50278936
       },
       {
        "id":"Self-transcendence",
        "name":"Self-transcendence",
        "category":"values",
        "percentage":0.8998366368666929,
        "sampling_error":0.47211168
       }
      ]
     }
    ]
   }
  ]
 }
}

JSON が複雑な親子関係になってはいますが、基本的にはデモサイトの画面右側に出力されていたものと同じ構成の結果が返ってきている、ということが分かると思います。更によく見ると、各項目ごとの結果には "percentage" という数値結果に加えて、"sampling_error" という数字があることに気付きます。これはデモサイトの結果には表示されていない情報です。

この sampling_error(サンプリングエラー率)とは、いわゆる「誤差」のことです。つまり本来の値と、今回の入力に使ったテキストだけから得られた結果との間にどれだけの誤差が生じている可能性があるか、という数値です。要はこの数値が小さい項目ほど結果が正しい可能性が高くなる、という数値です。デモサイトだけを使っているとこのサンプリングエラーを意識することはありませんが、実はこういった誤差率までが取得できる API が用意されている、ということになります。


で、後は得られたこの結果をどうやって使うのか、そもそも入力テキストをどこからどうやって取得するのか、、、 それは開発者のアイデア次第です! ということで(笑)

 

このページのトップヘ