Jekyll2021-09-30T16:04:54-04:00https://sebastiansteffen.github.io/feed.xmlHomeSebastian Steffenssteffen (at) mit (dot) eduTutorial: Latex equations with Kramdown2018-07-12T00:00:00-04:002018-07-12T00:00:00-04:00https://sebastiansteffen.github.io/posts/2012/08/blog-post-1<p>Latex is rendered with the JavaScript display engine ‘MathJax’. Jekyll does this under the hood my using the HTML converter <a href="https://kramdown.gettalong.org/converter/html.html#math-support">Kramdown</a>.<br /> Here is also a relevant <a href="https://stackoverflow.com/questions/26275645/how-to-supported-latex-in-github-pages">StackOver Link</a>.<br /> And here is an example: $$a^2 + b^2 = c^2$$</p>Sebastian Steffenssteffen (at) mit (dot) eduLatex is rendered with the JavaScript display engine ‘MathJax’. Jekyll does this under the hood my using the HTML converter Kramdown. Here is also a relevant StackOver Link. And here is an example: $$a^2 + b^2 = c^2$$MAS.S70 Applied Data Visualizations2017-10-17T00:00:00-04:002017-10-17T00:00:00-04:00https://sebastiansteffen.github.io/posts/2017/10/blog-post-1<head> <title>Machine Learning or ML? - How words enter the public domain </title> <meta charset="utf-8"> <style> /* set the CSS */ body { font: 14px Arial; } p { font-size: "16px"; } path { stroke: steelblue; stroke-width: 2; fill: none; } .axis path, .axis line { fill: none; stroke: grey; stroke-width: 1; shape-rendering: crispEdges; } .legend { font-size: 16px; font-weight: bold; text-anchor: middle; } </style> </head> <body> <div class="page"> <h1>Introduction</h1> <p> For this project I am going to look at how new words enter the common language realm. </p> <h1>Theory</h1> <p> One of the responsibilities of a journalist is to teach his readers. This is not just limited to conveying news, but also includes teaching new vocabulary. This is particularly relevant in the fast-paced realm of technology, where artificial intelligence, the cloud, machine learning, and big data have become significantly more newsworthy as these concepts transform the industry and the process of innovation. But when do these words enter the public realm and vocabulary and become ML and AI? We should expect that journalists initially only use the unabbreviated concept. As the concept starts to enter the public domain, journalists may use both the abbreviation and the full word side by side, until the abbreviation is eventually predominantly used. Let's see if this is true! </p> <h1>Data</h1> <p>I decided to focus on the following words and abbreviations: <ul> <li>Artificial Intelligence, AI, and A.I.</li> <li>Machine Learning, ML, and M.L.</li> <li>Natural Language Processing and NLP</li> <li>Neural Network and Neural Net</li> <li>Generative adversarial network and GANS</li> <li>Recurrent Neural Network, Recurrent Neural Net, RNN, and R.N.N.</li> <li>Application Programming Interface and API</li> <li>Deep Neural Network, Deep Neural Net, Deepmind, and Deep Mind</li> <li>Supervised Machine Learning, Unsupervised Machine Learning, and Reinforcement Learning</li> <li>LSTM, Embedding space</li> <li>Cloud, Big Data, Technology, Automation, Robot, AOL, Cyber Crime</li> </ul> </p> <h1>Methodology</h1> <p> I scraped articles from the Guardian between 1999 and 2017 and count the number of occurences and co-occurences of the se words. The Guardian's online edition was the fifth most widely read in the world in 2014 (<a href = "https://en.wikipedia.org/wiki/The_Guardian">Source</a>) and is thus a reasonable proxy for journalistic activity. </p> <h1>Results</h1> <p> The most interesting results came from AI and ML. According to the 'Journalist Educator Hypothesis' above I expected that the number of occurences of the abbreviations would eventually overtake those of the complete words. However, we observe the opposite! </p> </div> <h2>Timeline for AI versus Artificial Intelligence</h2> <div class="single_viz" id="timeline_ai_c" margin: 0 auto> <svg class="chart" id="svg_timeline_ai_c" width="600" height="300"></svg> </div> <div class="single_viz" id="timeline_ml_c" margin: 0 auto> <h2>Timeline for ML versus Machine Learning</h2> <svg class="chart" id="svg_timeline_ml_c" width="600" height="300"></svg> </div> <div> <p> One explanation may be that the target group changed. Whereas initially these kinds of tech articles may have been directed at the already knowledgeable readers, as these topics became more popular over time, the full word usage became necessary. It may also be indicative of journalists preferring to use the full word as the abbreviation comes as across as more and more 'buzzwordy' as the popularity of the concept rises. </p> <p> Speaking of buzzwords, let's have a look at a couple. </p> </div> <div class="single_viz" id="timeline_other" margin: 0 auto> <h2>Timeline for Buzzwords</h2> <svg class="chart" id="svg_timeline_other" width="600" height="300"></svg> </div> <div> <p> We can see, perhaps surprisingly, that 'Cloud' and 'Big Data' are actually on the downturn, whereas 'automation' and 'robot' have become much more common. If this is at all indicative of company behavior, it implies that there may have been a shift from virtual innovation to physical innovation. </p> <p> Finally, most of the technical terms, like embedding space or the different types of machine learning almost never occur, presumably because the Guardian is a news outlet accessible to a general audience. </p> </div> <div> <p> Just for fun I also tried to look into co-occurences of words, combining the full word with their abbreviations into single categories. We can see that there are actually not that many co-occurences. The most common ones were AI with Robots, AI with Automation, AI with ML, and Big Data with Cloud. </p> </div> <div class="single_viz" id="chord_diagram" margin: 0 auto> <h2>Chord Diagram</h2> <svg class="chart" id="svg_chord_diagram" width="960" height="960"></svg> </div> <script src="https://d3js.org/d3.v4.min.js"></script> <script> // Chord Diagram var matrix = [ [8241,32,319,155,261,2,442,1088], [32,4739,20,23,91,4,6,27], [319,20,1719,42,74,3,60,190], [155,23,42,1272,136,4,81,34], [261,91,74,136,21075,14,70,201], [2,4,3,4,14,363,1,3], [442,6,60,81,70,1,1184,97], [1088,27,190,34,201,3,97,7949] ]; /* var matrix = [ ["cat1","ai","AOL","Automation","Big Data","Cloud","Cyber Crime","ml","Robot"], ["ai",8241,32,319,155,261,2,442,1088], ["AOL",32,4739,20,23,91,4,6,27], ["Automation",319,20,1719,42,74,3,60,190], ["Big Data",155,23,42,1272,136,4,81,34], ["Cloud",261,91,74,136,21075,14,70,201], ["Cyber Crime",2,4,3,4,14,363,1,3], ["ml",442,6,60,81,70,1,1184,97], ["Robot",1088,27,190,34,201,3,97,7949] ]; */ var svg = d3.select("body").select("#svg_chord_diagram"), width = +svg.attr("width"), height = +svg.attr("height"), outerRadius = Math.min(width, height) * 0.5 - 40, innerRadius = outerRadius - 30; var formatValue = d3.formatPrefix(",.0", 1e3); var chord = d3.chord() .padAngle(0.05) .sortSubgroups(d3.descending); var arc = d3.arc() .innerRadius(innerRadius) .outerRadius(outerRadius); var ribbon = d3.ribbon() .radius(innerRadius); var color = d3.scaleOrdinal() .domain(d3.range(4)) .range(["#000000", "#FFDD89", "#957244", "#F26223"]); var g = svg.append("g") .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")") .datum(chord(matrix)); var group = g.append("g") .attr("class", "groups") .selectAll("g") .data(function(chords) { return chords.groups; }) .enter().append("g"); group.append("path") .style("fill", function(d) { return color(d.index); }) .style("stroke", function(d) { return d3.rgb(color(d.index)).darker(); }) .attr("d", arc); var groupTick = group.selectAll(".group-tick") .data(function(d) { return groupTicks(d, 1e3); }) .enter().append("g") .attr("class", "group-tick") .attr("transform", function(d) { return "rotate(" + (d.angle * 180 / Math.PI - 90) + ") translate(" + outerRadius + ",0)"; }); groupTick.append("line") .attr("x2", 6); groupTick .filter(function(d) { return d.value % 5e3 === 0; }) .append("text") .attr("x", 8) .attr("dy", ".35em") .attr("transform", function(d) { return d.angle > Math.PI ? "rotate(180) translate(-16)" : null; }) .style("text-anchor", function(d) { return d.angle > Math.PI ? "end" : null; }) .text(function(d) { return formatValue(d.value); }); g.append("g") .attr("class", "ribbons") .selectAll("path") .data(function(chords) { return chords; }) .enter().append("path") .attr("d", ribbon) .style("fill", function(d) { return color(d.target.index); }) .style("stroke", function(d) { return d3.rgb(color(d.target.index)).darker(); }); // Returns an array of tick angles and values for a given group and step. function groupTicks(d, step) { var k = (d.endAngle - d.startAngle) / d.value; return d3.range(0, d.value, step).map(function(value) { return {value: value, angle: value * k + d.startAngle}; }); } </script> <script> /************* // Time Series *************/ // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph var margin = {top: 30, right: 20, bottom: 70, left: 50}, width = 600 - margin.left - margin.right, height = 300 - margin.top - margin.bottom; // Parse the date / time var parseDate = d3.timeParse("%b %Y"); // Set the ranges var x = d3.scaleLinear().range([0, width]).tickFormat(d3.format("d")); var y = d3.scaleLinear().range([height, 0]); // Define the line var priceline = d3.line() .x(function(d) { return x(d.date); }) .y(function(d) { return y(d.price); }); // Adds the svg canvas var svg1 = d3.select("body").select("div#timeline_ai_c").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // Get the data d3.csv("/files/blog-posts/2017/10/blog-post-1/df.ai.csv", function(error, data) { data.forEach(function(d) { d.date = +d.date; d.price = +d.price; }); // Scale the range of the data x.domain(d3.extent(data, function(d) { return d.date; })); y.domain([0, d3.max(data, function(d) { return d.price; })]); // Nest the entries by symbol var dataNest = d3.nest() .key(function(d) {return d.symbol;}) .entries(data); // set the colour scale var color = d3.scaleOrdinal(d3.schemeCategory10); legendSpace = width/dataNest.length; // spacing for the legend // Loop through each symbol / key dataNest.forEach(function(d,i) { svg1.append("path") .attr("class", "line") .style("stroke", function() { // Add the colours dynamically return d.color = color(d.key); }) .attr("id", 'tag'+d.key.replace(/\s+/g, '')) // assign an ID .attr("d", priceline(d.values)); // Add the Legend svg1.append("text") .attr("x", (legendSpace/2)+i*legendSpace) // space legend .attr("y", height + (margin.bottom/2)+ 5) .attr("class", "legend") // style the legend .style("fill", function() { // Add the colours dynamically return d.color = color(d.key); }) .on("click", function(){ // Determine if current line is visible var active = d.active ? false : true, newOpacity = active ? 0 : 1; // Hide or show the elements based on the ID d3.select("#tag"+d.key.replace(/\s+/g, '')) .transition().duration(100) .style("opacity", newOpacity); // Update whether or not the elements are active d.active = active; }) .text(d.key); }); // Add the X Axis svg1.append("g") .attr("class", "axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)); // Add the Y Axis svg1.append("g") .attr("class", "axis") .call(d3.axisLeft(y)); }); </script> <script> /************* // Time Series *************/ // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph var margin = {top: 30, right: 20, bottom: 70, left: 50}, width = 600 - margin.left - margin.right, height = 300 - margin.top - margin.bottom; // Parse the date / time var parseDate = d3.timeParse("%b %Y"); // Set the ranges var x = d3.scaleLinear().range([0, width]); var y = d3.scaleLinear().range([height, 0]); // Define the line var priceline = d3.line() .x(function(d) { return x(d.date); }) .y(function(d) { return y(d.price); }); // Adds the svg canvas var svg2 = d3.select("body").select("#svg_timeline_ai_p").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // Get the data d3.csv("/files/blog-posts/2017/10/blog-post-1/df.ai.p.csv", function(error, data) { data.forEach(function(d) { d.date = +d.date; d.price = +d.price; }); // Scale the range of the data x.domain(d3.extent(data, function(d) { return d.date; })); y.domain([0, d3.max(data, function(d) { return d.price; })]); // Nest the entries by symbol var dataNest = d3.nest() .key(function(d) {return d.symbol;}) .entries(data); // set the colour scale var color = d3.scaleOrdinal(d3.schemeCategory10); legendSpace = width/dataNest.length; // spacing for the legend // Loop through each symbol / key dataNest.forEach(function(d,i) { svg2.append("path") .attr("class", "line") .style("stroke", function() { // Add the colours dynamically return d.color = color(d.key); }) .attr("id", 'tag'+d.key.replace(/\s+/g, '')) // assign an ID .attr("d", priceline(d.values)); // Add the Legend svg2.append("text") .attr("x", (legendSpace/2)+i*legendSpace) // space legend .attr("y", height + (margin.bottom/2)+ 5) .attr("class", "legend") // style the legend .style("fill", function() { // Add the colours dynamically return d.color = color(d.key); }) .on("click", function(){ // Determine if current line is visible var active = d.active ? false : true, newOpacity = active ? 0 : 1; // Hide or show the elements based on the ID d3.select("#tag"+d.key.replace(/\s+/g, '')) .transition().duration(100) .style("opacity", newOpacity); // Update whether or not the elements are active d.active = active; }) .text(d.key); }); // Add the X Axis svg2.append("g") .attr("class", "axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)); // Add the Y Axis svg2.append("g") .attr("class", "axis") .call(d3.axisLeft(y)); }); </script> <script> /************* // Time Series *************/ // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph var margin = {top: 30, right: 20, bottom: 70, left: 50}, width = 600 - margin.left - margin.right, height = 300 - margin.top - margin.bottom; // Parse the date / time var parseDate = d3.timeParse("%b %Y"); // Set the ranges var x = d3.scaleLinear().range([0, width]); var y = d3.scaleLinear().range([height, 0]); // Define the line var priceline = d3.line() .x(function(d) { return x(d.date); }) .y(function(d) { return y(d.price); }); // Adds the svg canvas var svg3 = d3.select("body").select("#svg_timeline_ml_c").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // Get the data d3.csv("/files/blog-posts/2017/10/blog-post-1/df.ml.csv", function(error, data) { data.forEach(function(d) { d.date = +d.date; d.price = +d.price; }); // Scale the range of the data x.domain(d3.extent(data, function(d) { return d.date; })); y.domain([0, d3.max(data, function(d) { return d.price; })]); // Nest the entries by symbol var dataNest = d3.nest() .key(function(d) {return d.symbol;}) .entries(data); // set the colour scale var color = d3.scaleOrdinal(d3.schemeCategory10); legendSpace = width/dataNest.length; // spacing for the legend // Loop through each symbol / key dataNest.forEach(function(d,i) { svg3.append("path") .attr("class", "line") .style("stroke", function() { // Add the colours dynamically return d.color = color(d.key); }) .attr("id", 'tag'+d.key.replace(/\s+/g, '')) // assign an ID .attr("d", priceline(d.values)); // Add the Legend svg3.append("text") .attr("x", (legendSpace/2)+i*legendSpace) // space legend .attr("y", height + (margin.bottom/2)+ 5) .attr("class", "legend") // style the legend .style("fill", function() { // Add the colours dynamically return d.color = color(d.key); }) .on("click", function(){ // Determine if current line is visible var active = d.active ? false : true, newOpacity = active ? 0 : 1; // Hide or show the elements based on the ID d3.select("#tag"+d.key.replace(/\s+/g, '')) .transition().duration(100) .style("opacity", newOpacity); // Update whether or not the elements are active d.active = active; }) .text(d.key); }); // Add the X Axis svg3.append("g") .attr("class", "axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)); // Add the Y Axis svg3.append("g") .attr("class", "axis") .call(d3.axisLeft(y)); }); </script> <script> /************* // Time Series *************/ // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph var margin = {top: 30, right: 20, bottom: 70, left: 50}, width = 600 - margin.left - margin.right, height = 300 - margin.top - margin.bottom; // Parse the date / time var parseDate = d3.timeParse("%b %Y"); // Set the ranges var x = d3.scaleLinear().range([0, width]); var y = d3.scaleLinear().range([height, 0]); // Define the line var priceline = d3.line() .x(function(d) { return x(d.date); }) .y(function(d) { return y(d.price); }); // Adds the svg canvas var svg4 = d3.select("body").select("#svg_timeline_ml_p").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // Get the data d3.csv("/files/blog-posts/2017/10/blog-post-1/df.ml.p.csv", function(error, data) { data.forEach(function(d) { d.date = +d.date; d.price = +d.price; }); // Scale the range of the data x.domain(d3.extent(data, function(d) { return d.date; })); y.domain([0, d3.max(data, function(d) { return d.price; })]); // Nest the entries by symbol var dataNest = d3.nest() .key(function(d) {return d.symbol;}) .entries(data); // set the colour scale var color = d3.scaleOrdinal(d3.schemeCategory10); legendSpace = width/dataNest.length; // spacing for the legend // Loop through each symbol / key dataNest.forEach(function(d,i) { svg4.append("path") .attr("class", "line") .style("stroke", function() { // Add the colours dynamically return d.color = color(d.key); }) .attr("id", 'tag'+d.key.replace(/\s+/g, '')) // assign an ID .attr("d", priceline(d.values)); // Add the Legend svg4.append("text") .attr("x", (legendSpace/2)+i*legendSpace) // space legend .attr("y", height + (margin.bottom/2)+ 5) .attr("class", "legend") // style the legend .style("fill", function() { // Add the colours dynamically return d.color = color(d.key); }) .on("click", function(){ // Determine if current line is visible var active = d.active ? false : true, newOpacity = active ? 0 : 1; // Hide or show the elements based on the ID d3.select("#tag"+d.key.replace(/\s+/g, '')) .transition().duration(100) .style("opacity", newOpacity); // Update whether or not the elements are active d.active = active; }) .text(d.key); }); // Add the X Axis svg4.append("g") .attr("class", "axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)); // Add the Y Axis svg4.append("g") .attr("class", "axis") .call(d3.axisLeft(y)); }); </script> <script> /************* // Time Series *************/ // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph // Set the dimensions of the canvas / graph var margin = {top: 30, right: 20, bottom: 70, left: 50}, width = 600 - margin.left - margin.right, height = 300 - margin.top - margin.bottom; // Parse the date / time var parseDate = d3.timeParse("%b %Y"); // Set the ranges var x = d3.scaleLinear().range([0, width]); var y = d3.scaleLinear().range([height, 0]); // Define the line var priceline = d3.line() .x(function(d) { return x(d.date); }) .y(function(d) { return y(d.price); }); // Adds the svg canvas var svg5 = d3.select("body").select("#svg_timeline_other").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // Get the data d3.csv("/files/blog-posts/2017/10/blog-post-1/df.other.csv", function(error, data) { data.forEach(function(d) { d.date = +d.date; d.price = +d.price; }); // Scale the range of the data x.domain(d3.extent(data, function(d) { return d.date; })); y.domain([0, d3.max(data, function(d) { return d.price; })]); // Nest the entries by symbol var dataNest = d3.nest() .key(function(d) {return d.symbol;}) .entries(data); // set the colour scale var color = d3.scaleOrdinal(d3.schemeCategory10); legendSpace = width/dataNest.length; // spacing for the legend // Loop through each symbol / key dataNest.forEach(function(d,i) { svg5.append("path") .attr("class", "line") .style("stroke", function() { // Add the colours dynamically return d.color = color(d.key); }) .attr("id", 'tag'+d.key.replace(/\s+/g, '')) // assign an ID .attr("d", priceline(d.values)); // Add the Legend svg5.append("text") .attr("x", (legendSpace/2)+i*legendSpace) // space legend .attr("y", height + (margin.bottom/2)+ 5) .attr("class", "legend") // style the legend .style("fill", function() { // Add the colours dynamically return d.color = color(d.key); }) .on("click", function(){ // Determine if current line is visible var active = d.active ? false : true, newOpacity = active ? 0 : 1; // Hide or show the elements based on the ID d3.select("#tag"+d.key.replace(/\s+/g, '')) .transition().duration(100) .style("opacity", newOpacity); // Update whether or not the elements are active d.active = active; }) .text(d.key); }); // Add the X Axis svg5.append("g") .attr("class", "axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)); // Add the Y Axis svg5.append("g") .attr("class", "axis") .call(d3.axisLeft(y)); }); </script> </body>Sebastian Steffenssteffen (at) mit (dot) eduMachine Learning or ML? - How words enter the public domain Introduction For this project I am going to look at how new words enter the common language realm. Theory One of the responsibilities of a journalist is to teach his readers. This is not just limited to conveying news, but also includes teaching new vocabulary. This is particularly relevant in the fast-paced realm of technology, where artificial intelligence, the cloud, machine learning, and big data have become significantly more newsworthy as these concepts transform the industry and the process of innovation. But when do these words enter the public realm and vocabulary and become ML and AI? We should expect that journalists initially only use the unabbreviated concept. As the concept starts to enter the public domain, journalists may use both the abbreviation and the full word side by side, until the abbreviation is eventually predominantly used. Let's see if this is true! Data I decided to focus on the following words and abbreviations: Artificial Intelligence, AI, and A.I. Machine Learning, ML, and M.L. Natural Language Processing and NLP Neural Network and Neural Net Generative adversarial network and GANS Recurrent Neural Network, Recurrent Neural Net, RNN, and R.N.N. Application Programming Interface and API Deep Neural Network, Deep Neural Net, Deepmind, and Deep Mind Supervised Machine Learning, Unsupervised Machine Learning, and Reinforcement Learning LSTM, Embedding space Cloud, Big Data, Technology, Automation, Robot, AOL, Cyber Crime Methodology I scraped articles from the Guardian between 1999 and 2017 and count the number of occurences and co-occurences of the se words. The Guardian's online edition was the fifth most widely read in the world in 2014 (Source) and is thus a reasonable proxy for journalistic activity. Results The most interesting results came from AI and ML. According to the 'Journalist Educator Hypothesis' above I expected that the number of occurences of the abbreviations would eventually overtake those of the complete words. However, we observe the opposite! Timeline for AI versus Artificial Intelligence Timeline for ML versus Machine Learning One explanation may be that the target group changed. Whereas initially these kinds of tech articles may have been directed at the already knowledgeable readers, as these topics became more popular over time, the full word usage became necessary. It may also be indicative of journalists preferring to use the full word as the abbreviation comes as across as more and more 'buzzwordy' as the popularity of the concept rises. Speaking of buzzwords, let's have a look at a couple. Timeline for Buzzwords We can see, perhaps surprisingly, that 'Cloud' and 'Big Data' are actually on the downturn, whereas 'automation' and 'robot' have become much more common. If this is at all indicative of company behavior, it implies that there may have been a shift from virtual innovation to physical innovation. Finally, most of the technical terms, like embedding space or the different types of machine learning almost never occur, presumably because the Guardian is a news outlet accessible to a general audience. Just for fun I also tried to look into co-occurences of words, combining the full word with their abbreviations into single categories. We can see that there are actually not that many co-occurences. The most common ones were AI with Robots, AI with Automation, AI with ML, and Big Data with Cloud. Chord DiagramBlog Post number 12012-08-14T00:00:00-04:002012-08-14T00:00:00-04:00https://sebastiansteffen.github.io/posts/2012/08/blog-post-1<p>This is</p> <p>a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool. Headings are cool ======</p> <h1 id="you-can-have-many-headings">You can have many headings</h1> <h2 id="arent-headings-cool">Aren’t headings cool?</h2>Sebastian Steffenssteffen (at) mit (dot) eduThis is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool. Headings are cool ====== You can have many headings Aren’t headings cool?