chinda_fall_desu’s diary

竹内豊の日記

ヒューマンコンピューターインターフェースをもっと知りたいなー

Pythonを使ってYoutube動画の出演者を当てる(東海オンエアで検証)

Youtube Data APIを使えば、Youtube動画の様々な情報を得られる。タイトルや概要欄などが分かる。Youtube Data APIについては以下の記事にまとめた。
chindafalldesu.hatenablog.com


上記のほかにコメント欄のコメントを取得することも可能である。
動画をそのまま解析することは難しいので動画の簡易的な解析にコメント欄を用いることができる。
コメントを使って、東海オンエアの動画に誰が出演しているか当ててみよう。


①コメント欄のコメントの取得

import requests
import time
videoId='JRizOqEl8EM'
apikey='(Youtube Data API のキー)'
url='https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,id&videoId='+videoId+'&textFormat=plainText&maxResults=50&key='+apikey
response = requests.get(url)
num=0
for i in range(50):
    print(str(num)+'. '+response.json()['items'][i]['snippet']['topLevelComment']['snippet']['textDisplay'])
    num+=1

(実行結果)

> python .\channel4.py
0. 5:06 しばゆーw
1. 8倍速何言ってるかわからん笑
2. 8倍速なんかの曲みたい
3. 犬夜叉の手懐かしい
4. ボクシングのレベル高すぎな
5. なんかどっかで見たんだけど思い出せない、、
6. 2:102:102:102:10
見つからなくて自分で書きました。
:
:
45. 7:21 トモダチコレクション
46. 7:43  から2倍速でみると面白い
47. 8倍速どう森みたい
48. てつやでぶった?
49. 久々に見たら、1人どうしようもない雑魚になってて草


②東海オンエアの動画に誰が出演しているか当ててみる。
www.youtube.com
この動画の出演者を当ててみよう。出演者の名前の登場回数から当てる。

import requests
import time
apikey='(Youtube Data APIのキー)'
videoId=input("videoId: ")
url='https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,id&videoId='+videoId+'&textFormat=plainText&maxResults=50&key='+apikey
yume=0
shiba=0
toshi=0
tetsu=0
mushi=0
ryo=0
response = requests.get(url)
for i in range(50):
    comment=response.json()['items'][i]['snippet']['topLevelComment']['snippet']['textDisplay']
    if 'ゆめまる' in comment:
        yume+=1
    elif 'しばゆー' in comment:
        shiba+=1
    elif 'てつや' in comment:
        tetsu+=1
    elif '虫眼鏡' in comment or '虫' in comment:
        mushi+=1
    elif 'としみつ' in comment:
        toshi+=1
    elif 'りょう' in comment:
        ryo+=1


for j in range(3):
    next=response.json()["nextPageToken"]
    nexturl=url+'&pageToken='+next
    response = requests.get(nexturl)
    for i in range(50):
        comment=response.json()['items'][i]['snippet']['topLevelComment']['snippet']['textDisplay']
        if 'ゆめまる' in comment:
            yume+=1
        elif 'しばゆー' in comment:
            shiba+=1
        elif 'てつや' in comment:
            tetsu+=1
        elif '虫眼鏡' in comment or '虫' in comment:
            mushi+=1
        elif 'としみつ' in comment:
            toshi+=1
        elif 'りょう' in comment:
            ryo+=1

print("しばゆー: "+str(shiba))
print("ゆめまる: "+str(yume))
print("としみつ: "+str(toshi))
print("てつや: "+str(tetsu))
print("虫眼鏡: "+str(mushi))
print("りょう: "+str(ryo)+"\n")

print("出演者: ")
if shiba>3:
    print("しばゆー")
if yume>3:
    print("ゆめまる")
if toshi>3:
    print("としみつ")
if tetsu>3:
    print("てつや")
if mushi>3:
    print("虫眼鏡")
if ryo>3:
    print("りょう")

(実行結果)

> python .\channel5.py
videoId: SEKB8bQNwwU
しばゆー: 14
ゆめまる: 14
としみつ: 9
てつや: 13
虫眼鏡: 0
りょう: 1

出演者:
しばゆー
ゆめまる
としみつ
てつや

この動画ではうまくいったようである。ほかの動画でも試してみる。


例1)
www.youtube.com

> python .\channel5.py
videoId: t6VuxAtz5IU
しばゆー: 18
ゆめまる: 0
としみつ: 2
てつや: 19
虫眼鏡: 19
りょう: 9

