Our last few posts have focused on the nuts and bolts of our backend pipeline: how do we recognize and deduplicate named entities in articles, and how do we figure out and extract what those entities or topics did? Answers to these questions give a sense for how we put together what we call our global feed, a real time stream of everything happening in the world…but, Wavii is also about personalization. To make your feed, we need to filter everything down to the specific topics and events you care about.
Building your feed
How do we know what is going to be relevant to you? The simplest possible solution is to ask you to follow a few topics, and then show you every story that includes at least one of those topics. This is similar to how Twitter will show you every tweet by someone you follow.
This is a great starting point. It’s a clear and straightforward user experience, and we can be confident about your interests without the need for further analysis and approximations. But it’s also rigid and limited, relying solely on your reported interests. It puts the burden on you to know exactly what you want.
Let’s visualize this. Suppose that we have a many-dimensional topic space, where every topic has unique coordinates, and the more similar or related two topics are, the closer they are to each other. We can represent people and news stories as points or collections of points in this space. For a user without a lot of follows, it will probably look something like this:

This approach is equivalent to representing you as every topic you follow, and representing each story as the topics involved in it. Then we find the intersection between the two (the orange points in the figure above) to generate a personalized feed that you’ll like.
Pretty simple, right? On the surface it is, but there are problems that arise with this solution.
Two ends of the spectrum
This approach really only works if a user follows just the right amount of topics. Follow too few and your feed will be sparse…follow too many and it can feel flooded, especially if some topics tend to produce far more feed items than others.
In the example above, the user follows only a few topics so they might have a pretty sparse, stale feed, and miss out on a lot of feed items they’d probably like to see. Given that they’re following Radiohead, they’d probably like to know about Thom Yorke’s collaboration as well. And a lot of users would want to know about Neil Armstrong’s death, even though they’d probably never think to follow him.
In general, it’s hard for users to self-report every interest they have (or will have)…did you even know you could follow the Democratic National Convention or Track and Field at the Summer Olympics?
Then we have another set of users that are following a ton of topics, and for them the situation looks more like this…

In this case, the problem is possible information overload — which kind of defeats the point of Wavii. So how do we decide which events to show you? Just pick a few stories randomly? Pick the most recent ones at your time of login?
As Wavii continues to improve and generate even more updates for your feed, this challenge only increases. So we’re working on a solution that’s dynamic, adaptive, and able to accommodate both ends of the spectrum.
Representing a user
First, when determining whether you’ll want to see a topic in your feed, we can look for signals beyond whether or not you explicitly follow it. For example, we use things like:
- Which topics are involved in the events you comment on or react to?
- How often do you click into events about each topic?
- Which topics do you search for?
- Which topic pages do you visit?
Looking at these signals allows us to compute your expected interest in a topic, so we can figure out things you’ll like that you’re not even following!
Second, we can look for other attribtues of stories you care about, besides the topics involved. For example, you might be very interested if Kim Kardashian starts dating someone, but less interested when she is merely spotted somewhere. Or, maybe you particularly like events based on stories from TechCrunch or Business Insider, but not other sources.
Finally, we use your interest level in one topic to guess it for related topics. I.e., if you are interested in the Democratic Party, you’re probably also interested in the Democratic National Convention.
Coming back to our topic space, we can use these approaches to create interest clouds around each topic that are proportionate in size to your interest level in each one. Larger interest clouds extend into nearby topics, indicating possible interest in those topics. Given the same follows from the example above, a user’s full interest profile might look something like this:

Representing the global feed
Similarly, when we generate a new event we try to determine how globally popular and important it is or will become. This gives us additional clues about how much each user might like to see it in their feed. To determine this we consider things like:
- how many articles have been published about the event?
- how much social action is there around the event?
- how important does this relation type tend to be?
Again, we can model each of the stories as a point with a specific magnitude of relevancy, represented here with the most important or interesting stories being the darkest shades of red:

Neil Armstrong’s death and Obama’s first presidential debate are the biggest stories, while a musical tour and an app update are much less globally relevant.
Putting it all together
Now, the problem of feed generation becomes clear: we simply overlay the user representation with the global feed representation and find points with the greatest heat. The simplest way is visualize this is to sum the two heat maps, but we can use any function of the two depending on how we want user-specific relevance to interact with global relevance. Putting the two plots above together, we get something like this:

Comparing this to our original plot of the user’s feed, what we now have is not merely a set of stories, but a clear ranking of stories. Top-ranked are stories that have high heat for the particular user, as well as some heat in the global feed: “Hot Chip is on tour”, followed by “Obama debates”. These are both about topics that are followed and for which the user has demonstrated a high degree of interest. Then come stories that have a little bit of heat in both: “Thom Yorke collaborates” and “Wavii updates app”. Neither Wavii nor Thom Yorke is actually followed, but for Wavii we’ve gathered other interest signals, while Thom Yorke has gained heat by sitting in the cloud of nearby Radiohead. Lastly are stories with only heat in the global feed, typically major breaking news or something that has gone viral. Sometimes these stories, as in the case of “Neil Armstrong dies” can garner enough heat from the global feed alone to make it into a user’s feed, but most remain just a dim speck like “Jen Aniston engaged”.
Having a ranking, rather than an unordered set, provides us a lot more flexibility in crafting a user’s feed, no matter how many follows they have. In practice, we have to consider thousands of events for a user’s feed, not just the five or so from this example. Being able to quantify both their user-specific relevance and global relevance allows us to make decisions about the best events to show each user.
-Anjuli