DEVELOPER’s BLOG

技術ブログ

【M-1 記念】ミルクボーイを機械学習で再現してみた

2019.12.27 都築 勇祐
コラム 機械学習
【M-1 記念】ミルクボーイを機械学習で再現してみた

【ネタバレあり】


皆さん今年のM-1グランプリご覧になりましたか? 今年はミルクボーイさんが見事歴代最高得点で優勝しました。本当におめでとうございます!


ミルクボーイさんといえば

「それコーンフレークやないかい!」

「いやほなコーンフレークちゃうやないかい!」

と一方の文章に対してもう一方がコーンフレークかどうかをつっこむ、というネタですよね。


そこでテレビを見ながら思ったわけです。

「これって、機械学習でできるんじゃね?」

与えられた文章に対して、それがコーンフレークについての文章かどうかを判別する、というのはいかにも機械学習ができそうなことです。

ということで作ってみました!

スクリーンショット 2019-12-27 16.40.46.png @1_milkboy
このツイッターアカウントは入力した文章に対して「それコーンフレークやないかい!」/「いやほなコーンフレークちゃうやないかい!」と突っ込んでくれます。


BERTを使ってみた

まずは、元データを用意します。
これはミルクボーイさんの漫才の中の言葉の他に、ウィキペディアの記事などから集めてきました。
コーンフレークなら1、そうでないなら0という風に値を指定していきます。
時間もなかったので、全部で70件ほどしか集まりませんでした...
image1.png
次に、学習機です。
文章の学習、ということで用いたのはBERTです。(BERTについてはこちらを参照
Googleさんが104ヶ国語に対応しているmultilingual BERTを公開しているので、改めて日本語を学習していく必要はありません。
日本語を学習済みのBERTを使って、元データを読み込ませてどういう分がコーンフレークなのか学習していきます。

train = pd.read_csv(text, header=0)
BERT_MODEL_HUB = "https://tfhub.dev/google/bert_multi_cased_L-12_H-768_A-12/1"

[途中略]

print(f'Beginning Training!')
start_time = datetime.now()
model.train(input_fn=train_input_fn, max_steps=num_train_steps)
print("Training took time ", datetime.now() - start_time)


学習が終わったところで、実際の文で試していきましょう!

今回は
「朝ごはんに食べると目が覚めるやつ」

「ごはんと食べるとおいしいやつ」
の2文で試していきます。

前者が「ほなそれコーンフレークやないか」、後者が「ほなそれコーンフレークちゃうやないか」の予定なのですが、元データが少ないので、「朝ごはん」と「ごはん」の違いに引っかからないかがポイントですね。


labels = ["ほなそれコーンフレークやないか", "ほなそれコーンフレークちゃうやないか"]

[途中略]

predict_text = ["朝ごはんに食べると目が覚めるやつ", "ごはんと食べるとおいしいやつ"]
predictions = getPrediction(model, predict_text)
predictions


結果がこちら!
image2.png
残念ながらどちらも「ほなそれコーンフレークやないか!」とつっこまれています...
やはり元データを増やさないと精度はまだまだ出ませんね。


Word2Vecを使ってみた

ということで今度はWord2Vecを使ってみました!(切り替えが早い...)
BERTはWord2Vecより性能が高いのですが、元データが小さい場合、Word2Vecでキーワードだけ拾ったほうがよいのではと思い試してみることにしました。
まずは日本語のWord2Vecを(http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/)から引っ張ってきました。
BERTもそうでしたが、日本語に対して学習済みの機械が出ているのは非常に助かりますね!

次に、入力を処理していきます。与えられた文章の中から名詞と動詞のみを抽出し、単語のlistにします。

def counter(texts):
            t = Tokenizer()
            word_count = defaultdict(int)
            words = []
            for text in texts:
                tokens = t.tokenize(text)
                for token in tokens:
                    pos = token.part_of_speech.split(',')[0]
                    if pos in ['名詞', '動詞']:
                        # 必要ない単語を省く(実際の結果を見て調整)
                        if token.base_form not in ["こと", "よう", "そう", "これ", "それ", "もの", "ため", "ある", "いる", "する"]:
                            word_count[token.base_form] += 1
                            words.append(token.base_form)
            return word_count, words


続いて、この単語のlistとキーワード(今回はコーンフレーク)との相関度を計算します。
Gensimのライブラリは充実しているので一行ですみます。

score = self.model.n_similarity([keyword], words)


最後にこの数字が0.5以上なら「ほなそれコーンフレークやないか」、0.5以下なら「ほなそれコーンフレークちゃうやないか」を出力する、という形にしました。

if (score > 0.5):
          return("ほなそれコーンフレークやないか")
        else:
          return("ほなそれコーンフレークちゃうやないか")


これをキーワードは「コーンフレーク」、文章は「アフリカの名産品って言ってた」で試してみましょう。
文章の中から「アフリカ」「名産品」「言って」を抜き出し、それぞれと「コーンフレーク」との相関の平均を取ります。
するとなんということでしょう、「ほなそれコーンフレークちゃうやないか」と出力されるではありませんか!

さきほど失敗した「ごはんとめっちゃ合うって言ってた」でも試してみると、
今度は大成功です!


まとめ

今回Word2VecとBERTの両方を試してみて、ぱっと見たところWord2Vecのほうが結果が良いことがわかりました。
しかしこれは本当は苦肉の策です。単語だけを抜き出すより、文脈全体を考慮したほうがよいですし、0.5という敷居値も独断っと偏見でしかありません。それぞれの単語とキーワードの相関も足し合わせただけではホントは良くないかもしれません。そういった点で、最初にBERTを使ってみたのですが、いかんせん元データの数が少なすぎました。いずれ十分なデータ量がたまれば、BERTが活躍できる日が来るかもしれません。
最終的にはミルクボーイさんとコラボなんてしてみたいですね。
それではまた!皆様よい新年をお迎えください!


Twitter・Facebookで定期的に情報発信しています!

関連記事

クラウド運用のその先へ、 AWS・Azure・Google Cloudを超えるSRE統合戦略

はじめに:マルチクラウドの「分断」がもたらす課題 背景:なぜマルチクラウドは難しいのか 解決策:SREによる統合戦略とは 技術戦略:統合運用を支える実装ポイント まとめ 1.はじめに:マルチクラウドの「分断」がもたらす課題 近年、企業のクラウド活用は高度化し、AWS・Azure・Google Cloudといった複数のクラウドサービスを同時に利用する「マルチクラウド戦略」が一般化しています。「いっそ1つのクラウドに統一した方が効率的では

記事詳細
クラウド運用のその先へ、 AWS・Azure・Google Cloudを超えるSRE統合戦略
SRE コラム
SREの費用は高いのか?──コストの見える化と

はじめに SREにかかる費用の内訳 なぜ「高い」と感じるのか? "投資対効果"の視点で見るSRE コストを最小化しながら始めるには? まとめ:SREは「高い」ではなく「将来を守る投資」 1.はじめに SRE(Site Reliability Engineering)を導入したい──そう考える企業が増える一方で、「費用が高すぎるのでは?」と導入に躊躇する声も聞かれます。しかし、SREにかかるコストは単なる"費用"ではなく、"将来的な

記事詳細
SREの費用は高いのか?──コストの見える化と"投資対効果"の考え方
SRE コラム
SRE実践の盲点: 多くのチームが見落とす5つのポイント

SRE導入後のよくある課題と本記事の目的 盲点①:ポストモーテムの形骸化 盲点②:モニタリングのカバレッジ不足 盲点③:自動復旧の未整備 盲点④:改善サイクルの不在 盲点⑤:カオスエンジニアリングの未導入 まとめ 1.SRE導入後のよくある課題と本記事の目的 Site Reliability Engineering(SRE)の導入は、サービスの可用性や信頼性を高めるための有効な手段として多くの企業に取り入れられています。しかし

記事詳細
SRE実践の盲点: 多くのチームが見落とす5つのポイント
SRE コラム
 人材不足に立ち向かうSREの力:次世代の運用体制をどう築くか

はじめに:運用現場の"人材不足"が引き起こすリスクとは? なぜSREが"人手に依存しない運用"を可能にするのか? 自動化・可観測性がもたらす省力化と再現性 従来の限界を超えた次世代の運用支援〜生成AI×SREの事例〜 今すぐ始めるためのSRE導入チェックリスト まとめ:人が足りない今こそ、SREという選択を 1.はじめに:運用現場の"人材不足"が引き起こすリスクとは? クラウド化やマイクロサービスの導入が進む中、IT運用の現場では

記事詳細
人材不足に立ち向かうSREの力:次世代の運用体制をどう築くか
SRE コラム

お問い合わせはこちらから