<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programming Archives - JasonGi</title>
	<atom:link href="https://jasongi.com/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>https://jasongi.com/tag/programming/</link>
	<description>Jason Giancono</description>
	<lastBuildDate>Fri, 26 Jan 2018 05:49:31 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/jasongi.com/wp-content/uploads/2024/03/cropped-jg-2.png?fit=32%2C32&#038;ssl=1</url>
	<title>Programming Archives - JasonGi</title>
	<link>https://jasongi.com/tag/programming/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">56842507</site>	<item>
		<title>100 Toasty Tofu(s) &#8211; Another Triple J Hottest 100 Predictor</title>
		<link>https://jasongi.com/2018/01/20/100-toasty-tofus-another-triple-j-hottest-100-predictor/</link>
					<comments>https://jasongi.com/2018/01/20/100-toasty-tofus-another-triple-j-hottest-100-predictor/#respond</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Sat, 20 Jan 2018 07:53:55 +0000</pubDate>
				<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[hottest 100]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Triple J]]></category>
		<guid isPermaLink="false">http://jasongi.com/?p=2863</guid>

					<description><![CDATA[<p>Update: Think you can do better than my prediction? Prove it by filling out your prediction here: Triple J Hottest 100 Prediction tracker submission. Also, you can look at the leaderboard of predictions over here. 100 Toasty Tofu(s) is another Triple J Hottest 100 Predictor, made for your entertainment with no guarantees what-so-ever. Since 2012, various &#8230; <a href="https://jasongi.com/2018/01/20/100-toasty-tofus-another-triple-j-hottest-100-predictor/" class="more-link">Continue reading<span class="screen-reader-text"> "100 Toasty Tofu(s) &#8211; Another Triple J Hottest 100 Predictor"</span></a></p>
<p>The post <a href="https://jasongi.com/2018/01/20/100-toasty-tofus-another-triple-j-hottest-100-predictor/">100 Toasty Tofu(s) &#8211; Another Triple J Hottest 100 Predictor</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>Update: </strong> Think you can do better than my prediction? Prove it by filling out your prediction here: <a href="https://jasongi.com/100-toasty-tofus-hottest-100-predictor/triple-j-hottest-100-prediction-tracker-submission/">Triple J Hottest 100 Prediction tracker submission.</a> Also, you can look at the leaderboard of predictions over <a href="https://jasongi.com/100-toasty-tofus-hottest-100-predictor/100-toasty-tofus-prediction-leaderboard/">here.</a></p>
<p>100 Toasty Tofu(s) is another <a href="http://www.abc.net.au/triplej/hottest100">Triple J Hottest 100</a> Predictor, made for your entertainment with no guarantees what-so-ever.</p>
<p>Since 2012, various people have been predicting the Hottest 100 using social media scrapes and OCR. This started with <a href="http://warmest100.com.au/2013/index.html">The Warmest 100</a> and was continued by <a href="https://100-warm-tunas.nickwhyte.com/2017/">100 Warm Tunas</a>. I&#8217;ve long thought it&#8217;s an awesome experiment because the conditions are good for using social media as a predictor. Two factors make this a good experiment &#8211; the average person is willing to share their hottest 100 votes and the stakes are so low, unlike political elections, that there aren&#8217;t hoards of true believers/trolls/Russian government agents trying to manipulate public sentiment.</p>
<p>I use <a href="https://github.com/rarcega/instagram-scraper">instagram-scraper</a> to scrape the hashtags (the same as 100 Warm Tunas) and then a python script that uses <a href="https://github.com/tesseract-ocr/tesseract">Tesseract OCR</a> to convert them to text. They are then matched with the <a href="http://www.abc.net.au/triplej/hottest100/17/downloads/how-to-vote/Hottest_100_2017_Song_A-Z.pdf">Triple J song list (PDF)</a> and saved. I removed any duplicate votes I found, that is people who voted for the same songs in the same order when there are greater than 3 songs in the image (a very unlikely occurrence). I figure these are probably the same person uploading the same image twice.</p>
<p>This is an initial cut, there&#8217;s still some extra work to do including:</p>
<ul>
<li>Manually add songs that would be in the hottest 100 to the song list</li>
<li>Tune the OCR, including doing some pre-processing to images if needed</li>
<li>Tune the matching algorithm &#8211; currently using <a href="https://en.wikipedia.org/wiki/Levenshtein_distance">Levenshtein distance</a></li>
<li>Do more analysis on voting combinations (e.g are there factions who vote for particular songs together and what can we learn from this).</li>
<li>Make the table pretty like the other ones.</li>
<li>Make a form for people to upload their own predictions and show a leaderboard as they come in on the 27th.</li>
</ul>
<p>The results are quite different to 100 Warm Tunas &#8211; I seem to be picking up more votes. I&#8217;m not sure if this is due to some sort of filtering I&#8217;m not doing or just algorithm differences, but we will see if 100 Warm Tunas still is the internet&#8217;s most accurate prediction of Triple J&#8217;s Hottest 100 for 2017 on January 27!</p>
<p>This table is updated automatically every few hours.<br />
<strong>Total number of images</strong>: <span id="num-votes">loading&#8230;</span><br />
<strong>Total number of duplicates</strong>: <span id="num-dupes">loading&#8230;</span><br />
<strong>Total number of votes</strong>: <span id="num-individual-votes">loading&#8230;</span></p>
<div style="overflow-x: auto;">
<table>
<tbody id="hottest100table">
<tr class="table-heading">
<th>#</th>
<th>Title</th>
<th>Artist</th>
<th style="padding-right: 8px;">Votes</th>
<th>%</th>
<th style="padding-right: 8px;">Votes Inc dupes</th>
<th>%</th>
</tr>
<tr>
<td>Loading&#8230;</td>
<td>Loading&#8230;</td>
<td>Loading&#8230;</td>
<td>Loading&#8230;</td>
<td>Loading&#8230;</td>
<td>Loading&#8230;</td>
<td>Loading&#8230;</td>
</tr>
</tbody>
</table>
</div>
<p><script type="text/javascript">
    jQuery(document).ready(function () {
        jQuery.getJSON("/static/hottest100results/votes.json", function (data) {
            var votesElement = jQuery('#num-votes'),
                indyVotesElement = jQuery('#num-individual-votes'),
                numVotes = 0,
                numIndyVotes = 0;
            data.forEach(function (list) {
                if (list.length > 0) {
                    numVotes = numVotes + 1;
                }
                numIndyVotes = numIndyVotes + list.length;
            });
            votesElement.text(numVotes);
            indyVotesElement.text(numIndyVotes);
            jQuery.getJSON("/static/hottest100results/dupes.json", function (data) {
                var dupesElement = jQuery('#num-dupes'),
                    numDupes = 0;
                data.forEach(function (list) {
                    if (list.length > 0) {
                        numDupes = numDupes + 1;
                    }
                });
                dupesElement.text(numDupes);
                jQuery.getJSON("/static/hottest100results/songs.json", function (data) {
                    jQuery.getJSON("/static/hottest100results/songs_with_dupes.json", function (dupeData) {
                        var tableBody = jQuery('#hottest100table'),
                            firstRow = jQuery('#hottest100table tr:last');
                        for (var ii = 0; ii < 99; ii++) {
                            firstRow.clone().appendTo('#hottest100table');
                        }
                        for (var ii = 1; ii < 101; ii++) {
                            var songId = data.top100[ii - 1];
                            jQuery('#hottest100table tr:nth-child(' + (ii + 1) + ') td:nth-child(1)').text(ii);
                            jQuery('#hottest100table tr:nth-child(' + (ii + 1) + ') td:nth-child(2)').text(data.songs[songId].name);
                            jQuery('#hottest100table tr:nth-child(' + (ii + 1) + ') td:nth-child(3)').text(data.songs[songId].artist);
                            jQuery('#hottest100table tr:nth-child(' + (ii + 1) + ') td:nth-child(4)').text(data.songs[songId].votes);
                            jQuery('#hottest100table tr:nth-child(' + (ii + 1) + ') td:nth-child(5)').text((data.songs[songId].votes / numVotes * 100).toFixed(2) + '%');
                            jQuery('#hottest100table tr:nth-child(' + (ii + 1) + ') td:nth-child(6)').text((dupeData.songs[songId].votes));
                            jQuery('#hottest100table tr:nth-child(' + (ii + 1) + ') td:nth-child(7)').text((dupeData.songs[songId].votes / (numVotes + numDupes) * 100).toFixed(2) + '%');
                        }
                    });
                });
            });
        });
    });
</script></p>
<p>The post <a href="https://jasongi.com/2018/01/20/100-toasty-tofus-another-triple-j-hottest-100-predictor/">100 Toasty Tofu(s) &#8211; Another Triple J Hottest 100 Predictor</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2018/01/20/100-toasty-tofus-another-triple-j-hottest-100-predictor/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2863</post-id>	</item>
	</channel>
</rss>
