By Jeff Emtman

Companion to episode: The Daily Blast

Part 1: Bottoming out on the News.

I’m sideways, doomscrolling on Google News at 4 AM local time. Jetlagged out of my mind and too tired to sleep. 

This app reminds me that, as long as time’s existed, people have been pissed at each other.  It’s not great, but at least it’s consistent. 

Archaeologists in Pompeii found graffiti on the city walls with sentiments that feel somewhat familiar to me: “Epaphra, you are bald!”, ” Chie, I hope your hemorrhoids rub together so much that they hurt worse than when they ever have before!”, ““Restituta, take off your tunic, please, and show us your hairy privates”, “Epaphra is not good at ball games.”  Poor Epaphra. 

I used to think that Google News was endless, but it’s not.  I found this out back in the begining of the pandemic, when I got used to lying catatonic in bed with potato chip crumbs on my chest, becoming ever more convinced that the world was about to end.  Eventually, I’d bottom out, hit the end of the news feed where Google was trying to tell me “there’s literally nothing else that we think is interesting enough to show you today.”  It’d make me feel a bit dirty.  I try not to do it so much now.  

Nonetheless, now that I’ve irrevocably glazed my brain with tens of thousands of headlines, and I’m starting to notice some patterns. 

Online, someone’s always getting blasted..  Few are immune to it.  Here are a few I found today: 

I don’t know how new this kind of blasting is.  Parts of it feel similar to the slander of poor Epaphra.  The difference is that graffiti is usually anonymous, but blasting is a form of criticism that requires authority.  That authority is either formed by having a blaster who is high in perceived status (like pundits blasting referees) or being large in number (like parents school admins/individuals/anyone). 

Blast stories are often just inflammatory headlines with a paragraph or two reciting high status person issuing a quippy criticism.  It’s then followed by a long list of embedded tweets reacting to said quippy criticism.  This method of reporting allows for a blast-quorum to be quickly reached and thus both the standard of status and size are reached and the blast-headline can be written. 

I see these kinds of stories everywhere now.  I do admit that reading them makes my brain give me some little squirt of chemicals that makes me excited.  I’m always eager to see who’s in trouble.  Makes it hard to sleep though. 

Part 2: Making The Daily Blast

My interest in the who, how and why of blasting sent me down a small rabbit hole where I tried to figure out if there were trends in this practice.  My hypothesis was that conservative media was more likely to issue a blast.  Why?  It matched my existing belief that conservatism (at least in the American sense) requires its adherents to be ideologically more homogeneous and that deviations must be quickly and publicly corrected.  Though I also hear this same criticism coming from the right, with the modern refrain of “cancel culture” resonating similarly to the “political correctness” that conservatives hated so much in the 90’s.  

I sometimes regret not seeking further education in linguistics.  I’d love little more than to take a year to study the emergence of blast-related language (where it came from and what role it serves in the language as a whole).  But alas, I really don’t have the training, so instead, I made The Daily Blast, a Neutrinowatch episode about robots reading the news to each other. 

I started by getting a list of news outlets together.  I used the AllSides Media Bias Chart for my starting point.  It’s a list of fifty or so news sites across the political spectrum (speaking of which, here’s a good read on this topic from Poynter). I took this list and tried to find RSS feeds for each site listed.  “Tried” is an important word because, holy hell, is it hard to find RSS feeds for some news outlets.  If you’re unfamiliar with RSS, rest assured that it’s a technology that you’ve used, whether you know it or not.  It’s a form of syndication of information (“Really Simple Syndication”) and it’s one of those core technologies that makes the internet work.  It’s a practically ancient protocol that lets parts of the internet flow from one place to another in a standardized format.  It’s how Google News finds new headlines, it’s how Twitter worked in the early days, it’s how Neutrinowatch episodes magically show up in the podcast app of your choice (you are subscribed, yes?).  This standardized format makes it incredibly fast for someone like me to find out what headlines are currently running on any given news source.

