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

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

タグ:personality

ちょっとした目的で実験的に調査&開発していたウェブアプリの話がポシャりそうなので、アプリだけ公開することにしました。

やりたかったのはウェブアプリで
 1 日本語音声を認識して日本語テキスト化して、
 2 そのテキストを形態素解析して単語分解した上で、
 3 単語の出現頻度をタグクラウドで視覚化し、
 4 (ある程度以上の語彙が集まったら)テキスト内容から感情分析を行ってグラフ化する
 5 1~4をリアルタイムに行う(音声認識が途切れるタイミングで全情報を更新する)
というものでした。

技術的には色々な実現手段があるのですが、今回は実験的に作っていた経緯もあるので、
 1 Web Speech API
 2 TinySegmenter
 3 jQCloud
 4 色々使って独自実装
で作っています。

本当は4で IBM Personality Insight API とか使えると簡単でよかったのですが、今回は使っていないことを白状しておきます。また1の実装の都合上、PC 版 FireFox では動きません。後述のサンプルを利用する際には PC の Chrome か  Edge で試していただきたいです(互換性という意味では Android 版 Chrome でも動くことになっていますが、自分のテストでは認識精度がかなり悪かったので PC での利用をお勧めします)。また4の実装の中で利用回数に制約のある無料 API を使っているため、使いすぎて(使われすぎて)限度回数を超えてしまうとその月の間は動かなくなる、という点をご了承ください。

で、作って公開してみたのがこちらです。繰り返しますが PC 版 Chrome でアクセスしてください:
https://dotnsf.github.io/webspeechpi/


アクセスするとこのような画面が表示されます。右上の青いマイクボタンをクリックすると音声認識モードに切り替わります(初回のみマイクアクセスの許可を求められるので「許可」してください):
2022052901


音声認識モードに切り替わると青だったボタンは赤く変わります。またウェブページのタブに音声収集中であることを示す赤いマークが表示されます(ちなみにもう一度赤マイクボタンをクリックすると青マイクボタンに戻り、音声認識モードからも抜けます):
2022052902


この音声認識モードの状態でマイクに日本語で話しかけると、その文章が認識されて表示されます。ある程度の長さの無音状態が続くまでは1つの文章とみなして、たまに内容を変更・調整しながら認識を続けます:
2022052903


ある程度の長さの無音状態を認識すると、それまでに認識した文章を形態素解析し、名詞や動詞、形容詞といった、文章内容の肝となりうる単語がタグクラウドで表示されます:
2022052904


この認識文章の量が少ないとタグクラウドだけが表示されますが、ある程度以上の文章が認識されるとタグクラウドに加えて、そのテキスト内容から話している人の感情を5つの要素で分析して、その結果がレーダーチャートで表示されます。このタグクラウドとレーダーチャートは文章が入力されるごとに更新されます:
2022052905


と、まあこんな感じのものです。もともとはある業務目的のために作っていたものですが、不要になりそうだったので、せっかくなのでアプリ部分だけ公開することにしました。感情分析の精度は恥ずかしくなるようなものなので、ネタ程度に使ってみてください(笑)。本当は形態素解析ももう少し高度にできるのですが、無料公開できるものを作ろうとするとこんな感じになりました。

ウェブアプリそのものの(フロントエンド部分の)ソースコードはこちらで公開しています:
https://github.com/dotnsf/webspeechpi


感情分析 API はフロントエンドには含まれていません(公開していない理由はあまりに雑な実装で恥ずかしいため)。こちらの実装の中身に興味ある方がいたら教えてください。




以前にも似たようなものを何度か作ったことがあったのですが、その最新改良作品です。 ツイッターでのつぶやき内容を元に自分の性格を分析して、その内容が時間とともにどのように変化していくか、を視覚化するというものです。

実際に自分の3月21日時点でのツイートを元にためしてみた結果がこちらです。なお現時点でスマホで表示する場合はレイアイトが最適化されていないため画面を横にして御覧ください:
https://personality-transition.mybluemix.net/transition/6f24cd50fa6f528cdd3162aadb716b03

2020032101


画面は最上部にシェア用のアイコンが並んだ下に性格を分析した本人の twitter アイコンと名前が表示され、その下に IBM Watson Personality Insights API を使った分析結果の「性格分析」と「消費行動動向」が表示されます(「消費行動動向は初期状態では省略表示されているので、内容を表示するには三角形部分をクリック(タップ)してください)。

性格分析はビッグ5と呼ばれる5つの性格要素(知的好奇心、誠実性、外向性、協調性、感情起伏)に加え、ニーズ(共感を呼ぶ度合い)&価値(意思決定に影響を及ぼす要素)という7つのカテゴリを更に細分化した結果がレーダーチャートで表示されます:
2020032102


