Skip to content

Instantly share code, notes, and snippets.

@gabrielsanchez
Last active June 7, 2019 01:34
Show Gist options
  • Select an option

  • Save gabrielsanchez/6a49dc14ec6a8e92101134aba331ca53 to your computer and use it in GitHub Desktop.

Select an option

Save gabrielsanchez/6a49dc14ec6a8e92101134aba331ca53 to your computer and use it in GitHub Desktop.
Youtuber Analysis
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Youtuber Analysis",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/gabrielsanchez/6a49dc14ec6a8e92101134aba331ca53/youtube-scraper.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Gvs-L7GrP04G",
"colab_type": "text"
},
"source": [
"# Youtuber Analysis\n",
"\n",
"http://gabrielsanchez.net\n",
"\n",
"In this notebook we will perform an analysis of youtubers. We are interested in answering the following questions:\n",
"\n",
"* What is a user talking about?\n",
"* How similar is a user to another user?\n",
"* What is a video about?\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "W6tCesI-hP7p",
"colab_type": "text"
},
"source": [
"## Import and install necessary libraries"
]
},
{
"cell_type": "code",
"metadata": {
"id": "l-ZZ0G53Pu9E",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 179
},
"outputId": "e6473fd4-0921-4a95-a96d-609610a46fd8"
},
"source": [
"!pip install youtube_transcript_api\n"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting youtube_transcript_api\n",
" Downloading https://files.pythonhosted.org/packages/02/75/4056d5df84c04f5e1a86f8d9e74720f30d9e9e6f47d652328a29081bddac/youtube_transcript_api-0.1.4-py3-none-any.whl\n",
"Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from youtube_transcript_api) (2.21.0)\n",
"Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->youtube_transcript_api) (3.0.4)\n",
"Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->youtube_transcript_api) (2.8)\n",
"Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->youtube_transcript_api) (1.24.3)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->youtube_transcript_api) (2019.3.9)\n",
"Installing collected packages: youtube-transcript-api\n",
"Successfully installed youtube-transcript-api-0.1.4\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "8zre-o2HQBR6",
"colab_type": "code",
"colab": {}
},
"source": [
"import subprocess\n",
"import os\n",
"import urllib.request as urlreq\n",
"import urllib.parse as urlparse\n",
"import json\n",
"import operator\n",
"import matplotlib.pylab as plt\n",
"import matplotlib.pyplot as pyplot\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"from youtube_transcript_api import YouTubeTranscriptApi"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Jc4_VffghUxY",
"colab_type": "text"
},
"source": [
"## Define basic functions for using Youtube API"
]
},
{
"cell_type": "code",
"metadata": {
"id": "n_SGRXBLQE3r",
"colab_type": "code",
"colab": {}
},
"source": [
"titles = []\n",
"videos = {}\n",
"titles_string = \"\"\n",
"key = ''# Add YouTube API Key here\n",
"\n",
"\n",
"def get_channel_id(username):\n",
" data = {}\n",
" data['forUsername'] = username\n",
" data['part'] = 'id'\n",
" data['key'] = key\n",
" requestValues = urlparse.urlencode(data)\n",
" request = \"https://www.googleapis.com/youtube/v3/channels?\" + requestValues\n",
" #print(request)\n",
" string = urlreq.urlopen(request).read().decode('utf-8')\n",
" items = json.loads(string)['items']\n",
" print(items)\n",
" return items[0]['id']\n",
"\n",
"def get_videos(chan_id, pageToken=None):\n",
" data = {}\n",
" data['channelId'] = chan_id\n",
" data['part'] = 'snippet'\n",
" data['key'] = key\n",
" data['maxResults'] = 50\n",
" if pageToken is not None:\n",
" data['pageToken'] = pageToken\n",
" requestValues = urlparse.urlencode(data)\n",
" request = \"https://www.googleapis.com/youtube/v3/search?\" + requestValues\n",
" print(request)\n",
" string = urlreq.urlopen(request).read().decode('utf-8')\n",
" items = json.loads(string)\n",
" #print(items)\n",
" return items\n",
" \n",
"def gather_titles(pageToken=None, username=None, channel=None, count=0):\n",
" if username is not None:\n",
" channel_id = get_channel_id(username)\n",
" elif channel is not None:\n",
" channel_id = channel\n",
" its = get_videos(channel_id, pageToken)\n",
" vids = its['items']\n",
"\n",
" try:\n",
" for vid in vids:\n",
" #titles.append({vid['id']['videoId']: vid['snippet']['title']})\n",
" videos[vid['id']['videoId']] = vid['snippet']['title']\n",
"\n",
" #global titles_string \n",
" #titles_string = \" \".join(titles)\n",
"\n",
" if count <= 20:\n",
" if 'nextPageToken' in its:\n",
" next_token = its['nextPageToken']\n",
" count += 1\n",
" gather_titles(next_token, username, channel, count)\n",
" except:\n",
" pass\n",
"#gather_titles()\n",
"#titles_str"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Iwgi8IprhhIK",
"colab_type": "text"
},
"source": [
"## Create a list of words we want to ignore / match"
]
},
{
"cell_type": "code",
"metadata": {
"id": "mec2ThpeQHzK",
"colab_type": "code",
"colab": {}
},
"source": [
"# may want to use nltk word lists here....\n",
"ignore_words = ['','-','|','there','[',']','&amp;','here','know','been','we','now','quiz','actually','more','feel','like','this','those','things','question','similar','no','talk','dr.','Burke','wanted','video','answer','times','people','want','all','identical','cause','an','same','because','do','hey','guys','okay',\"they're\",'were',\"I'm\",'on',\"it's\",'when',\"that's\",'they','about','was','at','also','come','by','you','that','and','to','I','the','of','but','a','it','for','is','this','not',\"you're\",'if','my','have','got',\"don't\",'in','what',\"we're\",'much','[Music]','just','two','lot',\"we've\",'lots','had',\"I've\",'seen','or',\"who's\",'yeah','your','from','using','so','as','would','be','oh','how','does','me','get','are','going','with',\"there's\"]\n",
"match_words = ['bass', 'lesson']\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "WNR5ryhJhmW9",
"colab_type": "text"
},
"source": [
"## Write some general functions that we will use"
]
},
{
"cell_type": "code",
"metadata": {
"id": "nxzJVkTfQTYe",
"colab_type": "code",
"colab": {}
},
"source": [
"# function to get word frequencies\n",
"def get_word_freq(tc, ignore_words=ignore_words):\n",
" word_freq = {}\n",
" relevant = {}\n",
" for i in range(len(tc)):\n",
" words = tc[i]['text'].split(\" \")\n",
" for j in range(len(words)):\n",
" if words[j] not in ignore_words:\n",
" if words[j] in word_freq:\n",
" word_freq[words[j]] += 1\n",
" else:\n",
" word_freq[words[j]] = 1\n",
" if words[j] in match_words:\n",
" if words[j] in relevant:\n",
" relevant[words[j]] += 1\n",
" else:\n",
" relevant[words[j]] = 1\n",
" return word_freq, relevant\n",
"\n",
"# function to get word frequencies\n",
"def get_title_freq(tc, ignore_words=ignore_words):\n",
" word_freq = {}\n",
" words = tc.split(\" \")\n",
" for j in range(len(words)):\n",
" word = words[j].lower()\n",
" if word not in ignore_words:\n",
" if word in word_freq:\n",
" word_freq[word] += 1\n",
" else:\n",
" word_freq[word] = 1\n",
" return word_freq\n",
"\n",
"# Plot\n",
"def plot_freqs(sorted_w):\n",
" pyplot.axis(\"equal\")\n",
" pyplot.pie([v[1] for v in sorted_w[:15]], labels=[k[0] for k in sorted_w[:15]], autopct=None)\n",
" pyplot.show()\n",
" \n",
"# get word frequencies and sort\n",
"def sort_by_freq(word_freq):\n",
" sorted_w = sorted(word_freq[0].items(), key=operator.itemgetter(1), reverse=True)\n",
" return sorted_w\n",
"\n",
"def calc_score(relevance):\n",
" score = 0\n",
" for val in range(len(relevance)):\n",
" score += relevance[val][1] * scores[val]\n",
" return score\n",
"\n",
"def get_relevance(word_freq):\n",
" relevance = sorted(word_freq[1].items(), key=operator.itemgetter(1), reverse=True)\n",
" return relevance\n",
"\n",
"def get_relevant_videos(videos=videos):\n",
" relevant = set()\n",
" for key, value in videos.items():\n",
" for n in range(len(match_words)):\n",
" if match_words[n] in value.lower():\n",
" relevant.add(key)\n",
" return relevant\n",
"\n",
"def get_freqs_from_title(videos=videos):\n",
" freqs = {}\n",
" for key, value in videos.items():\n",
" for n in value.split(' '):\n",
" if n.lower() not in freqs:\n",
" freqs[n.lower()] = 1\n",
" else:\n",
" freqs[n.lower()] += 1\n",
" return freqs\n",
"\n",
"def clean_dict(freq_dict):\n",
" clean_dict = {}\n",
" for key, value in freq_dict.items():\n",
" if key not in ignore_words:\n",
" clean_dict[key] = value\n",
" return clean_dict"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "5WacsfoUSCgh",
"colab_type": "text"
},
"source": [
"## Get videos matching what we are looking for"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Nu_6ItX7Ql6_",
"colab_type": "code",
"outputId": "8f13a379-b8f9-448a-a275-4d2258bfd09c",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 125
}
},
"source": [
"videos = {}\n",
"gather_titles(username=\"jplanejazz\")\n",
"relevant = get_relevant_videos(videos)"
],
"execution_count": 77,
"outputs": [
{
"output_type": "stream",
"text": [
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/d274pnplqp5iHf5d2NIpZTP0klI\"', 'id': 'UCa4vix6IlddM8R6KcQ6GDdQ'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCa4vix6IlddM8R6KcQ6GDdQ&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/d274pnplqp5iHf5d2NIpZTP0klI\"', 'id': 'UCa4vix6IlddM8R6KcQ6GDdQ'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCa4vix6IlddM8R6KcQ6GDdQ&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CDIQAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/d274pnplqp5iHf5d2NIpZTP0klI\"', 'id': 'UCa4vix6IlddM8R6KcQ6GDdQ'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCa4vix6IlddM8R6KcQ6GDdQ&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CGQQAA\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2Aa7P_2MR6l-",
"colab_type": "text"
},
"source": [
"## List all videos with their ID"
]
},
{
"cell_type": "code",
"metadata": {
"id": "rl9KYPiaRvUz",
"colab_type": "code",
"outputId": "454f999d-5ec3-4bfd-835b-c5762b5f11d9",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 2645
}
},
"source": [
"videos"
],
"execution_count": 78,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'-2wTiiR8Nuk': 'How to Play Walking Bass Lines - Jazz Bass Lesson - Part 5',\n",
" '-aKeQ9A0yFE': 'Dexter Gordon&#39;s &quot;Blue Bossa&quot; Solo Transcription - September 25, 2011',\n",
" '-sCub4TISoE': 'How to Play Walking Bass Lines - Jazz Bass Lesson - Part 3',\n",
" '-tC7TMevQFY': '&quot;Black Orpheus&quot; - Bossa Bass Demonstration',\n",
" '08kT1cFBTIE': 'Constructing Chords: Part 3 - &quot;Tensions/Extensions&quot;',\n",
" '1jVZ-RDPYsQ': '&quot;Recorda-Me&quot; - Bossa Bass Demonstration',\n",
" '2FYoIh-5WBQ': 'Red Hot Chili Peppers - &quot;Soul To Squeeze&quot; Bass Cover',\n",
" '3PhSUSyEQr8': 'The Major Modes Series: Part 7 - The Aeolian Mode',\n",
" '3fiHmQLkpM8': 'How to Play Walking Bass Lines - Jazz Bass Lesson - Final Lesson',\n",
" '4tbIGjEiTEo': '&quot;Autumn Leaves&quot; Improvisation - July 2, 2017',\n",
" '56IGaCy16hg': '&quot;Solar&quot; Double Bass Improvisation - May 30, 2015',\n",
" '6GZ5QQKD3NU': '&quot;Portrait of Tracy&quot; by Jaco Pastorius - May 31, 2012',\n",
" '6R4Ncy33dck': '&quot;Blue Monk&quot; Improvisation - January 4, 2017',\n",
" '6iTUcSh8LK8': 'How to Play Walking Bass Lines - Jazz Bass Lesson - Part 6',\n",
" '7hIPvosBq88': '&quot;Take The &#39;A&#39; Train&quot; - Walking Bass Demonstration',\n",
" '7hTy-FDPVC4': '&quot;All The Things You Are&quot; Improvisation - March 21, 2015',\n",
" '7r9fTCFg6Js': 'Walking Jazz Standards #6: &quot;Giant Steps&quot; - Bass Guitar Lesson',\n",
" '7zlKb41DkpQ': 'How to Play Bossa Nova Bass Lines: &quot;How Insensitive&quot;',\n",
" '8Vl1atNuvSI': '&quot;Misty&quot; Improvisation - March 12, 2017',\n",
" '8ZOZTF7oxEk': '&quot;How High The Moon&quot; - Walking Bass Demonstration',\n",
" '8b0IcwNws80': '&quot;My Little Boat&quot; - Bossa Bass Demonstration',\n",
" '8cmR0IhDe48': 'Building Bossa Basslines #3: &quot;Recorda-Me&quot; - Double Bass Lesson',\n",
" '8ppwz-67Iwk': 'Introduction to Improvisation: Soloing Over Static Chords (Part 2 of 3)',\n",
" '9bGDBm1boD4': 'Technical Exercises: Lesson 1 - Bass Guitar Lesson',\n",
" 'A6XwvWBLQtI': '&quot;Autumn Leaves&quot; - Walking Bass Demonstration',\n",
" 'ARmv6F_o80g': 'How to Play The Major Pentatonic Scale - Bass Guitar Lesson',\n",
" 'AahBTCyhRG0': '&quot;Beatrice&quot; Improvisation - February 7, 2015',\n",
" 'BMFXsVaat5o': 'Bach Cello Suite No. 1 in G Major - Full Suite',\n",
" 'BOlN2Zf84_I': '&quot;Recorda-Me&quot; Improvisation - October 7, 2017',\n",
" 'C5-NguC-R04': 'Cool Bass Lick #2 - Bass Guitar Lesson',\n",
" 'C53rIehh938': 'Walking Jazz Standards #10: &quot;Evidence&quot; - Bass Guitar Lesson',\n",
" 'CQN4QpKxpT4': 'How To Use A Metronome',\n",
" 'Cn_HuApkJW4': 'The Major Modes Series: Part 6 - The Mixolydian Mode',\n",
" 'CyQkt8HW0MU': '&quot;Bag&#39;s Groove&quot; Improvisation - March 12, 2017',\n",
" 'DALVBYUc4wA': 'Building Bossa Basslines #2: &quot;The Girl From Ipanema&quot; - Bass Guitar Lesson',\n",
" 'DzsiKVeKmZI': '&quot;All The Things You Are&quot; - Walking Bass Demonstration',\n",
" 'E31cmzpjbjw': 'Dexter Gordon&#39;s &quot;Cheesecake&quot; Solo Transcription - September 27, 2011',\n",
" 'EcibhpDnNEM': 'Walking the Traditional Blues - Bass Guitar Lesson',\n",
" 'Em2GWHfi5F0': 'Walking Jazz Standards #5: &quot;All The Things You Are&quot; - Bass Guitar Lesson',\n",
" 'FcHz8m8eEXA': 'How to Practise Scales - Part 1 of 3',\n",
" 'G4dO6zEUdtM': 'Recommended Listening',\n",
" 'GJ-lM5uSgJg': 'How To Improvise Using Guide Tones - Bass Guitar Lesson',\n",
" 'GX7cV8bSYec': 'The Major Modes Series: Part 2 - The Ionian Mode',\n",
" 'H6g_IAI6F4I': 'Dream Theater - &quot;Sacrificed Sons&quot; [Bass Cover]',\n",
" 'HXXbaV7J8_E': '&quot;Maiden Voyage&quot; Improvisation - October 31, 2015',\n",
" 'HrGh1DELOgk': 'Walking The Blues Mini Series: &quot;The Traditional Blues&quot;',\n",
" 'Htz83WSS0_o': 'Walking Jazz Standards #14: &quot;There Will Never Be Another You&quot; - Bass Guitar Lesson',\n",
" 'IeeO44SvWbk': 'Walking Jazz Standards #1: &quot;Autumn Leaves&quot; - Bass Guitar Lesson',\n",
" 'IrIwm_9y-6g': 'Cool Bass Licks #4 - &quot;Autumn Leaves&quot; Major and minor 2-5-1 lick - Bass Guitar Lesson',\n",
" 'J-Gm-2ZTSfA': 'Walking The Blues Mini Series: &quot;The Jazz Blues&quot;',\n",
" 'JQ6g6nIkrUE': 'The 12 Major Scales: Bass Guitar Lesson',\n",
" 'K1Hb6syMFgw': 'How to Play Walking Bass Lines - Jazz Bass Lesson - Part 2',\n",
" 'KHQPiwwCqhg': 'Constructing Chords: Part 2 - &quot;Tetrachords&quot;',\n",
" 'KplxYpULOYc': '&quot;Billie&#39;s Bounce&quot;: Jazz Improvisation - May 23, 2012',\n",
" 'LSdi-Ubnlbc': 'Walking Jazz Standards #3: &quot;Stella By Starlight&quot; - Bass Guitar Lesson',\n",
" 'LlrlYJO5lwQ': '&quot;Stella By Starlight&quot; - Walking Bass Demonstration',\n",
" 'LrZN9nL5o5I': '&quot;Giant Steps&quot; Improvisation - October 22, 2017',\n",
" 'LvAulL4Yt5I': 'Walking Jazz Standards #9: &quot;Have You Met Miss Jones?&quot; - Bass Guitar Lesson',\n",
" 'M6E5rWKw_oQ': 'The Major Modes Series: Part 3 - The Dorian Mode',\n",
" 'NCa2eXZk9lw': 'Beginner&#39;s Guide to Improvisation - Part 1',\n",
" 'NeiV1wK2_BM': 'How to Play Rhythm Changes - Part 2 - &quot;B&quot; Sections',\n",
" 'Np185ut5pQs': '&quot;Cantaloupe Island&quot; Improvisation - October 31, 2015',\n",
" 'OfiSMsJM6y0': '&quot;Blue Bossa&quot; Bass Lines - March 24, 2012',\n",
" 'OtRGLDBqYac': 'Walking Bass Lines: Parker Blues in F - May 23, 2012',\n",
" 'PYXkAhcwmbI': 'Cool Bass Lick #3 - Bass Guitar Lesson',\n",
" 'PzzS6QGd7Q8': 'Introduction to Improvisation: Soloing Over Static Chords (Part 1 of 3)',\n",
" 'Q482X0rSTCc': '&quot;Have You Met Miss Jones?&quot; Improvisation (Take 1) - August 1, 2015',\n",
" 'Q52f7mXB4Jc': '&quot;Joy Spring&quot; - Walking Bass Demonstration',\n",
" 'QjGCUUXPb3Y': 'Walking The Blues Mini Series: &quot;The Minor Blues&quot;',\n",
" 'QoZhEcFbRVI': '&quot;Lady Bird&quot; - Walking Bass Demonstration',\n",
" 'RyyCPqrpQh0': 'Jazz Improvisation: Soloing Over a Bb Blues',\n",
" 'SX46l5nM2x4': '&quot;Four&quot; Improvisation - December 6, 2015',\n",
" 'Su1EW-sc4UQ': '&quot;The Saga Of Harrison Crabfeathers&quot; Improvisation - March 18, 2017',\n",
" 'TkPMSRgsuc4': 'How to solo over a Bb Blues - Jazz Bass Lesson',\n",
" 'TsbD9TiqGkY': 'The 12 Minor Scales: Bass Guitar Lesson',\n",
" 'U_Gk0n-QkCg': 'Walking Jazz Standards #2: &quot;I Love You&quot; - Bass Guitar Lesson',\n",
" 'UbvZplJczC8': 'Jazz Improvisation: Soloing Over a Minor ii-V-i Progression',\n",
" 'UzKOlielPUk': 'Walking Jazz Standards #16: &quot;Joy Spring&quot; - Bass Guitar Lesson',\n",
" 'UzYraYw5-0A': 'Building Bossa Basslines #4: &quot;My Little Boat&quot; - Bass Guitar Lesson',\n",
" 'VGWduvkF7So': '&quot;There Will Never Be Another You&quot; - Walking Bass Demonstration',\n",
" 'VRWMHsiYpVw': 'Constructing Chords: Part 1 - &quot;Triads&quot;',\n",
" 'Vc12N8OwCm4': '&quot;Mr PC&quot; Improvisation - January 4, 2017',\n",
" 'WCR1hxJShJw': '&quot;On Green Dolphin Street&quot; Improvisation - March 7, 2015',\n",
" 'WE0xGVa60CM': 'Constructing Major Scales - Whiteboard Lesson #1',\n",
" 'WMTam1-POqo': 'Building Technique with Major and Minor Scale Shapes',\n",
" 'X4wm9zIAp8s': '&quot;But Not For Me&quot; Improvisation - July 16, 2017',\n",
" 'X9lOmJWFjZc': '&quot;Yardbird Suite&quot; - Walking Bass Demonstration',\n",
" 'XmsEF16zgBM': 'Introduction to the Major Modes - Bass Guitar Lesson',\n",
" 'Y0Ke9a0k58U': '&quot;500 Miles High&quot; Improvisation - December 6, 2015',\n",
" 'YQOdrVLacwk': '&quot;Solar&quot; - Walking Bass Demonstration',\n",
" 'Yv-y-AW4GTA': '&quot;Black Nile&quot; Improvisation Take 2 - March 6, 2016',\n",
" 'Z--uTCzZrIw': 'Walking Jazz Standards #12: &quot;Out Of Nowhere&quot; - Bass Guitar Lesson',\n",
" 'ZT7oUg3WzxQ': '&quot;Watermelon Man&quot; Improvisation - October 31, 2015',\n",
" '_2lQN0qUENY': 'How to Play Walking Bass Lines - Jazz Bass Lesson - Introductory Lesson',\n",
" '_QwN2vfJaNk': 'Introduction to Improvisation: The Bb Blues - Bass Guitar Lesson',\n",
" '_g2_nfpeof0': '&quot;Oleo&quot;: Jazz Improvisation - October 17, 2011',\n",
" '_lW9rhEwedQ': '&quot;Blues For Alice&quot; Improvisation - January 4, 2017',\n",
" 'aLMWS18dWPw': '&quot;Blue Bossa&quot; Double Bass Improvisation - May 2, 2015',\n",
" 'aadR0W1Ht6w': 'The BEST way to improve at soloing! - Jazz Bass Lesson',\n",
" 'bMIfe5ChCmI': '&quot;Beautiful Love&quot; - Walking Bass Demonstration',\n",
" 'bMcpj5krCBA': 'Walking Bass Demonstration: Rhythm Changes',\n",
" 'bv5P4e6VuBc': '&quot;Black Nile&quot; Improvisation Take 1 - March 6, 2016',\n",
" 'cP9nYb7tpN8': 'How to Play Bossa Nova Bass Lines: Bass Guitar Lesson',\n",
" 'cQlzIxd9csk': 'Introduction to Improvisation: Guide Tones - Bass Guitar Lesson',\n",
" 'd10Nyh0l3gg': '&quot;Have You Met Miss Jones?&quot; Improvisation (Take 2) - August 1, 2015',\n",
" 'en0CSxCRQk0': 'Technical Workouts #1: 251s in all 12 Keys - Bass Guitar Lesson',\n",
" 'fNKLwbHytZE': '&quot;Wave&quot; Improvisation - March 7, 2015',\n",
" 'ff36GEhB188': 'Walking Jazz Standards #4: &quot;Beautiful Love&quot; - Bass Guitar Lesson',\n",
" 'fwm5bigeVWc': '&quot;Evidence&quot; - Walking Bass Demonstration',\n",
" 'fy75d1iHQQs': '&quot;Have You Met Miss Jones?&quot; - Walking Bass Demonstration',\n",
" 'g3DTE7OxsAE': 'Introduction to Improvisation: Connecting Chords Using Scales - Bass Guitar Lesson',\n",
" 'gE7QBjlvI-o': '&quot;Girl From Ipanema&quot; - Bossa Bass Demonstration',\n",
" 'hHhM9Y4s9RQ': 'Jazz Improvisation: Soloing Over a ii-V-I Progression',\n",
" 'hO5cNvGSfh4': 'An Overview of Walking Bass Techniques',\n",
" 'iNDk5GZwU9k': 'Cool Bass Lick #1 - Bass Guitar Lesson',\n",
" 'jsLUs2eUWyU': '&quot;The Days Of Wine And Roses&quot; Improvisation - January 7, 2017',\n",
" 'kRbO-gRRpkg': '&quot;Softly, As In A Morning Sunrise&quot; Improvisation - January 22, 2017',\n",
" 'kzy7cx7YxXY': 'The 12 Major Triads: Bass Guitar Lesson',\n",
" 'lg4SenlnH-4': 'How to Play The Minor Pentatonic Scale: Bass Guitar Lesson',\n",
" 'mK0bwr33RNI': '&quot;Solar&quot;: Jazz Improvisation - August 30, 2011',\n",
" 'n8Q_Tgd3iNA': 'Technical Workouts #1 - Walking Major 251s in All 12 Keys Demonstration',\n",
" 'ng0HyiQrk-I': 'Walking Jazz Standards #13: &quot;Take The &#39;A&#39; Train&quot; - Bass Guitar Lesson',\n",
" 'o00sVglB1pA': '&quot;Bright Size Life&quot; Improvisation - October 22, 2017',\n",
" 'og9b3Mkmte0': 'Learn From The Masters #1 - The 2-Feel - Sam Jones Transcription',\n",
" 'owx0NwLLTQQ': '&quot;Out Of Nowhere&quot; - An Analytical Bass Line',\n",
" 'pO9ezW6n7WY': 'How to Play Rhythm Changes - Part 1 - &quot;A&quot; Sections',\n",
" 'pQkFTg8zZPQ': 'Walking Jazz Standards #11: &quot;Yardbird Suite&quot; - Bass Guitar Lesson',\n",
" 'pp18wO5zlqc': 'Walking Jazz Standards #15: &quot;How High The Moon&quot; - Bass Guitar Lesson',\n",
" 'pvr_8nf-XfI': 'Introduction to Improvisation: The Bb Major Scale - Bass Guitar Lesson',\n",
" 'q1PycCvB7yE': 'How to Play The Blues Scale: Bass Guitar Lesson',\n",
" 'tGOaeoPH-qQ': '&quot;So What?&quot; - Bass Guitar Improvisation',\n",
" 'tXaPSe1mTbs': 'The Major Modes Series: Part 8 - The Locrian Mode',\n",
" 'teIpVz_B-j8': '&quot;Oleo&quot; Improvisation - March 7, 2016',\n",
" 'ttDuMoYc5p4': 'Walking Jazz Standards #8: &quot;Lady Bird&quot; - Bass Guitar Lesson',\n",
" 'uIyrEpkBZvM': 'Walking Jazz Standards #7: &quot;Solar&quot; - Double Bass Lesson',\n",
" 'uUUeNR_Ar6s': '&quot;Windows&quot; Improvisation - October 7, 2017',\n",
" 'v_78RQ6l22o': 'How to Practise Scales - Part 3 of 3',\n",
" 'w9OvZIXA0Uc': 'How to Play Walking Bass Lines - Jazz Bass Lesson - Part 7',\n",
" 'w_m1r1WxSAg': '&quot;Giant Steps&quot; - Walking Bass Demonstration',\n",
" 'wyfJZL_RU4A': '&quot;My Foolish Heart&quot; - Bass Guitar Improvisation - November 8, 2014',\n",
" 'xigALOOYFmM': '&quot;Footprints&quot;: Jazz Improvisation - August 13, 2011',\n",
" 'xnC1tEE1o4U': '&quot;Black Orpheus&quot; Improvisation - January 7, 2017',\n",
" 'xsJ5dSt1U1g': 'Building Bossa Basslines #1: &quot;Black Orpheus&quot; - Bass Guitar Lesson',\n",
" 'xu9qrQHT-eY': 'Technical Exercises: Lesson 3 - Bass Guitar Lesson',\n",
" 'yKYUUutTKmA': 'Walking Jazz Standards #17: &quot;Fly Me To The Moon&quot; - Double Bass Lesson',\n",
" 'zVaYNEiP6AI': 'How to Play Rhythm Changes - Part 3 - Hints and Tips'}"
]
},
"metadata": {
"tags": []
},
"execution_count": 78
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "acDeDrfYWgwI",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 287
},
"outputId": "033f9efe-cdff-43ca-dae1-2443f5a5f379"
},
"source": [
"jared = videos\n",
"jared_freqs = get_freqs_from_title(jared)\n",
"jared_dict = clean_dict(jared_freqs)\n",
"sorted(jared_dict.items(), key=operator.itemgetter(1),reverse=True)[:15]"
],
"execution_count": 79,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[('bass', 92),\n",
" ('lesson', 56),\n",
" ('walking', 46),\n",
" ('guitar', 41),\n",
" ('improvisation', 38),\n",
" ('jazz', 34),\n",
" ('demonstration', 19),\n",
" ('part', 19),\n",
" ('standards', 17),\n",
" ('play', 15),\n",
" ('major', 15),\n",
" ('2017', 15),\n",
" ('2015', 13),\n",
" ('bossa', 10),\n",
" ('march', 10)]"
]
},
"metadata": {
"tags": []
},
"execution_count": 79
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_5ZXtKlWhx3R",
"colab_type": "text"
},
"source": [
"## Repeat the process for another user"
]
},
{
"cell_type": "code",
"metadata": {
"id": "XUb24k2aWiT0",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 377
},
"outputId": "804d7264-fb0d-4463-e59a-1e6fd3ba18ff"
},
"source": [
"videos = {}\n",
"gather_titles(username=\"devinebass\")\n",
"relevant = get_relevant_videos(videos)"
],
"execution_count": 44,
"outputs": [
{
"output_type": "stream",
"text": [
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CDIQAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CGQQAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CJYBEAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CMgBEAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CPoBEAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CKwCEAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CN4CEAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CJADEAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/03CYE1r6PXdHpU8wATEu9KoJQcs\"', 'id': 'UCWTj3vCqkQIsrTGSm4kM34g'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCWTj3vCqkQIsrTGSm4kM34g&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CMIDEAA\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "qlCoGFfpWytl",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 287
},
"outputId": "4d682d35-98b9-4664-e901-72ac77ec9df7"
},
"source": [
"scott = videos\n",
"scott_freqs = get_freqs_from_title(scott)\n",
"scott_dict = clean_dict(scott_freqs)\n",
"sorted(scott_dict.items(), key=operator.itemgetter(1),reverse=True)[:15]"
],
"execution_count": 45,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[('bass', 479),\n",
" ('lessons', 158),\n",
" ('///', 156),\n",
" ('scott&#39;s', 137),\n",
" ('scott', 97),\n",
" ('lesson', 87),\n",
" ('devine', 87),\n",
" ('players', 28),\n",
" ('lick', 27),\n",
" ('jazz', 23),\n",
" ('riff', 22),\n",
" ('soloing', 22),\n",
" ('scotts', 21),\n",
" ('one', 20),\n",
" ('why', 18)]"
]
},
"metadata": {
"tags": []
},
"execution_count": 45
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "4w0XQ-v5ZM2c",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 269
},
"outputId": "ba477fa0-7a90-4f5f-9609-cb1b3bb159d7"
},
"source": [
"videos = {}\n",
"gather_titles(username=\"TalkingBassVideo\")\n",
"relevant = get_relevant_videos(videos)"
],
"execution_count": 49,
"outputs": [
{
"output_type": "stream",
"text": [
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/vpyh54jU0vpWSZBuxwPInqAV6Qg\"', 'id': 'UCDfStxwji-22A_bvY280UIg'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCDfStxwji-22A_bvY280UIg&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/vpyh54jU0vpWSZBuxwPInqAV6Qg\"', 'id': 'UCDfStxwji-22A_bvY280UIg'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCDfStxwji-22A_bvY280UIg&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CDIQAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/vpyh54jU0vpWSZBuxwPInqAV6Qg\"', 'id': 'UCDfStxwji-22A_bvY280UIg'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCDfStxwji-22A_bvY280UIg&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CGQQAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/vpyh54jU0vpWSZBuxwPInqAV6Qg\"', 'id': 'UCDfStxwji-22A_bvY280UIg'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCDfStxwji-22A_bvY280UIg&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CJYBEAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/vpyh54jU0vpWSZBuxwPInqAV6Qg\"', 'id': 'UCDfStxwji-22A_bvY280UIg'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCDfStxwji-22A_bvY280UIg&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CMgBEAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/vpyh54jU0vpWSZBuxwPInqAV6Qg\"', 'id': 'UCDfStxwji-22A_bvY280UIg'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCDfStxwji-22A_bvY280UIg&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CPoBEAA\n",
"[{'kind': 'youtube#channel', 'etag': '\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/vpyh54jU0vpWSZBuxwPInqAV6Qg\"', 'id': 'UCDfStxwji-22A_bvY280UIg'}]\n",
"https://www.googleapis.com/youtube/v3/search?channelId=UCDfStxwji-22A_bvY280UIg&part=snippet&key=AIzaSyDvY10JEsZUb9_XIueIFPw2yqvi308nCfw&maxResults=50&pageToken=CKwCEAA\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Db4TTAJTZZII",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 287
},
"outputId": "ae4e3ade-e48a-4bb5-aca6-7fbf88db8520"
},
"source": [
"tb = videos\n",
"tb_freqs = get_freqs_from_title(tb)\n",
"tb_dict = clean_dict(tb_freqs)\n",
"sorted(tb_dict.items(), key=operator.itemgetter(1),reverse=True)[:15]"
],
"execution_count": 50,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[('bass', 237),\n",
" ('guitar', 71),\n",
" ('slap', 32),\n",
" ('play', 27),\n",
" ('lesson', 27),\n",
" ('scale', 21),\n",
" ('music', 19),\n",
" ('chords', 19),\n",
" ('riff', 18),\n",
" ('chord', 16),\n",
" ('simple', 16),\n",
" ('cruise', 16),\n",
" ('top', 15),\n",
" ('riffs', 15),\n",
" ('beginners', 15)]"
]
},
"metadata": {
"tags": []
},
"execution_count": 50
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1aWYwA1kV0M6",
"colab_type": "text"
},
"source": [
"## Cosine Similarity"
]
},
{
"cell_type": "code",
"metadata": {
"id": "DRBE-Y-tVzYV",
"colab_type": "code",
"colab": {}
},
"source": [
"from math import *\n",
"\n",
"\n",
"ratings={'jared': jared_dict, 'scott': scott_dict, 'tb': tb_dict}\n",
"\n",
"\n",
"def square_rooted(x):\n",
" return round(sqrt(sum([a*a for a in x])),3)\n",
"\n",
"def cosine_similarity(x,y):\n",
" input1 = {}\n",
" input2 = {}\n",
" vector2 = []\n",
" vector1 =[]\n",
"\n",
" if len(x) > len(y):\n",
" input1 = x\n",
" input2 = y\n",
" else:\n",
" input1 = y\n",
" input2 = x\n",
"\n",
"\n",
" vector1 = list(input1.values())\n",
"\n",
" for k in input1.keys(): # Normalizing input vectors. \n",
" if k in input2:\n",
" vector2.append(float(input1[k]))\n",
" else :\n",
" vector2.append(float(0))\n",
"\n",
"\n",
" numerator = sum(a*b for a,b in zip(vector2,vector1))\n",
" denominator = square_rooted(vector1)*square_rooted(vector2)\n",
" return round(numerator/float(denominator),3)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "M8Tv2WiJV2bZ",
"colab_type": "code",
"colab": {}
},
"source": [
"jared_sim = [(cosine_similarity(ratings['jared'],ratings['jared'])), (cosine_similarity(ratings['jared'],ratings['scott'])),(cosine_similarity(ratings['jared'],ratings['tb']))]\n",
"scott_sim = [(cosine_similarity(ratings['scott'],ratings['jared'])), (cosine_similarity(ratings['scott'],ratings['scott'])),(cosine_similarity(ratings['scott'],ratings['tb']))]\n",
"tb_sim = [(cosine_similarity(ratings['tb'],ratings['jared'])), (cosine_similarity(ratings['tb'],ratings['scott'])),(cosine_similarity(ratings['tb'],ratings['tb']))]"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ttAcJUYlXJ02",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
},
"outputId": "5505e31c-cd01-475f-f98e-c20fe373b78e"
},
"source": [
"data = [jared_sim, scott_sim, tb_sim]\n",
"headers = ['jared', 'scott','tb']\n",
"df = pd.DataFrame([], columns=headers)\n",
"df.loc['jared'] = jared_sim\n",
"df.loc['scott'] = scott_sim\n",
"df.loc['tb'] = tb_sim\n",
"\n",
"df"
],
"execution_count": 89,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>jared</th>\n",
" <th>scott</th>\n",
" <th>tb</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>jared</th>\n",
" <td>1.000</td>\n",
" <td>0.846</td>\n",
" <td>0.950</td>\n",
" </tr>\n",
" <tr>\n",
" <th>scott</th>\n",
" <td>0.846</td>\n",
" <td>1.000</td>\n",
" <td>0.899</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tb</th>\n",
" <td>0.950</td>\n",
" <td>0.899</td>\n",
" <td>1.000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" jared scott tb\n",
"jared 1.000 0.846 0.950\n",
"scott 0.846 1.000 0.899\n",
"tb 0.950 0.899 1.000"
]
},
"metadata": {
"tags": []
},
"execution_count": 89
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "BvD-DB2LXg2a",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 269
},
"outputId": "2ee8847b-695d-4d60-8aba-6d884293ae79"
},
"source": [
"ax = sns.heatmap(df)\n",
"plt.show()"
],
"execution_count": 90,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FFotY7fMgURB",
"colab_type": "text"
},
"source": [
"## Transcript Analysis"
]
},
{
"cell_type": "code",
"metadata": {
"id": "iiB8q1S-gTVL",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 255
},
"outputId": "51bd610a-c03c-4d12-a48f-a5d1e58688da"
},
"source": [
"tc = YouTubeTranscriptApi.get_transcript(\"NeiV1wK2_BM\")\n",
"word_freq = get_word_freq(tc)\n",
"sorted_w = sort_by_freq(word_freq)[:6]\n",
"plot_freqs(sorted_w)"
],
"execution_count": 91,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAWQAAADuCAYAAAAOR30qAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl8XHW9//HXZyaTSdI00y0ttAVC\nNxqgFChboaUYLC5FfqIo7hEXtlz9qcVLrlcl3gvXIuDvXhdur4hYFqGCIpgooizd2KHLlKZAKQEq\ntLSla/bMfH5/nNNLiA3ZZuZ7ZubzfDzy6PTMmXM+Weadb77ne75fUVWMMca4F3JdgDHGGI8FsjHG\nBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQF\nsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHG\nBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBIQFsjHGBESB\n6wKM6Ze6WAFQDoz1P0YBEbyf4fCpbT/r2sYoATqBLqAN2Aa8AWxtWrSgw0ndxgyAqKrrGozx1MUm\nAsf6H8cAk4BxeAE8ApDeXjq77afb3mT0uF6eVmAn8CZeQB/49wXgWaCxadGCZIo+C2MGzQLZuFEX\nmwy8DziZdwI4NtjD9RHIfWkG1uCF84EPC2mTcRbIJjPqYuOBqm4fR6Ty8EMM5INpBp4C6oH7mhYt\neDmFxzbmoCyQTfrUxU4CPg0sAI5K56nSEMg9NQL3+x9PWOvZpIMFskmtuthRwGfwgnhqpk6bgUDu\n7i2gAfg98OemRQsSGTqvyXEWyGbo6mLjgM/jBfEJLkrIcCB39xrwC+CmpkUL3nJwfpNDLJDN4NXF\njgW+hRfEUZelOAzkAzrwWsw3Ni1asMJhHSaLWSCbgauLnQMsBM5xXcoBAQjk7uLAfwO3NS1asN91\nMSZ7WCBniIj8GqhX1XtSdLw6YL+qXp+K4/WpLhbG65ZYiDdMLVACFsgHbAeuAf7bbkwx/WG3TmcB\nEXF7R2Vd7CN4rb5bCGAYB1g58J/ACxW1DV+oqG2w95t5T/YDkiYi8gURWScia0XkNn/zmSLymIhs\n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\nJuC1+guAt1X1dhHZDXxFREqBElX9k4isAjZ3P1Bv9aTuy5H7LJBNWvgTGP0e+H3j9MoyvFbVWf7H\nDLyWWeCENFkQ6Wxe31lYejzwKl6g/AWor1lctTfD5bwA1IjIr4ANwH/jjQ3vrhpYLN4vkM3ARf72\nLwM3iUgS73M46Gx2qvqgiFQCj4sIwH7gc8AU4Dr/9Z14Qx+HA/eJSBHe9+9bBzlkb/WYfrBhbybj\nGqdXjgLm4t18cjJwElDmtCjvz+k1wFMvTrng0S0T3/dMCi7KDZqIVOD13R47yNeXqup+/3EtcKiq\n/t/UVWjSwQLZONc4vVLwRhTMwrvYcxgw0f/3MGBkik7VDLze7WML8BreBa145cbGwKzKkYJAvhD4\nF7y/gl8Fvqiq6b4T0QyRBbIJvMbplcN4d0iX03eXh+L9mf6/AVy5sXF3Ous0ZqgskI0xJiDsxhBj\njAkIC2TznvxbeHPqbjxjgsoC2aSNf2eXMaaf7A1j+qNARO7AmwPheeALwBXAR4Bi4DG8eRNURB7F\nGz42B7hTRF7Dm7cgAexR1TMd1G9MVrAWsumPg01y8zNVPdkfllXMu+dKKFTVk1T1BuD7wAdUdSZw\nXqYLNyabWCCb/ug5yc0c4H0i8qSIxPHmMzim2/5Luz1eBfxaRL4KZHK9OmOyjgWy6Y+DTXJzI94U\njjPwJmHvPlfF/05eo6qXAt/FGz/8rD+FozHmICyQTX8cLiKz/ccHJrkB2OFPOHNBby8Ukcmq+qSq\nfh/YTo6uNmJMKthFPdMfB5vkZiTehOxbgaff47XXichUvDvrHgLWprlWY7KW3alnjDEBYV0WxhgT\nEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbI\nxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgTEBbIxhgT\nEBbIxhgTEP8fQ8okIt+SIEcAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment