惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

GeekPlux

一代人的博客,一代人的青春注脚 那些年我打过的日结工 来美国的两年后 2023 一蓑烟雨 在美国拥有一辆 Tesla 的成本 我的 Workspaces 十年进化史 How to Sync Logseq Plugins, Themes and Settings Across Multiple Devices Setting Up Umami as Your Google Analytics Alternative: A Step-by-Step Guide 迁移豆瓣读书记录到 goodreads Enhance Your Internet Privacy in 2023 Refactor your blog comments system with Webmention.io 来美国之后,如何快速安顿下来 Three Levels of Information Perception 疫情三年 与人聊天的美好 我获取信息的方法 2022 版 我是如何学会编程的 Legacy code best practice: how to take over an existing project smoothly 2020 恍如隔世 接外包的一些坑和小技巧 论交友 往返香港隔离指南 即将失明,还能继续做程序员吗 小谈我对新技术的态度 How to use tailwindcss with AMP in a Next.js project 远程工作如何提高效率 复式记账、财报、量化与图论 我为什么从阿里巴巴离职 2019 柳暗花明 投资被动型指数基金正在造成下一次金融泡沫? 三种主流的网赚套利,躺着赚钱? 色盲的世界 我是如何管理 21 张信用卡的 薅羊毛的最大意义:保持对规则的敏感度 来香港的两个月 数据可视化技术实现的关键点 不需要扫描仪,数字化归档自己的文件 如何找到时薪 80 美元的远程工作(二) 如何找到时薪 80 美元的远程工作(一) 如何打造真正的简历 浅思图数据可视化 舍本逐末的学习方式 给想转行作程序员的人泼一盆冷水 算法优化人生之 —— 调度算法 杭州最适合闲来溜达的几条路线 2018 平淡无奇 突闻金庸先生逝世有感 十年博客折腾历史 数据可视化之 Sankey 桑基图的实现 研究生生涯总结 如何在不规则多边形内均匀撒点的算法 Web 前端中的增强现实(AR)开发技术 参加 Google Summer of Code 的体验 netjsongraph.js – Google Summer of Code (GSoC) 2017 summary 如何在 GitHub 上获得数百 stars Markvis - 在 markdown 中生成可视化图表 D3 force layout and WebGL integration 文本数据可视化(下)——一图胜千言 文本数据可视化(上)——从 Wordle 谈起 我获取信息的渠道 数据可视化基础——视觉编码 数据可视化基础——数据模型 数据可视化基础——可视化流程 为什么要用 Emacs Vega-Lite: A Grammar of Interactive Graphics 如何搭建一个私人网盘 如何阅读一篇学术论文 超过十个人的微信群根本没有价值 毕业后的两年 建立索引式的学习方法 为什么我喜欢写代码 写文章的小技巧 为什么文章写得好的人都很厉害 人总要有点盲目的自信 如何管理好自己的密码 Backbone View 之间通信的三种方式 Vim - 适合自己的,才是最好的 轻松玩转 Ukulele 告别社交网络有多难 双拼学习记 CoffeeScript 编码风格指南(译) CoffeeScript 笔记 CSS 最核心的几个概念 响应式设计简易指南(译) 初识 TDD Collapsing margins——合并的外边距 菜鸟级 Mac 配置(二) 菜鸟级 Mac 配置(一) CSS 编写原则 Goodbye,我的大学 如何新建一个 Cocos2d-x 项目 Windows8.1 下 Cocos2d-x 环境搭建 Android 开发如何入门 如何绑定独立域名 写博客就用 FarBox 尝试改变微信公众账号消息的推送方式 情似流水 操作系统总结——存储器管理 操作系统总结——处理机管理 操作系统总结——引论
YouTube 观看历史数据分析
GeekPlux · 2020-01-03 · via GeekPlux

我现在看视频主要集中在 YouTube 和 Bilibili 两个网站。前者的观看体验比后者更胜一筹,基本上一回家我就打开 YouTube 了,即使不看也放着当生活的背景音。

昨晚看到自己订阅的博主有篇新文章——YouTube 观看历史分析,里面对 YouTube 优势的阐述和对视频这种信息获取方式的一些观点简直是和我不谋而合。

