ももいろクローバーZ リーダー百田夏菜子さんにとって「笑顔」とは何かを尋ねてみた

# 始めに
まだまだビギナーですのでコードがパスタ、冗長になってしまっているかもしれませんがどうかご容赦を。笑

また目的は「実装し、結果を出力すること」としますので所々の細かい技術の説明やパラメータの調整などは行いません。

なお、結果だけをサクッと見たい方はコードの部分はサーっと流して頂いて構いません！

# 動機
最近学んだWord2vecを使って面白いことができないかなと思った。
そこで自身がモノノフ(ももいろクローバーZのファンの総称)のこともあり、ももいろクローバーZのリーダーである百田夏菜子さんにももクロの一つの大きなテーマである「笑顔の天下を取る」とはどういった意味なのかを問いたいなと考えた。

そしてその為には「百田夏菜子」が考える「笑顔」とはいったいなんなのかについて考察しようと思った次第である。

(「笑顔の天下」については [こちら](https://natalie.mu/music/news/112182 ))

# コーパス作成
では早速　「いきなり百田さんに押しかけてインタビューをしよう！！」

.....というわけには行かないので、今回は百田夏菜子さんが自分の言葉で長年綴ってきているアメブロ(現在ではほとんど更新はされていな..ry)を用います。

こちらの約960記事をコーパスとして百田夏菜子さんが「笑顔」という単語をどのような単語と似たように使っているのかということを調べようと思います。

# Word2vec
そして今回は「Word2vec」を用いてある単語と似たような使われ方をしている単語を抽出しようと思います。

簡単に「Word2vec」について説明をしておくと
「文章中の単語の位置を見てその単語と周辺単語の位置関係を類似計算に用いよう」という手法です。

なので今回の場合は
文章中における「笑顔」と同じような使われ方(位置)の単語を探そうということです。

詳しく知りたい方は [こちら](https://qiita.com/Hironsan/items/11b388575a058dc8a46a)

# 実装
「Word2vec」を使うにあたってモデルを生成しないといけないので、そちらのコードを書いていきます。

スクレイピングのコードを書くとより冗長になってしまうので、今回はアメブロの記事を既にGoogle SpreadSheet へと保存してある段階から始めたいと思います。

まずは使うデータのインポートです。

```
# 必要なモジュールのインポート
import pickle
import os.path
from googleapiclient.discovery import build


# 今回はアメブロデータをスプレッドシートに格納しているのでそこからデータをインポートする
# スプレッドシート取得のための情報を指定する
SCOPES = [SHEET SCOPES]
SAMPLE_SPREADSHEET_ID = "INPUT ID"
SAMPLE_RANGE_NAME = 'INPUT RANGE'

if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

service = build('sheets', 'v4', credentials=creds)

# Sheets API　を呼び出す
sheet = service.spreadsheets()
result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,
                            range=SAMPLE_RANGE_NAME).execute()
values = result.get('values', [])

# ブログデータをリストに格納する
brog_list =[]
for i in values:
    for brog in i:
        brog_list.append(brog)

```

これでデータの準備が整いましたので、「Word2vec」のモデルを生成していこうと思います。

以下が「Word2vec」の生成コードです。

```
# 必要なモジュールのインポート
import MeCab
import re
import io
from gensim.models import word2vec

# stop wordの指定
# ブログ中に存在したノイズである単語を目視で発見できたものを指定
stopword_list = ["\u3000",'―','\n','、',"・","）","（","(",")","」","「","*","[","]","ため", "こと", "一つ", "よう", "うち",
                 "うえ", "たち", "これら", "それ", "今後", "もの", "以下", "未満",
                 "その他", "ほか", "すべて", "課題", "これ", "まま", "いずれ", "はるか", "アジェンダ", "多く", "半分", "以外",
                 "件数", "限り", "改善", "つき", "達成", "目標", "以来", "全体", "一部", "近く", "当たり", "今日","昨日",
                 "明日","ーーー","クロ","ぁ","中","今回","前","ω","みたい","方","の","さ","なん"]

# MeCabのインスタンス生成
m = MeCab.Tagger("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")

# モデルに入れるためのデータ整形
# これはWord2vecのモデル生成のためにはデータを決まった形に変換しないとならないため
words_per_titles_list = []
for i in range(len(brog_list)):
    res = m.parse(brog_list[i])
    res_list = res.split('\n')
    res_list = res_list[0:-2]
    pre_list = []
    for word in res_list:
        l = re.split('\t|,',word)
        if l[0] not in stopword_list and l[1] == "名詞":
            pre_list.append(l[0])
        else:
            continue
    words_per_titles_list.append(pre_list)

title_text = ""
for i in range(len(words_per_titles_list)):
    for q in range(len(words_per_titles_list[i])):
        if q +1 == len(words_per_titles_list[i]):
            title_text += words_per_titles_list[i][q]
        else:
            title_text += words_per_titles_list[i][q] + "　"
    title_text += "\n"

io_titles_text = io.StringIO(title_text)

# モデル生成
# パラメータに関しては参考リンク先へ
sentences = word2vec.LineSentence(io_titles_text)
model = word2vec.Word2Vec(sentences,
                          sg=1,         #0: CBOW, 1: skip-gram
                          size=30,     # ベクトルの次元数
                          window=5,    # 入力単語から左右何単語を取るか
                          min_count=5,  # 考慮する単語の最低出現回数
                          )
```
パラメータに関しては [gensimの公式サイト](https://radimrehurek.com/gensim/models/word2vec.html)なんかを読んでいただければ、と思います。(ここが本当はかなり重要。)

# モデルの保存
また生成したモデルというのは保存して、後でロードしてまた使うことができます。

```
# モデルの保存
model.save("FILENAME.model")

# モデルのロード
model = word2vec.Word2Vec.load("FILENAME.model")
```


# 結果の確認
ここまででモデルの生成は完了しているので、あとはモデルを元に結果を確認する段階です。
コードはこちらです。

```
results = model.wv.most_similar(positive=["笑顔"],topn=20)
for result in results:
    print(result)
```
するとこのような結果が返ってきました...！
<img width="271" alt="スクリーンショット 2019-02-25 11.26.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/365852/408ecd51-b7eb-2250-69f9-7a5e798cb328.png">

誠に勝手ながら解釈をさせて頂きますと

百田夏菜子さんが考える「笑顔」とは
**『ライブ中にお客さんをステージから見ている光景やお客さんの声。そして幸せな心や感謝の気持ちのこと』**

漠然としていますが
モノノフのことを大事に思い、ポジティブさが溢れているのは言うまでもない気がします。

なんとなく百田さんの宣言した「笑顔の天下」の意味が少しでもわかったような気がしないでもないような...

いちモノノフとしてはとてもとても、ももクロらしい類似語が出てきたかなと思っております。

# まとめ
今回は「Word2vec」を用いて百田夏菜子さんの考える「笑顔」について調べてみました。
パラメータをほぼいじっていないのでスコアがかなり固まってしまっているのは問題であったかもしれませんね汗

しかし、単純な単語の位置のみを見てここまで納得のいく結果になるのかと感心しました。
まして前処理もパラメータ調整もほとんど行なっていないのに...
さすがニューラルネットですね。

今度時間があればもっとコーパスを大規模にして再挑戦、ないしは別のことに挑戦したいなと思っています。

それではまた！



## 参考
「Word2vec」に関してはこちらのサイトたち
http://www.randpy.tokyo/entry/python_word2vec
https://qiita.com/kenta1984/items/93b64768494f971edf86

SpreadSheetの読み込みに関してはこちらのサイト
https://www.kumilog.net/entry/2018/03/22/090000

大変参考になりました。
ありがとうございました！