かわみのメモ帳

趣味に関するメモを書いていきます。

ニューラルネットワークを用いたJK度診断器を作って公開していた話

おはようございます。かわみです。
2018年も4月を迎え、新年度がスタートしていますが、皆さんいかがお過ごしでしょうか。
4月といえば他にも、エイプリルフールという、個人並びに多種多様な企業が渾身の寒いネタを披露する日がありますね。
私も毎年何かしらの形で乗っかっているわけですが、今年も密かに(密かにするつもりはなかった)新しいWebサービスを公開していました。
任意のユーザの直近のツイートから"JK"度合いを診断し、パーセンテージで表示するといったWebサービスです。
しかしながらこのサービス、なんとぉ!エイプリルフールに便乗はしましたが、中身に一切の嘘はありません。ジョークツールではなくガチでした。
というわけで今回はその中身について解説していきます。ソースあります。

JK度とは?

想像してください、そもそも「JK度」とは何なのか。
おしゃれな写真を上げたり、絵文字を使ったり、マジ卍とか言ったりなど、各々がイメージとして持つJK像はあるでしょう。 ただしそれが実際に適用されるのでしょうか。
そこで実際のJKのツイートデータを使って、モデルの構築を目指すこととしました。

今回は、ツイッターのプロフィール欄に「JK3」などの「JK〇(〇には数字が入る)」の表記がされたアカウントをJKとみなしました。
正規表現では"JK[0-9]"と表記できますね。"JK[123]"のほうがより正確かもしれませんが4年目の方もいるかもしれません。
少し乱暴ですが、そのような方々のツイートを「JK度の高いツイート」とし、学習用データとしました。
ではどのようにツイートからJK度をパーセンテージの形で診断するのでしょうか。

JK度診断の手法概要

結論から述べると、ツイートを入力とした、ニューラルネットワークの回帰問題として扱いました。
教師あり機械学習には典型的な問題として「回帰」と「分類」が存在します。
ざっくり説明すると、「回帰」は数値などの具体的な値を求める問題です。たとえば過去の株価のデータから将来の株価を予測するタスクはこれに該当します。
対して「分類」は、その名の通りN種類に分類する問題です。たとえば、ある写真に写っているのが猫か犬か、あるいは何のモノなのかを当てる問題はこれに該当します。
JK度診断では最終的にパーセンテージを表示するので、具体的に値を求める回帰問題であったわけです。 ちなみに、最終的に5段階評価であったり、「かわいい系JK」「クール系JK」など複数の尺度において結果を表示するのならば分類問題になります。
なお、このJK度診断の手法自体は目新しいものではなく、私のChainerの練習ついでで作ったため、あまり新規性はありません。ご了承ください。

手法とデータ

以下のような構成のRNNで、JK度診断モデルを生成しました。

  • 単語埋め込み層(200次元)
  • 隠れ層(LSTM)(100次元、ドロップアウト確率0.2) ×3
  • 出力層(回帰なので1クラス)

ツイートの入力は、既存の辞書の範疇を超える表現の影響を避けるため、形態素分割せずに1文字ずつ入力します。 我々の知らないところで、JKならではの新語やスラングが使われているかもしれません。

正解ラベルはJKのツイートを1.0、それ以外のツイートを0.0とし、損失は二乗和誤差を求めることとしました。

先ほどチラッと書きましたが、実装にはChainerを用いました。 学習部分のソースコードgithubに上げておきましたのでご参考まで。(何の参考?)

github.com

なお今回、学習に使用したデータは、2017年11月~2017年12月までTwitter Streaming APIを使用して収集したツイートより、 プロフィール欄に"JK[0-9]"と記載のあるアカウントによるツイートとそうでないツイートを合計10万件抽出したものです。

実行例

「プロフィール欄から『JK3』とかって書いてあるアカウントのツイートを対象にするなんてどうなの?」と思う方もいると思いますが、何はともあれ診断例を見てみましょう。 実際ナイーヴな抽出手法だとは思います。

4月1日限定で公開した実際のWebサービスを使って診断してみます。ちなみにサーバー間の値の受け渡しはPHP実装であり、WSGIPythonのプログラムを走らせていたという裏側。
診断にはTwitterのstatuses/user_timelineAPIで取得した直近200件のツイートを用います。したがって診断日時によって結果も大きく変わることでしょう。あくまでも2018年4月30日時点での結果です。

さて、リアルJKっぽい人のアカウントで試すのが適しているのでしょうが、晒し上げになりかねないので有名人のアカウントで試させていただきます。有名人の皆さんご容赦ください。

まずは@0220nicoleさん。これは期待できます。

twitter.com

f:id:kawamix:20180430162808p:plain

50%を超えればJKとして認定することにしていますが、惜しいです。

ちなみにトップ3のツイートがこちら。

f:id:kawamix:20180430162914p:plain

どのツイートもキラキラしています。

続いては、@Suzu_Mgさん。この方も今をときめいており、期待できます。

twitter.com

f:id:kawamix:20180430163600p:plain

なんとこの方も惜しい結果に。なかなかリアルJK認定への壁は険しいようです。

ちなみにトップ3のツイートはこちら。

f:id:kawamix:20180430163653p:plain

なんというか、やっぱりツイートに全然灰汁がありません。

そろそろリアルJK認定が出てほしいところです。続いては、現在朝ドラにも出演されている@mei_nagano0924さん。

twitter.com

f:id:kawamix:20180430170247p:plain

リアルJK認定が出ました。やはり若くてキラキラしている方ほど値が高くなるのですかね。

ちなみにトップ3のツイートがこちら。

f:id:kawamix:20180430170320p:plain

若さが溢れまくっています。まぶしい。

ツイッターアカウントを持っている旬の若手女優の名前も浮かばなくなってきたので、ここからはバーチャルなアカウントの診断例をご覧ください。

まずは@sayodayooooさん。現役女子中学生として10年以上活動を続けていらっしゃいますが、ホンモノなのでしょうか。

twitter.com

f:id:kawamix:20180430172239p:plain

やっぱりニセモノじゃないですか!バレてますよ。
これがニューラルネットワークの力です。

続いて、@MitoTsukinoさん。この方も女子高生を名乗っているそうですが、果たしてホンモノなのでしょうか。

twitter.com

f:id:kawamix:20180430172835p:plain

JKのフリはやめてください!!私には分かるんです。

最後に、@MiraiAkari_prjさんのJK度を見ていきまーしょう!

twitter.com

f:id:kawamix:20180430173441p:plain

さすがコミュ力の塊系VTuberといったところですかね(?)。しっかりと数字にも反映されています。

おわりに

というわけで、4月1日に公開していたJK度診断について紹介しました。
データの取得やモデルの学習に用いた、TwitterのStreaming APIやChainerは無料で使えますので、みなさんも是非JKや他の切り口で診断を作ってみてはいかがでしょうか。
ただしTwitterのStreaming APIは廃止の方針のようなので、データの取得は早目のほうが良いかもしれません。
→ statuses / sample APIは廃止されないようです。
今回はJKをテーマにお送りしましたが、他のテーマにも様々に応用できそうです。他のレシピを考えて皆さんも実践してみてください。