Watsonでプリパラアイドル分類器を試してみた


最終的にやりたいこと

とあるWebサイトのシステム責任者的なことをやっており、
同じような質問されがちな立ち位置のため、
一度質問されたこと回答をWatsonに覚えさせて自分の代わりに回答してくれるBotをチャットツールに組み込ませたい。

今回やったこと

Watsonの自然言語分類(NLC)を立ち上げて、どの程度分類がうまく行われるかを調べる。
NLCについては公式ドキュメントを参照。
http://www.ibm.com/smarterplanet/jp/ja/ibmwatson/developercloud/nl-classifier.html
Watson立ち上げまではこちらが分かりやすかったです。
http://qiita.com/tinaba/items/fe8030405265f19ab441
立ち上げたWatsonにデータを学習させる方法はこの記事と公式ドキュメントを突き合わせました。
https://www.cresco.co.jp/blog/entry/193/
https://www.ibm.com/watson/developercloud/natural-language-classifier/api/v1/

学習させたデータ

上記参照した記事では犬の情報を入れていましたが、
僕はプリパラの情報を入れてみました。みれぃちゃんかわいい。

プリパラに関する詳しい情報はWikipediaからもらってきました。
下記のようなCSVファイルを作りました。
下記はみれぃに関するものだけですが、12人分の情報をこのテンプレートでCSVファイルにしました。

"誕生日 - 10月1日(法の日、メガネの日)","南みれぃ"
"血液型 - A型","南みれぃ"
"好きな食べ物 - スイーツ全般","南みれぃ"
"使用ブランド - Candy Alamode(キャンディアラモード)","南みれぃ"
"チャーム - ポップ","南みれぃ"
"私立パプリカ学園中等部1年A組(1stシーズン)→2年A組(2nd&3rdシーズン)。学園の風紀委員長であり、2ndシーズンでは生徒会長も兼任している。普段は茶色の髪をポニーテールにし同色の瞳に眼鏡をかけているが、プリパラ内では猫耳のようなシニヨンの金髪と青い瞳となり眼鏡も外し、容姿が大きく変化する。一人称は「私」だがプリパラ内では「みれぃ」が加わる。彼女にとっての友達は「気持ちいいもの」。口癖は「計算どおり」。プリパラ内ではキャラづくりのため、声色が変わり語尾に「ぷり」をつけて話す(稀に「ぷり」が付かないこともあり、落ち込んだ時は全く付けていなかった)。キャッチフレーズは「ポップ、ステップ、げっちゅー」。元々は正体が解りにくいようにし、かつ発覚した時のギャップを売りにする目的でプリパラ内のキャラを造り上げていた。このため第2話のラストでらぁらと共にプリパラから出るまで、お互いに正体に気付かなかった。風紀委員の仕事ではよく違反チケットを(特に違反の多いらぁらに対して)切っている。ファルルに負けたことで調子が出なくなってライブをする気を無くした時は、八つ当たりに近いぐらいいつも以上に違反チケットを切りまくったことがある。第77話では、花丸チケットも登場した。計算にこだわる性格で、自分の考えを説明するときには、細かい数字を持ちだす癖がある。らぁらと出会う前は上記の規則に厳しく細かいことにこだわる性格が災いし、パートナーをみつけられずにいた。あえて自分のファイルバッグを落とし、プリパラタウンに訪れたらぁらをデュエットライブのパートナーに選び2人でアイドルグループを組むことになる。それ以降は先輩としてらぁらを鍛える一方で、柔軟さもみせるようになった。プリパラには小学部の6年生頃から出入りしており、「プリチケ」を校長に見つからないように3重の袋に入れたり、家では備長炭の下に隠しスプレーを撒いて匂いをシャットアウトしていた。現在でもプリチケは3重の袋に入れて持ち歩いている。らぁらに対しては「プリパラを嫌っている小学部の校長からも認められるアイドルになるよう」叱咤激励する一方、小学部の校長に対してはプリパラ禁止を撤回するよう直談判を試みたこともあり、ばれた際も真相を話して欲しいと言うなど思いは強い。","南みれぃ"

1列目は情報で、2列目は分類するタグになります。
学習させるデータについての詳細なドキュメントは下記を参照してください。
https://www.ibm.com/watson/developercloud/doc/nl-classifier/data_format.shtml