出演者:
しばゆー
てつや
虫眼鏡
りょう


例2)
www.youtube.com

> python .\channel5.py
videoId: _WE8CwuDDEA
しばゆー: 14
ゆめまる: 0
としみつ: 12
てつや: 8
虫眼鏡: 0
りょう: 0

出演者:
しばゆー
としみつ
てつや


仕組みはかなりシンプルだが、うまく動画の解析を行えているようである。
有名人辞書、名前辞書などを作れば、Youtubeのすべての動画の出演者を当てることも可能かもしれない。


(最後まで読んでいただきありがとうございます。間違い等あればコメントよろしくお願いいたします。)

東海オンエアの "臭い"動画をpythonを使って探してみた

東海オンエアの"臭い"動画をYoutube Data API と辞書を使って探してみた。流れは以下の通りである。
Youtube Data APIを使って、東海オンエアのチャンネルの動画タイトルを取得する
 ↓
②動画タイトルを単語ごとに分割する
 ↓
③辞書を使って動画タイトルを分析する




詳細はそれぞれ以下の記事にまとめてある。
Youtube Data APIを使って、東海オンエアのチャンネルの動画タイトルを取得する
chindafalldesu.hatenablog.com


②動画タイトルを単語ごとに分割する
chindafalldesu.hatenablog.com


③辞書を使って動画タイトルを分析する
chindafalldesu.hatenablog.com


'臭い'動画を探すために以下の辞書を使う。

word2score={'臭い':5,'臭':5,'閲覧':1,'汚い':3,'不潔':3,'不衛生':3,'劣悪':1,'便所':1, 'ごみ':1, 'うんこ':3,'精子':1,'珍':1,'棒':1,'酒':1,'酔':1,'酔う':1, '酔い':1, '泥酔':1 }

ソースコード

import MeCab
import pickle
import pandas
import requests
import time

channelid='UCutJqz56653xV2wwSvut_hQ'
apikey='(Youtube Data APIのキー)'
url = 'https://www.googleapis.com/youtube/v3/search?key='+apikey+'&channelId='+channelid+'&part=snippet,id&order=date&maxResults=50'
num=1
sentences=[]
vid=[]

response = requests.get(url)

for i in range(50):
    sentences.append(response.json()['items'][i]['snippet']['title'])
    vid.append("[https://www.youtube.com/watch?v="+response.json()['items'][i]['id']['videoId']+':embed:cite]')
    num+=1

for j in range(4):
    time.sleep(1)
    next=response.json()["nextPageToken"]
    nexturl=url+'&pageToken='+next
    response = requests.get(nexturl)
    for i in range(50):
        sentences.append(response.json()['items'][i]['snippet']['title'])
        try:
            vid.append("[https://www.youtube.com/watch?v="+response.json()['items'][i]['id']['videoId']+':embed:cite]')
        except:
            vid.append("NULL")
        num+=1

t=MeCab.Tagger('-Ochasen')
words_list=[]

for sentence in sentences:
    words=[]
    parsed=t.parse(sentence)
    for line in parsed.splitlines()[:-1]:
        words.append(line.split('\t')[2])
    words_list.append(words)

word2score={'臭い':5,'臭':5,'閲覧':1,'汚い':3,'不潔':3,'不衛生':3,'劣悪':1,'便所':1, 'ごみ':1, 'うんこ':3,'精子':1,'珍':1,'棒':1,'酒':1,'酔':1,'酔う':1, '酔い':1, '泥酔':1 }

scores=[]
for words in words_list:
    score=0
    for word in words:
        if word in word2score:
            score+=word2score[word]
    scores.append(score)

data=dict(zip(sentences,scores))
data_sorted = sorted(data.items(),key=lambda x:x[1], reverse=True)
for i in range(5):
    print(data_sorted[i])

# data=dict(zip(vid,scores))
# data_sorted = sorted(data.items(),key=lambda x:x[1], reverse=True)
# for i in range(5):
#     print(data_sorted[i][0])

(実行結果①)

> python .\words10.py
('【いい匂いはNG】「臭くておいしい料理」選手権!', 5)
('【酔酔酔】当てるまで終われない利き日本酒', 4)
('「ネコのうんこコーヒー」てつやネコのでも美味しいんじゃね!?', 3)
('精子観察キットで東海オンエアの精子を測定したらまさかの...', 2)
('【閲覧注意】この動画を見ると頭がおかしくなります。', 1)

(実行結果②)はてなブログでそのまま動画を閲覧できるように編集