但最有意思的是他对自己观看记录进行了数据分析,知道了自己时间具体分配到了哪些频道。我看完几乎是没有丝毫等待,就按他的方法操练起来了。之后在他的基础上,我自己画了个 Wordle(词云),可以清晰的看出自己对某类视频的钟爱……

分析结果可视化

数据的收集、存储、分析,都已经在Yi's Blog提供,按照他的步骤可得到以下结果:

观看时长分布

左图可以清晰的看出从 2017 年开始我在 YouTube 上花费的时间每年翻一倍,2019 年看了接近 3500 个视频……

再看右图,简直可以看出我 2019 年的作息习惯:

  • 每天 20 点基本上就是吃完饭回到家坐在电脑前了
  • 从 20 点到 24 点期间,可能会做一些自己的事,做完才打开 YouTube
  • 0 点到 2 点是我彻底放松的时间,观看 YouTube 时长最长,偶尔会一路熬夜到凌晨 5 点(请大家珍惜生命)

视频时长分布

我看的视频大部分在 20 分钟以内,其实这也和“YouTube 火爆视频都是 5-10 分钟的时长”相符。然后有一部分 40 分钟左右的视频,很明显我这是在看电视剧……

视频关键字可视化

根据你仅仅是在 Google Takeout 里下载了观看历史数据,也可以直接进行我这步的分析,代码附在本文末尾。

紧接着我尝试分析了我 2019 年常看视频的关键词。思路比较简单,从标题中分词,再按关键字生成词云。分词最常用的就是 结巴分词,词云生成我选用了 word_cloud,Python 搞这类数据分析真是吹枯拉朽,简单几行代码即可搞定。

最开始我尝试直接用

tags = jieba.cut(title) # title 就是每个看过的视频标题

发现效果并不好,如下图

不过看这个已经可以看出我对金庸武侠电视剧的钟爱了,因为金庸老先生逝世,所以很多频道在每个视频标题前都加上了【金庸逝世一週年】的字段,于是出现图中的样子。还出现了很多演员的名字,是因为很多频道为了搜索优化,把所有主演的名字写在了标题里。其次像“如何”这类词也无实际意义,需要去掉。“自然”这个词,我看到的时候也愣了一下,按理来说我不在 YouTube 上看这类视频啊,后来反应过来这应该是一个 Up 主的名字被强行分词了。

于是我调整策略,采用基于 TF-IDF 算法的关键词抽取

tags = jieba.analyse.extract_tags(title)

把无意义的词用 stop_words 列表来过滤掉:

jieba.analyse.set_stop_words('./stop_words.txt') # 过滤掉主演、如何、到底、一个、就是、等等这类无意义词

同时,我把频道名算作一个词,在结巴分词时提高它的词频:

for subtitle in history["subtitles"]:
  jieba.add_word(subtitle["name"])
  jieba.suggest_freq(subtitle["name"], True)

最后把一些词微调,也提高它的词频,保证它不被强行切分(比如我钟爱的搞机零距离,和各类武侠片片名等)。

最终版效果图如下:

这里即使我设置了 jieba.del_word('金庸逝世') 也无法将这两个词分开,“粤语中字”也是,不知为何;即使把 TVB 这个单词的词频调高也没法和其他词分开

虽然不完美,但结论显而易见了。

  • 看的最多的就是金庸武侠电视剧,笑傲江湖应该是我看的次数最多的,接下来倚天、射雕、天龙、神雕。说实话我在结果出来之前是没有意识到自己花了这么多时间在不断回看这些片子上……我也搞不懂,为什么即使看了无数遍,我还是看得津津有味
  • 李自然说是讲创业和商业逻辑的,每个视频几乎都看了
  • 分分妹 猎奇的方式解说各种男女电影,适合污污的你

其实这两个词能在词云中凸显出来是因为他们俩每个视频的标题都含有相同关键字。另一方面,虽然从图中看到我好像看的都是电视剧,那是因为电视剧的每个视频名字是重复的,只有集数不同,所以词频高。

常看的 YouTube 频道

接下来还是直接靠统计数据来解答我到底常看哪些频道吧。下表是我观看视频数量最多的 25 个频道。看完后的感想是:

