第2回ビネクラ杯のランキングが確定しました!

16-10. ミルクボーイのネタをグラフ構造で可視化してみた

やること

お笑いコンビ「ミルクボーイ」のネタにはパターンがありそうなので、グラフ構造で可視化してみましょう

参考文献

ミルクボーイは、2019年M-1グランプリ優勝のお笑いコンビ。

ミルクボーイ公式チャンネル
ネタで言わしてもろてるみなさますみません、だいぶ前のネタばかりですし、広告つけてませんからお金も発生しておりませんし、儲ける気もないですし、今さら消すのもちゃいますし、すべってたりもしますし、こんなことなる思ってませんし、どうぞお手柔らかにお願いします。 よしもとが管理する公式チャンネルになりまして、1月11日よ...

グラフ構造とは、ノード(丸)とエッジ(線)で構成されるデータ構造。

グラフ (データ構造) - Wikipedia

実行環境

Windowsではグラフの出力に問題があるようなので、WinPythonは使えませんでした。

Google Colaboratoryが利用可能です。

Google Colaboratory

pip, import

日本語フォントを導入しないと文字が豆腐になってしまいます。

#日本語フォントをダウンロード
!apt-get -y install fonts-ipafont-gothic

必要なパッケージをimportします。

import numpy as np
import pydotplus
from IPython.display import Image

ネタの入力

ネタを文字起こしするのは憚られますが、もっとも有名なネタである「コーンフレーク」をざっくりと入力します。

#===============================
# 設定
#===============================
#ネタの展開をカンマ区切りで入力
neta = 'どうもミルクボーイです,\
オカンが好きな朝ごはんがある,\
どんな特徴言うてたか教えて,\
甘くてカリカリして牛乳かける,\
コーンフレークやないかい,\
何が分かれへんのよ,\
オカンが言うには,\
死ぬ前の最期のご飯,\
ほなコーンフレークとちゃうかぁ,\
どんな特徴言うてたか教えて,\
栄養バランスの五角形がでかい,\
コーンフレークやないかい,\
何が分かれへんのよ,\
オカンが言うには,\
晩ごはんでもいい,\
ほなコーンフレークとちゃうかぁ,\
どんな特徴言うてたか教えて,\
パフェのかさ増しに使われている,\
コーンフレークやないかい,\
何が分かれへんのよ,\
オカンが言うには,\
コーンフレークではない,\
ほなコーンフレークとちゃうかぁ,\
オトンが言うには,\
サバの塩焼き'

グラフの表示

詳細はコメントをご参照ください。

#===============================
# 遷移マトリックスの作成
#===============================
#カンマで区切って場面集とする
scenes = neta.split(',')
print('scenes')
print(scenes)

#場面集から重複を除いたもの
scene_set = list(set(scenes))

#場面遷移を記録するマトリックス
matrix = np.zeros((len(scene_set), len(scene_set)))

#場面の遷移を記録
for i in range(1, len(scenes)):
    prev = scenes[i-1]
    now = scenes[i]
    matrix[scene_set.index(prev), scene_set.index(now)] += 1

#各行が合計1になるよう規格化
for i in range(len(scene_set)):
    if np.sum(matrix[i]) > 0:
        matrix[i] /= np.sum(matrix[i])
print('matrix')
print(matrix)


#===============================
# グラフの作成
#===============================
#グラフオブジェクト
graph = pydotplus.Dot(graph_type='digraph')

#ノード(丸)を追加
for scene in scene_set:
    node = pydotplus.Node(scene)
    graph.add_node(node)

#エッジ(線)を追加
for i in range(len(scene_set)):
    for j in range(len(scene_set)):
        if matrix[i, j] > 0:
            edge = pydotplus.Edge(scene_set[i], scene_set[j])
            edge.set_label('{:.2f}'.format(matrix[i, j]))
            graph.add_edge(edge)

#グラフを保存
graph.write_png('graph.png', prog='dot')
#グラフをColab上に表示
Image(graph.create_png())
scenes
['どうもミルクボーイです', 'オカンが好きな朝ごはんがある', 'どんな特徴言うてたか教えて', '甘くてカリカリして牛乳かける', 'コーンフレークやないかい', '何が分かれへんのよ', 'オカンが言うには', '死ぬ前の最期のご飯', 'ほなコーンフレークとちゃうかぁ', 'どんな特徴言うてたか教えて', '栄養バランスの五角形がでかい', 'コーンフレークやないかい', '何が分かれへんのよ', 'オカンが言うには', '晩ごはんでもいい', 'ほなコーンフレークとちゃうかぁ', 'どんな特徴言うてたか教えて', 'パフェのかさ増しに使われている', 'コーンフレークやないかい', '何が分かれへんのよ', 'オカンが言うには', 'コーンフレークではない', 'ほなコーンフレークとちゃうかぁ', 'オトンが言うには', 'サバの塩焼き']
matrix
[[0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.33  0.    0.    0.    0.67]
 [0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    1.0   0.    0.  ]
 [1.0   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]
 [0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]
 [0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    1.0   0.  ]
 [1.0   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]
 [0.    0.    0.    0.    0.    0.    0.    0.    1.0   0.    0.    0.    0.    0.    0.  ]
 [1.0   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]
 [0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    1.0 ]
 [0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    1.0   0.    0.  ]
 [0.    0.    0.    1.0   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]
 [0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    1.0   0.    0.  ]
 [0.    0.    0.    0.    1.0   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]
 [0.    0.    0.33  0.    0.    0.33  0.    0.33  0.    0.    0.    0.    0.    0.    0.  ]
 [0.    0.33  0.    0.    0.    0.    0.    0.    0.    0.33  0.    0.33  0.    0.    0.  ]]

並び方はイマイチな感じですが、始めのノードからたどっていくと、ちゃんとミルクボーイらしいネタ構成になっています。場面遷移が確率に従うと考えれば自動ネタ生成もできそうですが(→校長先生の話エンドレス(外部サイトに飛びます))、思ったより早く終わったり、いつまでも終わらなかったりするかもしれません。

タイトルとURLをコピーしました