機械学習でホロライブメンバーの陰と陽分類を検証してみた

## 概要

先に最終結果を見せたいと思います。代表キャラは学習器の訓練の際に選定したメンバーになっておりまして、陽キャラは赤枠、陰キャラは青枠で囲っています(それ以外のメンバーは全て独立データとして検証しています)。実際に行なったこととしては、「**各ホロライブメンバーが陰キャラか陽キャラかどうかを分類しました**」。詳しくは以降の章を参考にして頂ければと思います。

![結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/a9ff5ff8-0eb5-945d-7c5d-00d751d912a6.png)

## 解析を初めたきっかけ
### あなたは陰キャ？それとも陽キャ？

GWの時にyoutubeのホロライブの切り抜きをみていたら面白そうなものが見つかった。
[深夜に突然始まるホロライブメンバー陰と陽分類ダイジェスト](https://www.youtube.com/watch?v=MtbtO9clTVk)

元動画はこちら）
[【#ホロ深夜女子会】♡GWのダベり晩酌雑談女子会♡【桐生ココ/さくらみこ/天音かなた/癒月ちょこ】](https://www.youtube.com/watch?v=HytCW6Yi8IM)

![9a82f8e7-s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/85ea032d-bb10-f042-c6f1-9f80085d3732.jpeg)

ホロライブの深夜女子会で検証されたものらしく、上記のような形でホロライブメンバーの陰キャラと陽キャラが分類されていました。このとき、ふと考えてしまった。

#### この結果、機械学習を使ってうまく再現できないものか...

ということで、実際に**ホロライブメンバーの陰キャラと陽キャラ分類を検証してみました**。

## 使用データ
**使用するデータは、メンバーたちのツイッターのテキストデータです**。ツイートのテキストデータの取得は、Tweepyを使って取得しています。実際に配信で行われた分類結果に基づいて、以下のような形で陰キャラ代表と陽キャラ代表を選定してツイートデータを集めました。**今回は、配信での陰と陽分類結果にて示された結果を大前提として進めます**。

- **陰キャラ代表...兎田ペコラ、さくらみこ、天音かなた、湊あくあ、戌神ころね**
- **陽キャラ代表...癒月ちょこ、大空スバル、角巻わため、ときのそら、白上フブキ、AZKi、大神ミオ、友人A**

それぞれのメンバーのツイートデータを最新順に8000件ずつ集めました(それに満たない場合は上限一杯取得します)。また、ツイートデータのうち、RTやreplyに関するデータは取得させないようにしました。なので、**取得しているのは本人たちのツイートのみ**になります。

また、ディレクトリ構造は以下の形でGoogle Colab上で構築して実行しています。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/0af9f0e6-4800-71e1-71e9-4860daa10abb.png)

## 解析手法

### 前処理
さすがアイドルと言いますか、女性といいますか...**ツイートデータには顔文字や絵文字、URLが大量に入ってました**(データを見たときに悲鳴を上げました)。なので、前処理で出来る限り排除してからmecabで分かち書きを行っています(残念ながら、一部残りました汗)。また、**訓練データとテストデータは8:2の割合でランダムに分割しました**。

### 仕様した解析手法
解析手法はLSTMを使って解析を行いました。PyTorchで実装していて、並列GPUおよびバッチ対応しています。

mecabで分かち書きされた単語の語彙数は、全部で17462個ありました。検証データに対してこの語彙の中に含まれない単語が文章中に含まれている場合は、エラーが起きます。

### 訓練結果

エポック数100で訓練を行なった結果、予測精度はテストデータで76%でした。ツイッターのデータ量にしてはかなり高いという印象です。

エポックあたりのロスの結果は以下のようになりました。

![スクリーンショット 2020-05-12 17.02.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/d83cfd0f-b19d-0d01-9908-4d1cd8fa0aa7.png)


## 独立データで検証

#### 他のメンバーは陰キャラ？陽キャラ？

![スクリーンショット 2020-05-04 21.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/67018849-2451-9634-7f8d-68b116d78507.png)

先ほどは、配信上で明らかに陽キャラや陰キャラの代表を設定して訓練を行いました。次に、代表として設定したメンバー以外のホロライブメンバーのツイートデータを独立データとして陰キャラか陽キャラか分類します。各メンバーのツイートデータを同様の方法で8000件取得して解析してみるとどうなるのか検証しました。

実際の陰キャラと陽キャラの分類基準ですが、**各メンバーのツイートデータを改行ごとに文章として切り分けて、各文章に対して陰キャラっぽい発言か陽キャラっぽい発言か訓練した学習器を用いて分類します**。そして、各メンバーの全ての文章データに対して分類を行い、どのくらい発言が陽キャラか陰キャラなのかを分類するための指標として以下を算出しています。

#### 分類指標 = (陽キャラ発言回数)/(陽キャラ発言回数＋陰キャラ発言回数)

ただし、学習器で分類結果が返って来なかった文章、つまり訓練時に学習されなかった単語に関しては結果が返って来ないようになっています(一応、どのメンバーも半分以上の文章データに対して分類結果が返ってきています)

### 最終結果

独立データで検証した結果としては、以下のようになりました。

![結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/a9ff5ff8-0eb5-945d-7c5d-00d751d912a6.png)

以下が実際の各メンバーごとの評価指標などの結果です。陽キャラか陰キャラかの出力は、指標の値が0.5より大きいかそれ未満かで判断させています。

```
#------------------------------
# 出力結果の例
# hogehogeは○キャです
# (分類指標の値) (学習器で分類結果が返ってきた文章の総数) (陽キャラ発言回数) (改行ごとに抽出した文章データの総数)
#------------------------------

ときのそらは陽キャです
0.7045305318450427 3046 2146 4870
----------------------------
星街すいせいは陰キャです
0.4129251700680272 2940 1214 4634
----------------------------
夜空メルは陽キャです
0.5901213171577123 1154 681 1844
----------------------------
白上フブキは陽キャです
0.5638173302107728 1708 963 3570
----------------------------
夏色まつりは陽キャです
0.5016304347826087 1840 923 2562
----------------------------
姫森ルーナは陰キャです
0.36826524570751923 1689 622 2306
----------------------------
白銀ノエルは陰キャです
0.42934293429342935 3333 1431 4976
----------------------------
アキロゼは陰キャです
0.470281124497992 2490 1171 4158
----------------------------
AZKは陽キャです
0.862909090909091 2750 2373 2821
----------------------------
不知火フレアは陽キャです
0.5693251533742332 1630 928 2525
----------------------------
ロボ子さんは陽キャです
0.5026868588177821 2047 1029 3153
----------------------------
猫又おかゆは陰キャです
0.41079199303742386 2298 944 3219
----------------------------
桐生ココは陽キャです
0.5164619164619164 2035 1051 2676
----------------------------
常闇トワは陰キャです
0.41897720271102895 1623 680 2307
----------------------------
赤井はあとは陽キャです
0.542777970211292 2887 1567 4144
----------------------------
紫咲シオンは陰キャです
0.3823224468636599 3858 1475 4662
----------------------------
百鬼あやめは陽キャです
0.6027054108216433 1996 1203 2961
----------------------------
宝鐘マリンは陰キャです
0.40594059405940597 1515 615 2230
----------------------------
潤羽るしあは陰キャです
0.4146341463414634 861 357 1421
----------------------------
```

今回は、ホロライブメンバーのツイートデータを使って陰キャラと陽キャラの分類を行ないました。半分くらいは配信の結果と類似した形になったと思うのですが、7,8名は異なるキャラとして分類されてしまいました。その原因や推測としては、以下のようなことが考えられました。
・**陰キャラ陽キャラというよりも、コラボ率や仲の良さなどが影響しているかもしれない**(例えば3期生とか。個人的にマリン船長は陽キャラだと思う)
・**新しく入ったメンバーほどツイートの量がまだ少ない**(特に4期生のツイートの総量はRTなどを含めても2000~3000しかないので、他メンバーと比べてデータ量による影響が大きい)
・**陽と陰キャラの影響もあるけど、他の交絡変数がいくつかある可能性が高い**(オタク要素や配信しているゲームのジャンル、活動時間など)
・**陰キャラ代表の陰キャラ発言率がそもそも高い...？**(ノーコメントで汗)


また、今後の効果検証として行うべき項目としては、
・**例えば、新たに「オタク・非オタク」などのラベルを取り入れる**
・**ツイッターだけではなくハッシュタグからリスナーのツイートデータを取得したり、youtube上でのリスナーのチャットも訓練データとして取り入れる**
・**メンバーのツイート数がもう少し増えてから改めて行ってみる**
・性能評価をちゃんと...やる(怠い)
などが考えられました。

#まとめ
今回は、ホロライブメンバーが配信中に実際に行ってみたメンバーの陰と陽分類結果を参考にして、メンバーのツイートデータを元に分類結果の検証を行いました。

前回のネタ解析では声優のネットワークの可視化を行いましたが、今後もいろんなネタ解析を提供したいと思っているのでよろしくお願い致します。

前回のネタ解析はこちら：
[(word2vecとnetworkxを使った)声優ネットワーク分析(1/2)](https://qiita.com/bamboo-nova/items/4df7abf337f7ca8b7aff)
[(word2vecとnetworkxを使った)声優ネットワーク分析(2/2)](https://qiita.com/bamboo-nova/items/ff26593380147ba48ee9)