SPAJAM2017で優秀賞を獲ったはなし(バックエンド)

team_risingsun

SPAJAM2017の本戦に出場し優秀賞をいただきました!チームのみなさんお疲れ様でしたandありがとうございました!

(注:筋肉チームとして認知されましたが、私(右下写真の右から2番目)は筋肉ではありません)

SPAJAMは、与えられたテーマに沿ったスマートフォンアプリを一日で作りきる大会です。詳しくはウェブで(http://spajam.jp/)。今回の本戦会場は箱根にあるコロニー箱根でしたhttps://be-ars.colopl.co.jp/recruit/summary/hakone/。素晴らしい会場と食事で、これだけでも行く価値はありました!ハッシュタグ#spajamで当日の様子を詳しく知ることができます。
IMG_0943
IMG_0932
IMG_09352

SPAJAM2017のテーマは勇気でした。そのテーマを元に、勇気を出してあだ名を付け合い、人と人との距離を縮めるアプリを作ることになりました。
アプリの方向性やデザイン・UIの話は別のメンバーが書いてくれるようですので、バックエンドで利用していたIBM Watsonの利用方法について書きます。

あだ名生成の実装

今回のアプリは個人の特徴をとらえたあだ名を生成する必要があります。そのため、個人の特徴を抽出するためにWatsonのPersonality insightsを利用しました。

IBM Watson (Personality insights)とは

IBM Watsonが提供しているサービスの中に人の性格推定をするPersonality Insightsがあります。これは、個人が書いた文章を渡すと、watsonがパーソナリティ理論(https://www.ibm.com/watson/developercloud/doc/personality-insights/science.html)を応用し、個人の個性、欲求、価値観を数値化してくれるサービスです。パーソナルな情報を取得できるのでレコメンドエンジンとして利用することもできると思います。2016年4月ごろから入力する文章として日本語を設定できるようになり、デモサイトhttps://personality-insights-livedemo.mybluemix.net/で簡単に試すことができます。

WatsonからのレスポンスはJSONで得られます。


{
"word_count": 8912,
"processed_language": "ja",
"personality": [
{
"trait_id": "big5_openness",
"name": "Openness",
"category": "personality",
"percentile": 0.8243266441683973,
"children": [
{ ... }
]
}
{
"trait_id": "big5_conscientiousness",
"name": "Conscientiousness",
"category": "personality",
"percentile": 0.6334149312604265,
"children": [
{ ... }
]
}
]
...
}

実装時間の関係上、今回は、Openness(知的好奇心)、Conscientiousness(誠実性)、Extraversion(外向性)、Agreeableness(協調性)、Emotional range(感情起伏)のpercentileを個人の特徴としました。それぞれの特徴は0~1の値であるため、三等分に分割しそれぞれのレンジに文字を割り当て、あだ名のパーツとし、それぞれをくっつけてあだ名とします。例として知的好奇心が0~0.3の時は「おじさん」、0.3~0.6では「一発屋」、0.6~1では「妖怪」といったように割り当てます。また、同じような特徴を持つ人同士であだ名がなるべく被らないように、知的好奇心が0~0.3の時に原始人で固定するのではなく、いくつかバリエーションを持たせランダムに選択します。

0 ~ 1/3 1/3 ~ 2/3 2/3 ~ 1
Openness おじさん、ホームレス、ヤンキー 一発屋、エンジニア、モンスター 妖怪、深海魚、大学生
Conscientiousness おしゃべりな、生命力が強い、退職時にバグを仕込みそうな いじりにくい、顔が怖い、ニヤケ顔な 苦笑いが得意な、押し売りをする、まっすぐな
Extraversion 後ろ向きな、腰抜けな、言い訳がちな 田舎の、筋肉主張の強い リズム感のある、やたらおしゃれな、活きのいい
Agreeableness 寿司ネタだけ泥棒、声が不安定、悲しきモンスター ステロイドばが、口元の汚さ、学歴アンパンマン ホスト上がりのエンジニア、2軍のボス、悪代官づら
Emotional range 病気のカラス、干し椎茸、地味 さば、たわし、陥没骨折 エセCTO、エヘン虫、被害者ヅラ

またあだ名のパーツをを組み合わせる方法を4パターン用意し、ランダムに選択します。
1. Conscientiousness + Openness
2. Extraversion + Openness
3. Agreeableness
4. Emotional range

あだ名を決定する流れ

個人の性格を次のように仮定します。

Openness 0.2
Conscientiousness 0.7
Extraversion 0.5
Agreeableness 0.2
Emotional range 0.8

まず、組み合わせパターンを決定します。ここでは1.が選ばれたとします。次に、Conscientiousnessは0.7なので「苦笑いが得意な、押し売りをする、まっすぐな」のどれかが選択されます。またOpennessが0.2なので「おじさん、ホームレス、ヤンキー」のどれかが選択されます。そしてそれぞれの単語をくっつけてあだ名とします。今回の例では、「苦笑いが得意なおじさん」、「苦笑いが得意なヤンキー」、「まっすぐなヤンキー」等となります。

できたらよかったこと

個人の特徴からあだ名のパーツを組み合わせるのですが、あだ名のパーツは手動で設定しています。改良する場合は、この箇所を自動でできれば良いかなと思います。また、時間の都合上実装できなかったのですが、twitterの文章から頻出単語を抜き出し、それをあだ名に組み込めれば、さらにそれっぽいあだ名になったのかなと思います。