So, I gathered the list of RSS feeds full of headlines.  And I fed that list of feeds to a Python library called Feedparser to quickly extract all the headlines and outlet names.  It’d return a couple thousand headlines which I could then query for blast-stories.  On any given day, there might be a couple dozen stories with the word “blast” in their headline.  From here, I had to figure out how to separate what I was looking for (the aforementioned Blast-Media) from stories about gas pipe explosions, or bombs, etc.  The only way to do this was to learn pay attention to associated words and just create a strong filtering system.  I also added exclusionary filters for a lot of words related to violence, abuse, bigotry and some other things too.  Things still slip through, but the filter catches most of the content I’d deem objectionable. 

I started searching for other Blast-Media terms too.  “eviscerate”, “destroys”, “slams”, “criticize”, and a couple others.  The code below uses a custom object that I made for each headline.  These just contain all the stories’ headlines, publish dates, and outlet names.  Also a special attribute called “match” which is ‘None’ by default, but gets modified if any of the desired words are found.  Looking at this code a year later, I can see now that this code would be a lot more efficient combined into a single function.  But, with my beginner’s knowledge, I think it made sense to fracture it out for troubleshooting purposes.  It does indeed work pretty well. 

Negative headline matching part of the episode code: 

#list of negative words to search headlines for
negative = [ "destroys", "eviscerate", "slams", "blasts", "criticize"]

#  matchHeads function to find words in headlines.  Accepts a list of strings as the single arguement. 
# Function doesn't return anything, but does modify the "match" attribute of the story objects.

def matchHeads(word_list):
    for i in range(len(word_list)):
        for j in range(len(stories)):
            if word_list[i] in stories[j].headline.lower():
                stories[j].match = word_list[i]

#run matchHeads with our negative word list
matchHeads(negative)
               
# findMatchHeads function runs through all story objects and returns a list of any matching ones.  Accepts a list of strings as only argument. 
def findMatchHeads(filt): #filt is a list
    output = []
    for i in range(len(filt)):
        for j in range(len(stories)) :
            if stories[j].match == filt[i]:
                output.append(stories[j])           
    return output

# make a list of objects which match the words in the negative list. 
negative_headlines = findMatchHeads(negative)

Of course, once you have the ability to find negative words, you have the ability to find positive words, or any kind of words, for that matter.  

The episode itself follows a pretty simple format.  Two robot voices, Wendy and Ivan, are floating in an ethereal soundscape.  Ivan asks Wendy to read him some blast-like headlines, and Wendy asks Ivan to read her some nicer headlines.  They end with an attempt at a human interest story (stories about horses and dogs and seahorses).  It’s a quick back and forth.  I really like how short it is.

A bit after the initial publish, Martin had the idea of adding in one extra easter egg, which was based on another news phenomenon: The Legend of Florida Man.  So I added one more filter, one that’d pull out any stories with the word “Florida Man” in the headline (also “California Man”, “Indiana Man”, “concerned citizen”, and a few others).  I wrote a short bit of code that’d take any of these terms and swap them for the illustrious Gus Hommes, anti-hero of the Neutrinowatch universe.

special = ["florida man ", "california man ", "chicago man ", "georgia man ", "indiana man ", "miami man ", "local man ", "concerned citizen ", "boy scout "] # trailing spaces are probably important.

# this function swaps out words on the special list into the headlines.  Potential for multiple matches in single headline.
def specialSwap():
   
    # look at all the story objects
    for story in stories:

        #look at al lthe words in the special list
        for special_word in special:

            #if there's a match...
            if special_word in story.headline.lower():

                # replace the matching word(s) with Gus
                story.headline = story.headline.lower().replace(special_word, "Gus Hommes ")

                print(story.headline)

Now, every week or two, Wendy will ask Ivan if there’s been any news about Gus Hommes, and he’ll read a headline that places him somewhere in California, or Florida, filling in potholes with his shirt off or shooting firecrackers at the moon. A rabble-rouser for sure.

I like the way the episode turns out most days. Feels like the first time I’ve done exactly what I wanted to do with code—a way to use code to share an observation about something that bugged me. Small, I know, but a victory to me. 🌟

Jeff Emtman


2 responses to “Graffiti on the Walls of the Internet [Blog]”

Leave a Reply to The Daily Blast [Almanac] – Neutrinowatch Cancel reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s