さて

先日のM-1グランプリみなさん見ましたか?

自分は「かまいたち」を優勝予想したのですが
見事に外れました!!!!

見事王者に輝いたのは
初出場の精鋭

ミルクボーイ

このネタが優秀すぎたので
判別モデルを作ってみました。

解説動画はこちら




まずはデータです。

ミルクボーイのネタをみて文字起こし!!
データ化します。

かどうか説明文
コーンフレーク甘くてカリカリしてて牛乳とかかけて食べるやつ
違う死ぬ前の最後のご飯もそれでいい
コーンフレークまだ寿命に余裕があるから食べてられんねん
コーンフレーク最期のごはんに任命されたら荷が重いよ
コーンフレークなんであんなに、栄養バランスの五角形が広いんかわからん
コーンフレークパッケージに書いてる五角形めちゃくちゃでかいんやから
コーンフレーク自分の得意な項目だけで勝負してる
コーンフレーク牛乳の栄養素を含んだうえでの五角形
違う晩御飯ででてきても全然いい
コーンフレーク晩飯で出てきたらちゃぶ台ひっくり返す
コーンフレークまだ朝の寝ぼけてるときやから食べてられる
コーンフレーク食べてるうちにだんだん目が覚めてくるから、最後にちょっとだけ残してまう
コーンフレーク子どもの頃、なぜかみんな憧れたらしい
コーンフレークミロとフルーチェは憧れた
コーンフレークトランシーバーも憧れました
違うお坊さんが修行も時に食べてる
違う精進料理にカタカナのメニューなんかでえへん
コーンフレーク朝から楽して腹を満たしたいという煩悩の塊
コーンフレークあれみんな煩悩に牛乳かけてる
コーンフレークパフェとかの傘増しに使われているらしい
コーンフレークあれは法律スレスレぐらいはいっとる
違うジャンルでいうなら中華
違う中華だけではない
コーンフレーク回るテーブルの上においたら回したとき全部飛び散る
コーンフレーク食べてるときに誰に感謝したらええかわからん
コーンフレークコーンフレークは生産者さんの顔がうかばへん
コーンフレーク浮かんでくるのは腕組んでるトラの顔だけ
コーンフレーク赤いスカーフのトラの顔だけ
違うおかんがではないと言えばちゃう
こいつをそのままコピーしてcsvファイル化してもらえば
できると思います。


できたらモデル作りに入ります。

まずはライブラリのインポート
import codecs
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix

import warnings
warnings.simplefilter('ignore')
from janome.tokenizer import Tokenizer
t = Tokenizer()

お次は
データの読み込みです。
df = pd.read_table('corn_model_data.csv')
df.head()
mb1



データが読めたら次は
辞書を作ります。

このモデルは形態素解析を用いて
文章を単語化し、その単語をモデル用に使います。

単語辞書を先に作ります。
word_dict = {}
for i,v in df.iterrows():
    for token in t.tokenize(v[1]):
        h = token.part_of_speech.split(',')[0]
        if any([h=='名詞',h=='動詞',h=='形容詞']):
            key = token.surface
            word_dict[key]=0

さて用意ができたら
学習データの作成に入ります。
df['y'] = df['かどうか'].replace({'コーンフレーク':1,'違う':0})

目的変数は0,1でないといけないので
コーンフレークを1,違えば0にして設定します。

次に元のデータの文章を形態素解析して
単語が有れば1,なければ0と言うデータフレームを作り
元のデータフレームに結合します。

columns = [k for k,v in sorted(word_dict.items())]
tf_df = pd.DataFrame(columns=columns)
for i,v in df.iterrows():
    tmp = word_dict.copy()
    for token in t.tokenize(v[1]):
        h = token.part_of_speech.split(',')[0]
        if any([h=='名詞',h=='動詞',h=='形容詞']):
            key = token.surface
            if key in tmp:
                tmp[key]=1
    tmp_list = [v for k,v in sorted(tmp.items())]
    tmp_df = pd.DataFrame(data=np.array(tmp_list).reshape(1,len(tmp_list)),columns=columns)
    tf_df = tf_df.append(tmp_df)

tf_df = tf_df.reset_index(drop=True)
data_df = pd.concat([df,tf_df],axis=1)

これでデータは揃いました。

学習用には
説明変数と目的変数が必要なので
いらないものを除外して設定します。
x = data_df.iloc[0:,3:]
y = data_df['y']

次は学習ですね

機械学習史上最も雑な判別モデルの作成です。

とにかく全部データ使ってモデルを作ります。
model = LogisticRegression(fit_intercept = False)
model.fit(x,y)

predict = model.predict(x)
print('Accuracy : {0}%'.format(accuracy_score(y, predict)*100))
print(confusion_matrix(y, predict, labels=[0,1]))
Accuracy : 100.0%
[[ 7 0]
[ 0 22]]

判別モデルの検証も適当にしていますが
正解率100%と言うギャグのようなモデルが出来上がります。

最後に
このモデルを使えるようにしましょう!!!

ここでは
widgetを使ってjupyter上で使えるようにしています。
from __future__ import print_function
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets

def callback(word):

    if len(word)>0:
        data = word_dict.copy()
        for token in t.tokenize(word):
            h = token.part_of_speech.split(',')[0]
            if any([h=='名詞',h=='動詞',h=='形容詞']):
                key = token.surface
                if key in tmp:
                    data[key]=1

        input_list = [v for k,v in sorted(data.items())]
        input_df = pd.DataFrame(data=np.array(input_list).reshape(1,len(input_list)),columns=columns)
        input_predict = model.predict(input_df)

        if input_predict==1:
            print('それはコーンフレークや!!!')
        else:
            print('コーンフレークちゃうやないかい!!')
    else:
        print()

interact(callback,word='')

実行してみると
mb2

入力値に対して判別結果が出力されます。


mb3

mb4


はい
このような判別モデルですが
データさえあれば
なんとかなるもんですね

まあ、学習用のデータに用いたものしかコーンフレーク認定されない
雑な学習モデルですが
初学者の学習用にはなかなか面白いかもしれません。

ミルクボーイのネタはまだまだ沢山あるので
以下のようなものもイケますね!!
・モナカかモナカ違うか
・サイゼかサイゼちゃうか
・俳優か男優か etc


M-1が始まる前までは
個人的には「かまいたち」を 優勝予想していたものの

ミルクボーイのネタの完成度には 正直驚きましたねーーー

その他の細かい予想は当たったので
データからお笑いに関する予測するということも
面白い研究分野の一つになっています。

最後に データからM-1で優勝する方法について
需要が有ればやりたいですねー

芸人の方々、ご連絡くださいませ!!

それでは