> python .\words10.py

www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com

このやり方を使えば主観的な概念で動画を検索することができる。
例えば、綺麗、汚い、行きたい、素敵など主観的な概念を辞書を使って単語に落とし込み、それを使って検索を行うことができる。


(間違い等あればコメントよろしくお願いいたします。)

Youtubeの世界各国のトレンドをPythonで取得

Youtube Data APIを使って、世界各国のトレンドを見てみる。
Youtube Data APIの使い方は以下の記事にまとめてある。
chindafalldesu.hatenablog.com


・方針
https://www.googleapis.com/youtube/v3/videos? に続けて、欲しい動画に合わせてパラメータを指定する。chartパラメータにmostPopularを指定し、regionCodeパラメータに国名コードを指定すれば、好きな国のトレンドを取得できる。
ISO 3166-1 - Wikipedia


ソースコード

import requests
import time
country='(国名コード JPとか)'
apikey='(Youtube Data api のキー)'
url='https://www.googleapis.com/youtube/v3/videos?part=snippet,id&chart=mostPopular&regionCode='+country+'&maxResults=3&key='+apikey

response = requests.get(url)

for i in range(3):
    print("[https://www.youtube.com/watch?v="+response.json()['items'][i]['id']+':embed:cite]')
    # print(response.json()['items'][i]['snippet']['title'])



世界各国のトレンドTOP3を取得していこう!
はてなブログにそのままリンクが張れるようにソースコードを編集している。実際に使う場合はその部分を適宜変更してほしい。



(2020/02/09時点のトレンド)
①日本
> python .\trend.py
www.youtube.com
www.youtube.com
www.youtube.com


②インド
> python .\trend.py
www.youtube.com
www.youtube.com
www.youtube.com

③マレーシア
> python .\trend.py
www.youtube.com
www.youtube.com
www.youtube.com


④フランス
> python .\trend.py
www.youtube.com
www.youtube.com
www.youtube.com


⑤ブラジル
> python .\trend.py
www.youtube.com
www.youtube.com
www.youtube.com


⑥スペイン
> python .\trend.py
www.youtube.com
www.youtube.com
www.youtube.com


それぞれの国の特色が表れていて面白い。


(間違い等あればコメントよろしくお願いいたします。)

Pythonを使って虫眼鏡さん編集の動画を探し出してみた

東海オンエアの動画から虫眼鏡さん編集の動画だけを集めたかったので、PythonYoutube Data APIを使ってその動画を探し出してみた。
Youtube Data APIの使い方は下記の記事にまとめてある。
chindafalldesu.hatenablog.com


直近150作品から探した。
チャンネルidから全動画のidを取得し、そのidから動画の概要欄を取得。その概要欄から '編集:虫眼鏡' を探す。

ソースコード

import requests
import time
channelid='UCutJqz56653xV2wwSvut_hQ'
apikey='(Youtube Data api のキー)'
url = 'https://www.googleapis.com/youtube/v3/search?key='+apikey+'&channelId='+channelid+'&part=snippet,id&order=date&maxResults=50'
num=1

response = requests.get(url)

for i in range(50):
    id=response.json()['items'][i]['id']['videoId']
    vurl = 'https://www.googleapis.com/youtube/v3/videos?id='+id+'&key='+apikey+'&part=snippet,contentDetails,statistics,status'
    vresponse = requests.get(vurl)
    if '編集:虫眼鏡' in vresponse.json()['items'][0]['snippet']['description']:
        print(response.json()['items'][i]['snippet']['title']+'    https://www.youtube.com/watch?v='+id)
        # print("[https://www.youtube.com/watch?v="+id+':embed:cite]')
    num+=1

for j in range(2):
    next=response.json()["nextPageToken"]
    nexturl=url+'&pageToken='+next
    response = requests.get(nexturl)

    for i in range(50):
        id=response.json()['items'][i]['id']['videoId']
        vurl = 'https://www.googleapis.com/youtube/v3/videos?id='+id+'&key='+apikey+'&part=snippet,contentDetails,statistics,status'
        vresponse = requests.get(vurl)
        if '編集:虫眼鏡' in vresponse.json()['items'][0]['snippet']['description']:
            print(response.json()['items'][i]['snippet']['title']+'    https://www.youtube.com/watch?v='+id)
            # print("[https://www.youtube.com/watch?v="+id+':embed:cite]')
            num+=1


(実行結果①)

