ジャルジャルのネタのタイトル、マルコフ連鎖で生成する奴

皆さんはジャルジャルのYouTubeチャンネル「ジャルジャルタワー」をご存知でしょうか。
そのチャンネルで彼らは、驚くべきことに、毎日一本ずつコントを投稿しています。夥しい量のコントのタイトルは、いずれも「〜奴」で統一されています。
マルコフ連鎖を用いれば、それらしい面白いタイトルが生成できるのでは？　そんな期待とともにぼくは、[[Python]N階マルコフ連鎖で文章生成](https://qiita.com/k-jimon/items/f02fae75e853a9c02127)を大いに参考にさせていただき実装に取り組みました。

まず、データの収集が必要です。YouTubeからのクローリングは大変そうだったので、コピーアンドペーストを繰り返す(+テキストファイルの処理)いう原始的な手法で、以下のように、ジャルジャルのネタのタネ1169本のタイトルからなる配列、名付けて「jaru」を用意しました。

![スクリーンショット 2021-08-26 23.35.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940763/c01038c4-f126-5a25-1573-4eb61542a88f.png "狂気")


これを用いて、早速N=2のマルコフ連鎖を生成していきます。タイトルの終了を表す"』"を文章における句点代わりに扱いました。

まず、タイトルをCaboChaにより品詞分解して配列wordlistに収めます。この際、開始部分の"『"は除きます。

```python
import CaboCha
wordlist = []
wa  =wordlist.append
for neta in jaru:
  c = CaboCha.Parser()
  tree =  c.parse(neta)
  for i in range(1,tree.size()):
    tok = tree.token(i)
    wa(tok.surface)
```
次に、2個の単語をkey、次の単語をvalueとする辞書オブジェクトを作る関数を作ります。これは参考記事のものをほとんどそのまま使うことができました。

```python
from collections import deque
def make_model(wordlist, order=2):
    model = {}
    queue = deque([], order)
    queue.append("『")
    for markov_value in wordlist:
        if len(queue) < order:
            queue.append(markov_value)
            continue
        if queue[-1] == "』":
            markov_key = tuple(queue)
            if markov_key not in model:
                model[markov_key] = []
            model.setdefault(markov_key, []).append("『")
            queue.append("『")
        markov_key = tuple(queue)
        model.setdefault(markov_key, []).append(markov_value)
        queue.append(markov_value)
    return model
```

そして、マルコフ連鎖によってタイトルを生成する関数を作っていきます。

```python
import random
def make_title(model, title_num=100, seed="『", max_words = 10000):    
    title_count = 0
    key_candidates = [key for key in model if key[0] == seed]
    if not key_candidates:
        print("Not find Keyword")
        return
    markov_key = random.choice(key_candidates)
    queue = deque(list(markov_key), len(list(model.keys())[0]))
    titles = []
    title = "".join(markov_key)
    for _ in range(max_words):
        markov_key = tuple(queue)
        next_word = random.choice(model[markov_key])
        title += next_word
        queue.append(next_word)
        if next_word == "』":
            title_count += 1
            titles.append(title)
            title =  ""
            if title_count == title_num:
                break
    return titles
```


最後に、生成した100個のタイトルから、元々のタイトルと一致したものを除いたものを表示します。

```python
model = make_model(wordlist)
titles = make_title(model)
for title in titles:
  if title not in jaru:
    print(title)
```

試しに一回実行してみると、以下のような結果になりました。

```
『理解不能者になりかける奴』
『フレンチシェフのくせに子守唄のサービスしてるとこ見られる奴』
『モグリの意味がピンとこない歌手な奴』
『小部屋で歌聞かせる６０歳のくせに頼む奴』
『モグリの意味がピンとこない歌手な奴』
『５０人集めて、呪文を唱えさせる奴』
『ミス誤魔化してるけどバレバレな奴』
『シュールなネタしそうな奴』
『公園で合唱団の練習した独裁者な奴』
『リモート授業に慣れてない奴』
『江戸っ子探偵練習させたリアクションにビックリする奴』
『バイトの面接〜』
『しゃべり方が「先生」な奴』
『男子高校生のくせに職務質問される奴』
『ええ顔してるか何回も読まされる奴をおちょくる奴』
『嘘ついてないのに部室くるＯＢな奴』
『体調悪いの年齢のせいする医者のくせにヤバい奴』
『キングオブコント決勝でやった奴』
『客に「知りまへん」って言う奴』
『独裁者のくせに落語口調な奴』
『公園で合唱団の練習したこと知らん奴』
『プロポーズの様子を撮って欲しい本気ネタ2/3』
『牛丼屋でバーベキューした奴』
『自分の短所を正直に言っちゃう川島海荷いてた奴』
『キングオブコント決勝でやったなぁ」としかツッコまん奴』
『ボイパに人生観を変えられた若手俳優な奴』
『サクサクしてる奴』
『延長線上に似てる奴』
『花火大会でヤバい店員にヤバい奴とネタ入りたい奴』
『すぐに毛染めされる関東出身のツッコミ下手な関東人な奴』
『牛丼屋でムカムカする奴』
『「あちゃー」って言われる奴』
『ちょっと変なチャリ乗ってる奴』
『最後に不必要なネタする奴』
『「日本人かーい！」って聞く奴』
『心情の説明下手な関東人な奴』
『バイトの面接で店長を呼び捨てする奴しない陽気さを持ってる奴』
『主婦ボクサーと脱サラ５０年続いているせいで怒鳴られる奴』
『珍しい名前の友達がちょっと変な奴』
『リモート面接で「よいしょー」って言う奴』
『堂々とし過ぎてクビなる奴』
『つっこむとき声大きくなる奴』
『ほうれい線が濃くなる芸人な奴』
『「えっ！」は外す奴』
『嘘ついてないのに部室くるＯＢな奴』
『一瞬変な先生な奴』
『店員にボロクソ言われてシーンとなる先生な奴』
『食事中に屁こいてまた笑う奴』
『漫才中に喋らん分、普段早口な奴』
『怒られた奴』
『同窓会でめっちゃふざける奴』
『本名、ふざけてるようで真剣な奴』
『キャプテンのくせに鼻ほじる奴』
『元旦に出会った涙腺コルクとチャラ男番長のネタを見る奴パート2』
『「お前が行くんやったら行くで」って言う寿司屋きた奴』
```

・・・かなりいい（？）
ジャルジャルのネタのタイトルは、そもそも突拍子がないものが多いので、ランダム生成をしてもそこまで違和感がないようです。

『独裁者のくせに落語口調な奴』にはニヤリとするし、『同窓会でめっちゃふざける奴』は、ぜひとも見てみたいです。

とはいえ、サンプル数が1000でも少なすぎるので、せいぜい2つか3つをくっつけたものになっていそうなのが惜しいところです。登場したことのない単語も混ざるような手法も考えてみたいところです。

#### おすすめ記事

[芸人のコント動画、「文字通り」切り抜いてみた](https://qiita.com/masaka_programming/items/b3d98131b04f1906cde4)


#### おまけ

N=1で実行すると、もっと支離滅裂になりました。

```
『鉄板替え歌を見る奴vs知らんべらぼんの話やめる奴』
『大晦日に気に入られへん奴』
『客足がたまってる奴』
『笑い方が怖い奴』
『「おだまり！って聞く新任教師のに歌を極限状態に子供をされるウルフルズに袖めくる奴』
『ピロティーの振動でデカいディレクターな奴』
『からまれてくる奴』
『「えっ！」を学んではないところに聞こえる奴』
『洞窟見て点チャンピオンが長い美容師の短所を書くタイプのくせになってないおばはん歌手に取材NGな奴』
『パワープレーな奴』
『ドキュメンタリーを唱えさせる奴』
『主婦ボクサーな奴』
『頭、見抜くの対処早い奴』
『友達が財布拾った奴』
『真剣な奴』
『嫌な奴』
『先生の弟子な奴』
『クラスメートにカバン入れていいかどうかどうか分からなく笑いとる奴』
『後頭部、山小屋に人生かけた奴』
『めっちゃ指さす若者のわからん奴』
『ゆるいＣＭソングに袖めくる奴』
『顔が「お前ちゃう奴パート23』
『ハゲてた涙腺コルクとモデル部な奴』
『けん玉成功して寿司屋きただけのに密着さがらん奴』
『鬼軍曹』
『日本語下手な奴パート32』
『子守唄の歌詞覚えられた奴』
『判定わかりにくい酔い方が「いいと演歌でかくなる奴』
『頬に出会ったけど、全然ちゃう住職な１０年付き合い続いてない奴』
『Ｋ-1決勝でいる人と言語覚える天才な奴』
『海荷って奴』
『爪切るとこ見る奴』
『９歳の暗された奴』
『殴る奴』
『授業に口挟む奴』
『〈ＧＷ〉がネタ作った奴パート44』
『漫才する奴』
『こんなコントする奴』
『騒音すごい奴』
『おじいさんにツッコまんかった奴』
『くしゃみとツッコミ下手な奴』
『拍手、ハズイ奴を見る奴』
『お笑い芸人同士でアクエリ頼む奴』
『絶対、演じてる奴』
『洋楽を味わう奴』
『強されへん奴』
『宇宙人とゲップとする奴』
『南って奴』
『昼寝してる奴』
```