BetterReads Blog

A Reading Taste Profile Is Not a Genre Cloud

By BetterReads ·

A public reading profile tends to collapse a life of books into a word cloud of genres. The picture is familiar and usually wrong. It treats every title as an equal vote. It forgets that a three-star slog and a five-star novella are not the same evidence. It either throws away the old library or lets 2012 drown 2026. None of that is how the last twenty years of recommender research talks about taste.

This note is an account of how BetterReads now builds a taste profile on the Year in reading tab: a lifetime object, readable in public, that still moves. It is not a claim that we have rebuilt Netflix. It is a claim about which results from that literature transfer to a single shelf of a few hundred dated, rated books — and which do not.

Two Netflixes

The contest people remember is the Netflix Prize (2006–2009). The task was to predict withheld 1–5 star ratings on about 100 million ratings from roughly 480,000 people. The winning blend, BellKor’s Pragmatic Chaos, improved Netflix’s Cinematch RMSE by the required 10%. The ideas that survived were not TF–IDF tag clouds. They were latent factor models, user and item biases, implicit feedback, and time-varying user factors.

Koren, Bell, and Volinsky’s survey of matrix factorization is still the clearest statement of the geometry [1]. Each person and each title is a vector in a shared space of perhaps 20–200 dimensions. A factor might align with an obvious axis (serious vs escapist) or with nothing we have a word for. Predicted rating is not “how many mysteries you logged.” It is

global mean + user bias + item bias + pu · qi

The personality is pu. The genre histogram is, at best, a projection of that vector onto labels a librarian already had.

The product Netflix shipped later is a different system. Gomez-Uribe and Hunt describe a ranker, “because you watched” rows, and several tastes per household [2]. Todd Yellin’s altgenre program paid people to tag story attributes — romance, gore, tone — and then assembled tens of thousands of microgenres from those tags [3]. Recent plays outweigh old ones when ranking what to show tonight. That is not the same as deleting the history that tells you who someone is.

BetterReads has the second problem (explain a reader) without the first infrastructure (a dense user–item matrix on the order of Netflix 2006). The honest move is to steal the structure of those models and realize it on content we actually store: stars, did-not-finish, clocked time, finish dates, catalog subjects, and, when a title is in our catalog, tone and themes from the book summary.

Stars are relative

A large share of Prize error was baseline, not interaction [1]. Some people rate generously. Some titles are widely liked. A 3★ from a mean-4.4 reader is a dislike; a 4★ from a mean-3.2 reader is love. A cloud that sums “mystery” by headcount treats those the same.

The profile therefore uses a residual. For a rated book the multiplier is a clipped function of (rating − that reader’s mean) / σ. Unrated finished books sit near neutral. Did-not-finish is a faint multiplier, not a giant blob of whatever genre the abandoned book was filed under.

Time is confidence, not preference

Hu, Koren, and Volinsky’s implicit-feedback paper is the other half of that weight [4]. Watch time (here, reading seconds) is not how much you liked the title. It is how sure we are that the event means something. Their confidence is c = 1 + α r. We use a log form of the same idea so an eight-hour DNF is confident rejection, not a larger Thriller.

Koren’s later temporal paper is the one that forbids a year-only cloud [5]. On Netflix timestamps, exponentially decaying old ratings made predictions worse. A timeSVD++ model with 10 factors beat a static SVD with 200. The method is not a sliding window. It is: keep every rating, let user bias and user factors be functions of time, and separate day noise from slow drift. Old preferences still encode the person. They also still help estimate the items.

That is why the BetterReads profile is the whole shelf — a Goodreads import of 500 dated books included — and why the Year in reading tab is a view of that object, not a separate bag of this year’s hours.

Many interests, not one centroid

A 500-book life is not one vector. Industrial retrieval models such as MIND and ComiRec represent a user with several interest capsules at once [6][7]. Sequential models (SASRec, BERT4Rec) are excellent at next-item ranking [8][9] and a poor fit for a public explainer: they hide taste in a hidden state and, unless extended, squash the timeline.

We take the multi-interest idea without a capsule net. A weighted books × tags matrix is factored with non-negative matrix factorization when the shelf is large enough; otherwise we fall back to the strongest tags. Each component gets a name from its top tags. That is Koren’s pu with axis labels a person can read — closer to Pandora’s Music Genome or Yellin’s tags than to a bag-of-words IDF.

Tags are not only BISAC-style genres. Catalog subjects that look like themes survive; nationality headings and the word “fiction” do not. For in-catalog titles we also pull tone, setting, and key themes from the book summary when it exists. That is the cheap version of Netflix’s story attributes. It is sparse. It is still more personal than “Mystery / History / Fiction.”

Drift as a first-class chart

If taste changes — and Koren’s premise is that it does [5] — the product has to show the change, not only decay toward now.