> python .\makeinu.py
【改名はまさかの…】結局誰が一番球技上手いの? 第1回球技王!【後編】    https://www.youtube.com/watch?v=z9WHIkedhz8
【最下位は改名】結局誰が一番球技上手いの? 第1回球技王!【前編】    https://www.youtube.com/watch?v=CL1iCcXJegw
【大ブランク】3回転んだら即終了スノボ!    https://www.youtube.com/watch?v=w70hKDuZbJk
【運×演技力】相談なしで5人の衣装を揃えて即興コントを演じきれ!    https://www.youtube.com/watch?v=5o6MObM4vTE
【成金集団】東海オンエアの金銭感覚は麻痺していないのか!?    https://www.youtube.com/watch?v=6ggVYzGxNX0
動画撮影中にハプニング発生!?一番スマートな対応ができるのは誰だ!    https://www.youtube.com/watch?v=hkN2-S3z-RQ
【視聴者アンケート】今までの動画の中で「一番の名言」って何?    https://www.youtube.com/watch?v=TytXc_MPhE0
【46道府県旅行の旅!佐賀県編】〜なんだ、楽園はここにあったのか〜    https://www.youtube.com/watch?v=Ij7tLajES1w
 :
 :
【真剣将棋】6人がかりならプロ棋士といい勝負できるのでは?    https://www.youtube.com/watch?v=MoooUslrQDs
【新娯楽】開けられるのは「質問の答えの数字」だけ!東海オンエアビンゴ大会!    https://www.youtube.com/watch?v=zZFja1crjcM
【ご報告】東海オンエア、引っ越します    https://www.youtube.com/watch?v=RAR5ku_he04
【脱六本木】「◯本木」っていう地名、全部コンプリートしたい!!    https://www.youtube.com/watch?v=iABRvpxcmOQ


(実行結果②)はてなブログでそのまま閲覧できるように編集
> python .\makeinu.py
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com
www.youtube.com

pythonでYoutube動画のタイトルと概要欄を取得

YouTube Data API の概要  |  Google Developers
Youtube Data APIを使えば、Youtubeから様々な情報を取得できる。
以下にその例を示した。


Youtubeの動画のidを使って、その動画のタイトルを得る。
ソースコード

import requests
id='z9WHIkedhz8'
apikey='(Youtube Data api のキー)'
url = 'https://www.googleapis.com/youtube/v3/videos?id='+id+'&key='+apikey+'&part=snippet,contentDetails,statistics,status'

response = requests.get(url)
# print(response.json())
print("https://www.youtube.com/watch?v="+response.json()['items'][0]['id'])
print(response.json()['items'][0]['snippet']['title'])

(実行結果)

> python .\title.py
https://www.youtube.com/watch?v=z9WHIkedhz8
【改名はまさかの…】結局誰が一番球技上手いの? 第1回球技王!【後編】


②同様にして概要欄の文章を取得することもできる。
ソースコード

print(response.json()['items'][0]['snippet']['description'])

(実行結果)

> python .\title.py
撮影協力:岡崎市
https://fc.okazaki-kanko.jp/news/94

今回の企画では「球技」とひとくくりにしていろいろなスポーツで遊びましたが、よく考えてみればなんか「球」を使う競技多いですよね。流行ってるんですか?

「スポーツなんだから球使うだろ」「球じゃないとくちゃくちゃになるだろ」とお思いかもしれませんが、本当にそうですか?ラグビーやアメフトは意味わかんない形のボール使ってますし、バドミントンやインディアカも意味わかんない羽根使ってます。でも別にスポーツとして成立してますよね?むしろその形状ならではの特徴的な動きが生まれていていい感じです。
:
:
:
ゆめまる→https://twitter.com/TO_yumemarucas
虫眼鏡→https://twitter.com/TO_ZAWAKUN


③チャンネルidを使って、そのチャンネルの動画のタイトルを得る。
ソースコード

import requests
channelid='UCutJqz56653xV2wwSvut_hQ'
apikey='(Youtube Data api のキー)'
url = 'https://www.googleapis.com/youtube/v3/search?key='+apikey+'&channelId='+channelid+'&part=snippet,id&order=date&maxResults=1'

response = requests.get(url)
# print(response.json())
print("https://www.youtube.com/watch?v="+response.json()['items'][0]['id']['videoId'])
print(response.json()['items'][0]['snippet']['title'])

urlのchannelIdでチャンネルを指定、maxResultsで出力する結果の数を指定。
(実行結果)