また消費行動動向はその性格から結びつく消費行動の度合いが表示されます(色の濃い方がその要素が高く、薄い方が低い、という意味です):
2020032103


画面最下部にはスライダーが表示されています。初期状態では一番右にセットされていて、これは時間的に一番新しい分析結果が表示されていることを意味します:
2020032104


このスライダーを左に移動していくと少しずつ前の(古い)性格分析結果や消費行動動向が表示されていきます。自分の性格が時間とともにどのように変化していったのか/変わらない要素は何か といった内容がわかるようになる、というものです:
2020032105


このページの画面右上のリンクから皆さんのツイートでも試すことができます。興味ある方はぜひ挑戦してみて、よろしければその結果を SNS でシェアしてみてください:
https://personality-transition.mybluemix.net/transition/6f24cd50fa6f528cdd3162aadb716b03



以下、このサービスを実現する上での技術要素の説明です。なおソースコードは公開していますので興味ある方はこちらも参照ください。なお IBM Cloud を使って動かす想定のコードとなっており、後述の IBM Watson やデータベース機能含めて無料のライトアカウントの範囲内でもデプロイ可能な内容となっています:
https://github.com/dotnsf/personality_transition


このサービスは Node.js で実装していますが、サービスを実現する上で利用しているライブラリは大きく3つです。1つ目は Twitter のログイン認可を実現するための OAuth 、2つ目は認可したユーザーのツイートを取得するための Twitter API 、そして3つ目は取得したツイート内容から性格分析を行う IBM Watson Personality Insights API です。

なお、ここで使っている IBM Watson Personality Insights は IBM Cloud から提供されている IBM Watson API の1つで、テキストの内容を使用単語レベルで分析し、そのテキストを記述した人の性格や、その性格毎の購買傾向を取得する、という便利な API です。日本語を含む5ヶ国語に対応しています。詳しくはこちらも参照ください:
https://www.ibm.com/watson/jp-ja/developercloud/personality-insights.html


おおまかな処理の流れとしては、まず OAuth2 で Twitter にログインしてもらうことで、そのユーザーの権限で Twitter が操作できるよう認可します。そして Twitter API でユーザーのタイムライン内容を取得します。 この時に直近の 200 ツイートを取得します。この 200 件のツイートを投稿時刻の順に 40 件ずつ5つのブロックにわけます。そして各ブロック毎のツイート内容をそれぞれまとめて IBM Watson Personality Insights API を使って性格分析を行います(つまり1回の処理で Twitter のタイムライン取得 API を1回、IBM Watson Personality Insights API を5回実行します)。このようにすることでツイートの内容を時間で区切って直近のものから少しずつ時間を遡りながら5回ぶんの性格分析を行い、その結果を上述のようにスライダーバーで時間ごとに表示/非表示を切り替えることで実現しています。

機能的にはこれだけでもできるのですが、このサービスでは「分析結果をシェア」できるようにしました。シェアするためには(シェアされた人はツイートを取得せずに分析結果を見ることができる必要があるため)分析した結果をデータベースに格納する必要があるため、データベースも併用しています(あくまで分析結果を保存するためのもので、ツイート内容は保存していません)。

また上述のような仕様であるため、仮に Twitter 上で非公開アカウントとしているアカウントに対しても(本人の権限でツイートを取得することになるので)性格分析を行ったり、その結果をシェアすることができます(公開許可されていない人や、そもそも Twitter アカウントを持っていない人でも分析結果を見ることができます)。ただしあくまで分析結果だけがシェアされるのであって、ツイート内容がシェアされるわけではない点はご安心を。


このデモサービスでは Twitter のツイートを元に性格分析を行っていますが、必ずしも分析元はツイートである必要はありません。1人の人が書いた文章であればよいので、メールなり、社内掲示板なりからテキストを取得することができるのであれば理論上は可能です。ただし1回の性格分析におけるテキストの単語数が少ないと充分な精度がでない結果となることも考えられます。ある程度の単語数が含まれるテキストを取得できる必要があります(このサービスでは上述のように 40 ツイートぶんのテキスト内容をひとまとめにして分析しています)。

また IBM Watson Personality Insights API の特徴でもあるのですが、単にテキスト内容とその単語傾向から性格を分析するだけでなく、購買行動への傾向と合わせた実行結果を得ることができます。つまりまだ何も買っていないユーザーに対してでも、その購買傾向を調べた上でレコメンドを出したり、特定興味分野の広告を出したりする、といった使い方にも応用ができるもので、特に今回のデモではその時間変化にも着目できるようにしています。応用の幅が非常に大きな API であると考えていて、その一部が伝わればいいと思っています。

 

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


このページのトップヘ