myaun’s blog

年越し前に自分のYouTubeの視聴履歴を解析したよ【Python】

はじめに

今年もあと数週間で終わりますが、1年間の振り返り方は人それぞれ色々あると思います。 本記事では、私が最も使っているサービスであるYouTubeの視聴履歴という楽しげなデータを見つけたので、自分が1年間どんな動画どれだけ視聴したかを確認してみました。

やったこと

  1. YouTubeの視聴履歴データを取得
  2. 視聴履歴の動画タイトルからキーワードを抽出
  3. 各キーワードの期間ごとの遷移を確認

1. YouTubeの視聴履歴データを取得

以下のURLからYouTubeデータのアーカイブをダウンロードできます。(Google関連サービスの色んなデータとれるようですが、今回はYouTubeのみ)
自分のデータをダウンロード: https://takeout.google.com/settings/takeout

ダウンロードしたデータの中にwatch-history.htmlというファイルが含まれており、ブラウザで確認すると↓のようなページです。 f:id:myaun:20181215004351p:plain

今回はこちらのデータを扱いやすいように以下のように整形しました。
HTMLファイルをBeautifulSoupで読み込み、PandasのDataframeにしました。

import pandas as pd
from bs4 import BeautifulSoup

fname = './history/watch-history.html'
f = open(fname, 'r', encoding='utf-8')
text = f.read()

soup = BeautifulSoup(text, 'lxml')
body = soup.find("body")
items = body.find_all( "div", attrs={"class": "outer-cell mdl-cell mdl-cell--12-col mdl-shadow--2dp"} )

rows = []
for item in items:
    divs = item.find("div", attrs={"class": "content-cell mdl-cell mdl-cell--6-col mdl-typography--body-1"})
    tmp = [ i for i in divs ]
    links = divs.find_all("a")
    watchtime = tmp[-1]
    for l in links:
        url = l.get('href')
        if url.find('channel') == -1:
            rows.append( [ watchtime, l.text, url ] )

df = pd.DataFrame( rows, columns=['time', 'title', 'url'] )

f:id:myaun:20181215004228p:plain

各月の視聴動画数

各月の視聴動画数を確認してみました。
全ての動画を最後まで再生しているわけではないものの、多いときは月1000本以上視聴している...1日30本!? f:id:myaun:20181215003722p:plain

2. 視聴履歴の動画タイトルからキーワードを抽出

  • 各動画がどんなものであるかを特定するために、動画タイトルからキーワードを抽出しました。(すでに削除されている動画はタイトルが不明なため取り除いています)
  • キーワード抽出は、形態素解析により固有名詞のみを抽出+Wikipedia記事が存在するもの固有名詞のみを抽出、という方法を行いました。
  • 形態素解析のためにJanome+neologd, Wikipedia記事のみ抽出するためにWikipedia2vecをそれぞれ使いました
from janome.tokenizer import Tokenizer
t = Tokenizer(mmap=True) 

from wikipedia2vec import Wikipedia2Vec
wiki2vec = Wikipedia2Vec.load('./tools/jawiki_20180420_100d.pkl')

def get_entity( text ):
    entityWikipedia = []
    for token in t.tokenize( text ):
        tag = token.part_of_speech.split(',')[1]
        prop = token.part_of_speech.split(',')[2]
        if tag == '固有名詞':
            kEntity = wiki2vec.get_entity( token.base_form )
            if kEntity == None: continue
            entityWikipedia.append( kEntity.title )
    return entityWikipedia

df['keywords_wiki'] = df['title'].apply( get_entity )

f:id:myaun:20181215012907p:plain

3. 各キーワードの期間ごとの遷移を確認

頻出キーワードの出現回数の月ごとの遷移を確認しました。思い出と共に。

ゲーム部門

f:id:myaun:20181215003649p:plain

女性アイドル部門

f:id:myaun:20181215003557p:plain

よく聴いた歌手部門

f:id:myaun:20181215003757p:plain

  • 2018年3月 米津玄師:ハマる。きっかけは忘れた。
  • 2018年10-11月 RIP SLYME:ハマる。小学5,6年以来。最近色々あったけど。

最後に

本記事では、自分のYouTubeの視聴履歴を自然言語処理等により解析しました。 簡単な内容ではありましたが、自分のデータを解析するのは楽しいので超おすすめです! スマホ世代に私たちの自分の振り返り方の1つだな~と思いました。

... 楽しい解析だなーと思って記事を書きましたが、視聴履歴を晒すのって超恥ずかしい。