やること
お笑いコンビ「ミルクボーイ」のネタにはパターンがありそうなので、グラフ構造で可視化してみましょう。
参考文献
ミルクボーイは、2019年M-1グランプリ優勝のお笑いコンビ。
ミルクボーイ公式チャンネル
ミルクボーイの公式YouTubeチャンネルです!
グラフ構造とは、ノード(丸)とエッジ(線)で構成されるデータ構造。
グラフ (データ構造) - Wikipedia
実行環境
Windowsではグラフの出力に問題があるようなので、WinPythonは使えませんでした。
Google Colaboratoryが利用可能です。
Google Colab
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. ]]
並び方はイマイチな感じですが、始めのノードからたどっていくと、ちゃんとミルクボーイらしいネタ構成になっています。場面遷移が確率に従うと考えれば自動ネタ生成もできそうですが(→校長先生の話エンドレス(外部サイトに飛びます))、思ったより早く終わったり、いつまでも終わらなかったりするかもしれません。