東海オンエアの動画タイトルを自動生成してみた

#はじめに
こんにちわ．

形態素解析とマルコフ連鎖を使って東海オンエアの動画タイトルを生成してみました

[**結果だけ見たい方**](https://qiita.com/kii95/items/64afaa389e064c9834d0#%E7%94%9F%E6%88%90%E7%B5%90%E6%9E%9C-%E4%B8%80%E9%83%A8)

今回のソースコードは全て[GitHub](https://github.com/hiraikiichi/Markovchain_youtube)にあります

##東海オンエアとは？

[東海オンエア](https://www.youtube.com/channel/UCutJqz56653xV2wwSvut_hQ)とは，登録者数580万人以上の大人気6人組YouTubeグループです．


>東海オンエアは、日本の愛知県岡崎市に拠点を置く、6人組YouTuberグループ。メンバーはてつや、りょう、しばゆー、としみつ、ゆめまる、虫眼鏡。2013年にYouTubeより動画投稿を中心とする活動を開始。2017年からUUUMに所属している。YouTubeチャンネルとしてメインの「東海オンエア」、サブの「東海オンエアの控え室」、ならびに各メンバーのチャンネルが存在する。

参照：[Wikipedia](https://ja.wikipedia.org/wiki/%E6%9D%B1%E6%B5%B7%E3%82%AA%E3%83%B3%E3%82%A8%E3%82%A2)

#形態素解析とは
**形態素解析**とは，自然言語(普通の言葉)を形態素にまで分割する技術のことです．
例↓

```
東海オンエアは、日本の愛知県岡崎市に拠点を置く、6人組YouTuberグループ
```

```Mecab
東海	　　　　名詞,固有名詞,地域,一般,*,*,東海,トウカイ,トーカイ
オンエア　　　名詞,一般,*,*,*,*,オンエア,オンエア,オンエア
は　　　　　　助詞,係助詞,*,*,*,*,は,ハ,ワ
、　　　　　　記号,読点,*,*,*,*,、,、,、
日本　　　　　名詞,固有名詞,地域,国,*,*,日本,ニッポン,ニッポン
の　　　　　　助詞,連体化,*,*,*,*,の,ノ,ノ
愛知　　　　　名詞,固有名詞,地域,一般,*,*,愛知,アイチ,アイチ
県　　　　　　名詞,接尾,地域,*,*,*,県,ケン,ケン
岡崎　　　　　名詞,固有名詞,地域,一般,*,*,岡崎,オカザキ,オカザキ
市　　　　　　名詞,接尾,地域,*,*,*,市,シ,シ
に　　　　　　助詞,格助詞,一般,*,*,*,に,ニ,ニ
拠点　　　　　名詞,一般,*,*,*,*,拠点,キョテン,キョテン
を　　　　　　助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
置く　　　　　動詞,自立,*,*,五段・カ行イ音便,基本形,置く,オク,オク
、　　　　　　記号,読点,*,*,*,*,、,、,、
６　　　　　　名詞,数,*,*,*,*,*
人組　　　　　名詞,接尾,助数詞,*,*,*,人組,ニングミ,ニングミ
YouTuber　　名詞,固有名詞,組織,*,*,*,*
グループ　　　名詞,一般,*,*,*,*,グループ,グループ,グループ
```

このような感じで形態素解析してくれます．すげえ！
今回はMecabを使用し形態素解析して分かち書きにします．

#マルコフ連鎖とは

>マルコフ性を持つ確率過程（stocastic process, 時間変化する確率変数）のうち取り得る事象を示す値が離散的なものを指す。

参照：[ニコニコ大百科](https://dic.nicovideo.jp/a/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%80%A3%E9%8E%96)

なるほど．（←わかってない）

マルコフ連鎖を簡単に説明すると，**現在の状態だけで未来の状態を確率的に決めるものです**．



#動画タイトルを自動生成してみよう

## YouTube APIを使用して全動画タイトルを取得

YouTubeAPIの取得方法などはググってください．たぶんわかりやすいのがたくさん出てきます．

1ヶ月単位で動画タイトルを取得してテキストファイルに書き込みます．
**東海オンエアなどの投稿数が多いチャンネルは1回でYouTubeAPIの使用制限超えるので気を付けてください．** (何回かやらかした)

```youtube_title.py
from apiclient.discovery import build
import json
import datetime
from dateutil.relativedelta import relativedelta

# API情報
API_KEY = '【取得したAPI】'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'

videos = [] #videoURLを格納する配列

def youtube_search(pagetoken, st, ed):
  youtube = build(
      YOUTUBE_API_SERVICE_NAME, 
      YOUTUBE_API_VERSION,
      developerKey=API_KEY
      )

  search_response = youtube.search().list(
    channelId = 'UCutJqz56653xV2wwSvut_hQ',
    part = 'snippet',
    type = 'video',
    maxResults = 50,
    publishedAfter = st, 
    publishedBefore = ed, 
    pageToken = pagetoken
  ).execute()

  print(search_response["pageInfo"]["totalResults"])

  for search_result in search_response.get("items", []):
    if search_result["id"]["kind"] == "youtube#video":
      d = search_result["snippet"]["title"]
      videos.append(d)

  try:
    nextPagetoken =  search_response["nextPageToken"] 
    print(nextPagetoken)
    youtube_search(nextPagetoken, st, ed)
  except:
    return

dt = datetime.datetime(2013, 10, 1, 0, 0) # 動画投稿開始月を設定
for i in range(1, 97): # 97回(だいたい今月まで回す)
  youtube_search('', dt.isoformat()+'Z', (dt + relativedelta(months = 1)).isoformat()+'Z')
  dt = dt + relativedelta(months=1)

path_w = './youtube_title.txt'

with open(path_w, mode='w', encoding="utf-8") as f:
    f.write('\n'.join(videos))

``` 

出力されたテキストファイル(一部抜粋)

```youtube_title.txt
「全国４６道府県！旅行の旅！」群馬県編！
【盗撮】クイズ！お説教されているてつやはなんて言うの？
【山奥のリゾート】２泊３日！寝たら&quot;即帰宅&quot;の旅！Part１
```

HTMLの特殊文字```&quot;```などが変換されていません．
次で変換します

## 取得したタイトルを分かち書きにする

先ほどのコードで取得してきたテキストファイルを一行ずつ読み込み特殊文字があれば変換し，分かち書きにします．

```title_macab.py
import MeCab

with open('./youtube_title.txt', mode='rt', encoding='utf-8') as f:
    read_data = list(f)

m = MeCab.Tagger('-Owakati')
f = open('./title_mecab.txt', 'w', encoding="utf-8")

for line in read_data:
    if '&amp;' in line or '&#39;' in line or '&quot;' in line:
        line = line.replace('&amp;', '&').replace('&#39;', "'").replace('&quot;', '"')
    splited_line = m.parse(line)
    f.write(str(splited_line))
f.close()
```

出力されたテキストファイル(一部抜粋)

```title_mecab.txt
「 全国 ４ ６ 道府県 ！ 旅行 の 旅 ！ 」 群馬 県 編 ！ 
【 盗 撮 】 クイズ ！ お 説教 さ れ て いる て つや は なんて 言う の ？ 
【 山奥 の リゾート 】 ２ 泊 ３ 日 ！ 寝 たら " 即 帰宅 " の 旅 ！ Part １ 
```

良い感じにできています！今回，【】や「」などはあえて残しておきました．

## 分かち書きしたタイトルを使ってモデル作成&タイトル生成

テキストファイルから分かち書きしたタイトルを一行ずつ読み込んでモデルを作成しています．

モデル作成後，500タイトル生成しています．

```markov.py
import markovify

with open("./title_mecab.txt", "r", encoding="utf-8") as file:
    text = file.read()
    
# モデル作成
text_model = markovify.NewlineText(text, state_size=2, well_formed=False)

with open('./learned_data.json', 'w') as f:
    f.write(text_model.to_json())
    
with open('learned_data.json', 'r', encoding="utf-8") as f:
    text_model = markovify.Text.from_json(f.read())
    
li = []
for i in range(500): # 500タイトル作成
    li.append(text_model.make_short_sentence(140).replace(" ", ""))

with open('./out.txt', mode='w', encoding="utf-8") as f:
    f.write('\n'.join(li))
```

# 生成結果 (一部)
```out.txt
【再生屋】しばゆーを見抜け！筋肉痛ダウト！！
【新発見】魚よりも早いんじゃね！？
絶妙な一枚でスノーボード作ってやるぜ！！！
【お仕事】全力でやってみた！！
Siriの尻じゃない画像選手権！！！！！！！
【１位は商品化】バレずに助ける方法！！
てつやの財布からお金を使えば無敵の鎧ができるじゃん！
【工藤新一】暗号を解読して食べられる物にしてみた
上京して魔王を討伐せよ！おうちデュエル！！
７００万円の時計を全力で紹介します。
【日本語難しい】しばゆーは何としみつ編
```

なんかありそう笑
他は[**ここ**](https://github.com/hiraikiichi/Markovchain_youtube/blob/main/out.txt)にあります．

# まとめ

次は機械学習でやろう．

おわり