排名频道观看视频数量
1TechLead254
2中国好声音官方频道SING!CHINA Official Channel250
3TVB WuXia Drama 經典武俠頻道224
4优优独播剧场——YoYo Television Series Exclusive132
5Speak English With Vanessa124
6钟文泽120
7ZUOLUOTV98
8李自然说87
9Abed C382
10Spark Liang 张开亮79
11浙江卫视音乐频道 ZJSTV Music Channel78
12李永乐老师75
13分分鐘電影大咖73
14Chaoteng Chang65
15郝给力64
16Maaaxter English62
17China Zone 剧乐部60
18大劇獨播MZTV60
19四季萌芽58
20左手+58
21茒永泰56
22数根朽木55
23CYFIT兆佑52
24美食作家王刚52
25Yale Chen50

下表则是我观看时长最长的 25 个频道,但是由于数据里没有我到底看了视频哪一截的数据,所以这里假定我每个视频都是从头到尾看完的。

  • 排名第一的这个频道 Abed C3,其实是播《笑傲江湖》的……
  • React Conf 我应该是看了很多 Talk,但是不一定每个都看完了,很多讲的没意思就跳出了
排名频道观看时长(小时)
1Abed C363.55
2React Conf54.88
3TechLead48.77
4China Zone 剧乐部47.63
5Speak English With Vanessa41.02
6熱點劇場Hotspot!34.76
7李自然说33.90
8浙江卫视【奔跑吧】官方频道 ZJSTV Keep Running Channel33.47
9经典热播剧场30.30
10浙江卫视音乐频道 ZJSTV Music Channel28.87
11优优经典剧场——YoYo Television Series Classic23.26
12JSConf22.06
13中国好声音官方频道SING!CHINA Official Channel21.10
14钟文泽20.32
15海润影视19.98
16华策影视官方频道 China Huace Film & TV Official Channel16.75
17Google Chrome Developers16.20
18李永乐老师16.15
19数根朽木14.91
20分分鐘電影大咖13.93
21湖南卫视芒果TV官方频道 China HunanTV Official Channel13.26
22ZUOLUOTV13.24
23Baggers12.30
24左手+12.22
25四季萌芽11.98

和刷微信、微博、Twitter、论坛(主要是 V2EX)一样,视频刷多了要自我反省。

我以前写过一篇我获取信息的渠道,但那大部分只写了阅读方面,现在音频(Podcasts)和视频(YouTube)也占了很大比重。YouTube 和 Netflix 良好的沉浸式体验,很容易就把时间偷走了。

如果不是这次分析,我可能没有意识到自己在它们上花了这么多时间,适时的量化自己,真的是很好的自省方式

附:词云可视化代码

import json
import jieba.analyse
from wordcloud import WordCloud

json_file_path = './watch-history.json'

# with open('./stop_words.txt') as f:
#     stopWords = [line.strip() for line in f.readlines()]

def gen_img(texts, words_number):
  data = ' '.join(text for text in texts)
  wc = WordCloud(
      width=1000,
      height=500,
      background_color='white',
      max_words=words_number,
      font_path='/Library/Fonts/STHeiti Light.ttc'
  )
  wc.generate(data)
  wc.to_file('wordle.png')

def extract_words():
  words = []
  with open(json_file_path) as json_file:
    data = json.load(json_file)
    for history in data:
      if 'subtitles' not in history or 'titleUrl' not in history or not history['title'].startswith('Watched ') or not '2019' in history['time']:
        continue

      title = history['title'].replace('Watched ', '')

      for subtitle in history["subtitles"]:
        jieba.add_word(subtitle["name"])
        jieba.suggest_freq(subtitle["name"], True)

      # 这里你可以 jieba.add_word 或 del_word 一些词
      jieba.analyse.set_stop_words('./stop_words.txt')
      tags = jieba.analyse.extract_tags(title)
      # tags = jieba.cut(title)
      # tags = [t for t in tags if t not in stopWords]
      # print(tags)
      words.extend(tags)
  return words

def analyze():
  words = extract_words()
  print('words count: ', len(words))
  gen_img(words, len(words))

analyze()