Two plots sit under the cloud:

  1. A stacked river by year. Each column is the mix of named interests among books whose activity date falls in that year, mixed with a small lifetime prior so a sparse year does not jump.
  2. A path in two dimensions. The two interests with the most year-to-year variance become the axes. Each year is a point. That is the small version of Koren’s serious/escapist cartoon, drawn for one library.

The cloud itself is not “this year only.” It is lifetime mix plus a tilt toward the last 24 months, so finishing a book this week can move a word without erasing 2018.

Preference-transition models in the academic literature treat the next class of item as a Markov process over genres or artists [10]. We do not forecast the next book. We do accumulate a trajectory, which is the part of that work that belongs on a profile.

Surveys of time-aware recommenders make the same distinction we needed in product: recency for ranking versus a model of the whole history [11]. Later sequential work on interest drift (stability-aware fusion, drift-aware user vectors) is aimed at next-item metrics [12]. We borrow the diagnosis — long-term core plus short-term tilt — not the transformer.

What collaborative filtering can still do here

A single reader is one row of a user–item matrix. Prize-style SVD cannot be estimated from that row alone.

When enough BetterReads shelves carry stars, we fit implicit ALS on the community [4]: observed ratings are positive preference; confidence grows with the star value. Item vectors qi then do two jobs:

  • Untagged titles can borrow themes from near neighbors in that space (same geometry, missing catalog subjects).
  • If enough of a reader’s books have community vectors, the 2D path can be the PCA of yearly centroids in collaborative space, with axis names taken from whichever named interest correlates with each principal direction.

If the community is too small, those steps no-op. The content profile still runs. That is the cold-start clause every CF paper states and most product posts skip.

We do not train SASRec on 500 titles to decorate a cloud. Next-item models want HR@10. A public profile wants a sentence a stranger can disagree with.

What we are not claiming

This is not psychological typing. Mapping genres onto Big Five traits is a weak scientific habit and a worse public-profile feature. It is not StoryGraph’s mood/pace vocabulary; we do not have those tags on every shelf row. It is not Netflix’s ranker, homepage, or 76,897 altgenres.

It is a lifetime affinity model with readable factors, a residual for stars, confidence for time, DNF as negative evidence, a river, and a path. The research lineage is factorization, implicit feedback, temporal user factors, and multi-interest user representations. The implementation is small on purpose. A profile you can inspect is more useful than a 200-dimensional pu you cannot.

The Year in reading tab is where that object currently lives. The heatmap remains the last twelve months of daily rhythm. The cloud and the river are the longer argument about who the reader has been, and where they have moved.


References

[1] Koren, Y., Bell, R., & Volinsky, C. (2009). Matrix factorization techniques for recommender systems. Computer, 42(8), 30–37.

[2] Gomez-Uribe, C. A., & Hunt, N. (2015). The Netflix recommender system: Algorithms, business value, and innovation. ACM Transactions on Management Information Systems, 6(4), 1–19.

[3] Madrigal, A. C. (2014, January 2). How Netflix reverse-engineered Hollywood. The Atlantic.

[4] Hu, Y., Koren, Y., & Volinsky, C. (2008). Collaborative filtering for implicit feedback datasets. IEEE International Conference on Data Mining, 263–272.

[5] Koren, Y. (2009). Collaborative filtering with temporal dynamics. Proceedings of KDD, 447–456. Expanded in Communications of the ACM, 53(4), 89–97 (2010).

[6] Li, C., Liu, Z., Wu, M., Xu, Y., Zhao, H., Huang, P., Kang, G., Chen, Q., Li, W., & Lee, D. L. (2019). Multi-interest network with dynamic routing for recommendation at Tmall. Proceedings of CIKM, 2615–2623.

[7] Cen, Y., Zhang, J., Zou, X., Zhou, C., Yang, H., & Tang, J. (2020). Controllable multi-interest framework for recommendation. Proceedings of KDD, 2942–2951.

[8] Kang, W.-C., & McAuley, J. (2018). Self-attentive sequential recommendation. IEEE International Conference on Data Mining, 197–206.

[9] Sun, F., Liu, J., Wu, J., Pei, C., Lin, X., Ou, W., & Jiang, P. (2019). BERT4Rec: Sequential recommendation with bidirectional encoder representations from transformer. Proceedings of CIKM, 1441–1450.

[10] Sanna Passino, F., Maystre, L., Moor, D., Lalmas, M., & Ciobotaru, A. (2021). Where to next? A dynamic model of user preferences. Proceedings of The Web Conference.

[11] Bogina, V., Kuflik, T., Jannach, D., Bieliková, M., Kompan, M., & Trattner, C. (2023). Considering temporal aspects in recommender systems: A survey. User Modeling and User-Adapted Interaction, 33, 81–119.

[12] Zhang, Y., et al. (2025). Stability-aware preference modeling for sequential recommendation. ACM Transactions on the Web.

Get BetterReads on your device

Your bookshelf, highlights, and reading tools are in the iOS and Android apps—the same experience as the web reader, synced when you sign in.