My friend group uses WhatsApp to stay in touch. As our lives progress it’s a great way to stay close. But the thing that binds us together the most is probably humor. It’s how we bond and it’s fun!
A couple weeks ago I asked my friends a simple question: Who in our group is the funniest? I received 5 different answers.
Hmm.
I got to thinking: could I machine a process to read the raw text of a WhatsApp chat and use MATH to determine who is the funniest? The answer, it turns out, is yes.*
I’ve written python code which ingests a WhatsApp chat export, interprets laughers & jokers, calculates humor metrics for each member of the chat, and visualizes the results. I invite you to take it for a spin on your own chat – clone my github repo.
How it works
How can we measure how funny someone is? By how much laughter they cause! That’s where we start: identifying laughter. Messages are flagged as containing laughter by performing keyword searches for known laughter terms (LOL, haha, 😂, etc.). That’s the easy part. Next we need to determine who caused the laughter.
To link laughter to its originating “joke” in an automated way, we need to look at the preceding chats and consider some rules:
- Is the laugher responding to a quoted message? If so – you’re done! Easy one!
- Is the chatter == the laugher? If so, keep looking.
- Does the chat also contain laughter? If so, keep looking.
The first chat we come to that does not fail on the #2 or #3 is credited as the ‘joker’. Here’s an example:
*It’s not perfect
Any machined process will lack the nuance of a human. Mistakes will be made! The code will link laughter to the wrong joker at some frequency due to the challenges around interpreting human language.
But after observing chat behavior for some time I estimate that this approach properly assigns laughter about 90% of the time. And assuming random assignment of the remaining 10% we shouldn’t be advantaging anyone by too much – though more active chatters will tend to have an advantage on that account.
It also goes without saying that this code may not correctly assess humor in the real world; its perspective is limited to the WhatsApp chat!
The metrics
Now that we have a dataframe containing jokes + laughs, we can perform some analysis to develop features which describe how funny each chatter is. I’ve come up with 4 metrics. Why 4 and not just 1? Because something as complex as humor can’t be captured in just one number!
Weighted Laugh Score
Let’s start with the obvious one: Who caused the most laughter? But not all laughter is created equal: ‘Haha’ < ‘Hahaha’ < ‘Hahahaha’. We assign a “weight” value to known laughter keywords which describe the strength of the laugh. This metric is the sum of all laughter weights caused by the joker in the full chat.
Joke Proportion Score
How frequently did each chatter tell a joke? We want to value low-activity chatters who are often funny, and penalize high-activity chatters that produce a lot of unfunny messages. This metric is all about the “humor value” you create as a proportion of the count of your chats.
Laughter Distribution Score
OK – maybe you are causing a lot of laughter and you have a high joke proportion in your chats. But do you have broad appeal among your audience, or are you getting all your laughter from a vocal minority? This metric reduces the score for jokers who get a disproportionate amount of their laughter from a subset of their audience; it boosts the score for jokers who have an even spread of laughter from all members of the chat.
Big Joke Score
Similar to Weighted Laugh Score, but now we’re only crediting “big” jokes – defined as any message that causes multiple people to laugh. I felt this was necessary to further disambiguate truly funny messages from messages that elicit only a casual ‘haha’.
These metrics are weighted evenly and rolled up into a composite humor score.
Putting it all together
With the data compiled and calculations complete, we can visualize the results! To illustrate I will share the summaries produced from one of my chats, “Beware of Trolls”, which presently includes 13 members and has accumulated over 17,000 messages thru March 2020.
Behold!
Same chat, each metric reported individually:
Monthly analysis
With the code written for overall humor summaries, we can produce the same summaries by month, creating opportunities to do a number of cool things. Show trends over time, and look at at someone’s funniest month!
Here is my own trend line showing my humor score over time:
But what we really want to see is how we compare to other members of the chat. So we plot the top 9 jokers together!
And with humor scores for each month calculated….we can determine every chatter’s funniest month! Wow.
Mine, it turns out, was November 2018. Because of this joke:
That’s it folks. If your interest is piqued, feel free to try it out on your own chat. I welcome collaborators and suggestions!
Stay funny everyone. We need humor now more than ever.