ドキュメントにもありますが、このような学習データはあまり良くないです・・・
よく読まないで作ってしまいました。

質問してみる

作成したCSVファイルのトレーニングが終わったところで、質問してみます。
質問のためのcurlは下記を使います。

curl -X POST -u "{username}":"{password}" -H "Content-Tpe:application/json" -d "{\"text\":\"声優が芹澤優の人は?\"}" "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/{classifier_id}/classify"

いちいちcurlをコピペしてtext部分を変えるのもめんどくさいので、
僕はshファイルを作って試しました。

南みれぃの声優といえば、芹澤優さんです。
聞いてみましょう。

{
  "classifier_id" : "",
  "url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/{classifier_id}",
  "text" : "声優が芹澤優の人は?",
  "top_class" : "南みれぃ",
  "classes" : [ {
    "class_name" : "南みれぃ",
    "confidence" : 0.9082277249289518
  }, {
    "class_name" : "緑風ふわり",
    "confidence" : 0.01445666558403286
  },
  略
  {
    "class_name" : "ファルル",
    "confidence" : 0.005810040243133133
  } ]

正しく分類されて、みれぃが一番高い値になっていますね!

続いて別の質問。
南みれぃが使用するブランドはCandy Alamodeです。
これも聞いてみます。

{
  "classifier_id" : "",
  "url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/ff1c2bx159-nlc-1293",
  "text" : "Candy Alamodeを使用するアイドルは?",
  "top_class" : "南みれぃ",
  "classes" : [ {
    "class_name" : "南みれぃ",
    "confidence" : 0.2726114186643586
  }, {
    "class_name" : "白玉みかん",
    "confidence" : 0.26353869109851275
  }, 
  略
  {
    "class_name" : "緑風ふわり",
    "confidence" : 0.020023611443465227
  } ]
}

今回も正しいけど、Candy Alamodeを使用しない白玉みかんがやたらと高いのが気になります。
また、みれぃが一番高いだけで信頼性はあまり高くなく0.27となっています。

最後に聞いてみます。
南みれぃは学園内で風紀委員長をやっています。
それも聞いてみます。

{
  "classifier_id" : "",
  "url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/{classifier_id}",
  "text" : "風紀委員長をしているアイドルは?",
  "top_class" : "白玉みかん",
  "classes" : [ {
    "class_name" : "白玉みかん",
    "confidence" : 0.32186659136925205
  }, {
    "class_name" : "北条そふぃ",
    "confidence" : 0.11864049026468149
  }, {
  略
  }, {
    "class_name" : "南みれぃ",
    "confidence" : 0.07195552988590602
  }, {
  略
  }, {
    "class_name" : "紫京院ひびき",
    "confidence" : 0.03396949083692452
  } ]
}

白玉みかんは特に風紀とは関係がないアイドルです。
全然合ってない・・・
信頼性も0.3なので、提案としては使えるかもくらいですかね。
上記結果は略していますが、当のみれぃは6番目と真ん中になっており、
信頼性も0.1を切っているので、基本的には信頼せずに無視するべきくらい小さい値でしょう。
白玉みかん推しなのか、この分類器は・・・

学習データを改善してみた

学習させるデータで良い学習をさせるには、
下記ドキュメントにもありました。

Limit the length of input text to fewer than 60 words.

Qiitaに日本語訳が上がってました

60 words!!😇

学習させたデータが良くなかったですね。
声優とブランドはちゃんと分類できて、風紀委員長について分類できないのも納得です。
詳細な部分をそのまま学習させてしまったので、もう少し細切りにして再度学習させます。

"私立パプリカ学園中等部1年A組(1stシーズン)→2年A組(2nd&3rdシーズン)。","南みれぃ"
"学園の風紀委員長であり、2ndシーズンでは生徒会長も兼任している。","南みれぃ"
"普段は茶色の髪をポニーテールにし同色の瞳に眼鏡をかけているが、プリパラ内では猫耳のようなシニヨンの金髪と青い瞳となり眼鏡も外し、容姿が大きく変化する。","南みれぃ"
"一人称は「私」だがプリパラ内では「みれぃ」が加わる。","南みれぃ"
"彼女にとっての友達は「気持ちいいもの」。","南みれぃ"
"口癖は「計算どおり」。","南みれぃ"
"プリパラ内ではキャラづくりのため、声色が変わり語尾に「ぷり」をつけて話す(稀に「ぷり」が付かないこともあり、落ち込んだ時は全く付けていなかった)。","南みれぃ"
"キャッチフレーズは「ポップ、ステップ、げっちゅー」。","南みれぃ"

Wikipediaから持ってきた情報をすべて句点毎に1つのレコードとして取り扱うように変更しました。
60文字より長いのもありますが、とりあえず良しとしましょう。
CSVファイル作るのがかなりめんどくさい

改善した学習データで同じ質問をしてみる

{
  "classifier_id" : "",
  "url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/classifiers_id",
  "text" : "芹澤優が声優のアイドルは?",
  "top_class" : "南みれぃ",
  "classes" : [ {
    "class_name" : "南みれぃ",
    "confidence" : 0.5122273839156459
  }, {
    "class_name" : "真中らぁら",
    "confidence" : 0.20810453449374428
  }, {
  略
  }, {
    "class_name" : "レオナ・ウェスト",
    "confidence" : 0.015495776367758863
  } ]
}

合ってますね。
ただ信頼性がさっきは0.9だったのが、
0.5まで下がっているのがちょっと謎ですが、2番目のらぁらの信頼性が0.2とかなり離れているため、
一番回答に近いという意味ではそれなりに信頼に足る値のようです。
(仮設としては[芹澤優]という人名が正しく認識されず、
「優しい」とかも信頼性の値に入れているのではと考えています)

{
  "classifier_id" : "",
  "url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/classifiers_id",
  "text" : "Candy Alamodeを使用するアイドルは?",
  "top_class" : "南みれぃ",
  "classes" : [ {
    "class_name" : "南みれぃ",
    "confidence" : 0.662697394021673
  }, {
    "class_name" : "ドロシー・ウェスト",
    "confidence" : 0.0661195663635426
  }, {
  略
  }, {
    "class_name" : "ファルル",
    "confidence" : 0.017676163636549964
  } ]
}

こちらもOK。
信頼性もさっきは0.27と低めだったのが、0.66まで改善され、
他のアイドルよりも高い信頼性になっています。

{
  "classifier_id" : "",
  "url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/classifiers_id",
  "text" : "風紀委員長をしているアイドルは?",
  "top_class" : "南みれぃ",
  "classes" : [ {
    "class_name" : "南みれぃ",
    "confidence" : 0.9737507772444404
  }, {
    "class_name" : "ドロシー・ウェスト",
    "confidence" : 0.004667934379417605
  }, {
  略
  }, {
    "class_name" : "黒須あろま",
    "confidence" : 0.0017797457068187176
  } ]
}

ぱ〜ふぇくとな回答ですね!
信頼性も0.97と抜群に高い数値になりました。

追加で質問。

{
  "classifier_id" : "",
  "url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/classifiers_id",
  "text" : "語尾がぷりのアイドルは?",
  "top_class" : "南みれぃ",
  "classes" : [ {
    "class_name" : "南みれぃ",
    "confidence" : 0.8005268107696502
  }, {
    "class_name" : "真中らぁら",
    "confidence" : 0.07533461073695183
  }, {
  略
  }, {
    "class_name" : "東堂シオン",
    "confidence" : 0.007040749504713798
  } ]
}

けっこう君くわしいね〜。
他にも何点か質問してみましたが、日本語として正しい質問のほうが正確な質問を返しやすいようです。
プリパラ独自の単語が入ると少し怪しい回答になるっぽいです。

やってみた感想

curlで質問が投げられるので、Slackと連携はかんたんにできそうです。
戻りもjsonなので、top_classによって切り分け、
confidenceによってどれくらい自信があるかの文章を生成して、返答するようにすれおもしろそうです。
confidenceは絶対評価ではなく、
2番目とどれくらい信頼性が離れているかを考慮すれば
1番目が多少低くとも2番目以降が信頼性低ければ信頼性が相対的に高いと考えることもできそうです。

今回学習させたデータは僕の趣味ですが、
[誰かあての質問,回答]という単純なCSVファイルを貯めておいて、
週に1回位データ更新を行えば、代わりに回答してくれるBot作成もできそうです。
今回はcurlで質問をしているだけですが、Slack連携を試してみたいと思います。