> python .\channel.py
https://www.youtube.com/watch?v=vn50D0NEpg4
【りょうやん】みんなの「お前おかしいよ!」っていう5対1を見つけ合おう!!!

そのチャンネルの最新の動画が表示される。


④maxResultsを変えて、タイトルの一覧を表示する。
ソースコード

import requests
channelid='UCutJqz56653xV2wwSvut_hQ'
apikey='(Youtube Data api のキー)'
url = 'https://www.googleapis.com/youtube/v3/search?key='+apikey+'&channelId='+channelid+'&part=snippet,id&order=date&maxResults=50'
num=1

response = requests.get(url)
for i in range(50):
    print(str(num)+'. '+response.json()['items'][i]['snippet']['title'])
    num+=1

(実行結果)

> python .\channel.py
1. 【りょうやん】みんなの「お前おかしいよ!」っていう5対1を見つけ合おう!!!
2. 【改名はまさかの…】結局誰が一番球技上手いの? 第1回球技王!【後編】
3. 【最下位は改名】結局誰が一番球技上手いの? 第1回球技王!【前編】
4. 【46道府県旅行の旅!滋賀県編】〜黄昏の湖、道化師の鎮魂歌〜
:
:
46. 【鍛冶屋】それは無理だろって素材だけで刃物作り対決!!!
47. 【バカ商品】東海オンエアショッピングへようこそ!!!!
48. 1日全力で努力したらどれだけの数のYouTuberとコラボできるの!?
49. 野球の道具を野球以外に使って新競技を考えてみよう!
50. 【猛火】1000円以内で自分の財布を「防火仕様」にしよう!


⑤51以上の動画のタイトルを表示する。
maxResultsは50までしか指定できないので、複数回リクエストを送る。

import requests
channelid='UCutJqz56653xV2wwSvut_hQ'
apikey='(Youtube Data api のキー)'
url = 'https://www.googleapis.com/youtube/v3/search?key='+apikey+'&channelId='+channelid+'&part=snippet,id&order=date&maxResults=50'
num=1

response = requests.get(url)
for i in range(50):
    print(str(num)+'. '+response.json()['items'][i]['snippet']['title'])
    num+=1

for j in range(4):
    next=response.json()["nextPageToken"]
    nexturl=url+'&pageToken='+next
    response = requests.get(nexturl)
    for i in range(50):
        print(str(num)+'. '+response.json()['items'][i]['snippet']['title'])
        num+=1

(実行結果)

> python .\channel.py
1. 【りょうやん】みんなの「お前おかしいよ!」っていう5対1を見つけ合おう!!!
2. 【改名はまさかの…】結局誰が一番球技上手いの? 第1回球技王!【後編】
3. 【最下位は改名】結局誰が一番球技上手いの? 第1回球技王!【前編】
4. 【46道府県旅行の旅!滋賀県編】〜黄昏の湖、道化師の鎮魂歌〜
5. 【超難問】これなんの粉末でしょうクイズでブチギレ必至!!!
6. 【大ブランク】3回転んだら即終了スノボ!
7. 「こんな素材、編集でどうやって使うねん!!」→使います。
8. 【答えは実物で】第一回!現物大喜利!!!!!!
9. 【家庭事情×作品】自宅にある物だけでジオラマ作り対決!!!
10. 【失礼】プロフェッショナルのスゴ業をそんな事に使うな!!選手権
11. 【穴を制せ】負けたらピアスの対決!!穴王!!!
12. 【運×演技力】相談なしで5人の衣装を揃えて即興コントを演じきれ!
:
:
244. 【過去最悪】全味覚の世界最強を全て混ぜたら本当に死にかけた
245. 【5vs1クイズ対決】虫眼鏡ってさぁ、本当に頭いいの?
246. 【20種以上のフレーバー】俺たちがドクターペッパーを超えたドリンクを作ってやるよ!確かにそう意気込んでいた・・・     
247. 手作りバットで一番遠くにボール飛ばせた奴が勝ち対決!!
248. 【水溜りオンエア】おふざけなしのガチ文理ラップ対決!
249. 【サスペンス】リレー方式でドラマを作ったらまさかの結果に!?
250. 【二遊間】もう一度アライバコンビの超絶プレーが見たいんだ・・・【中日ドラゴンズ】


⑥実用例
chindafalldesu.hatenablog.com


参考
YouTube Data API の概要  |  Google Developers

YouTube Data api v3をPythonから使って特定のチャンネルの動画を取得する - Qiita


(間違い等あればコメントよろしくお願いいたします。)