I'm tasked with building a recommender system that can make recommendations based on input data of varying levels of granularity. To explain what I mean, let's use a running example of a Movie Title Recommender.
Desired interface
Suppose I have a recommender system model, R
, which is already defined and trained.
I want to be able to provide a single movie title, and get a ranked list of movie titles the models deems to be similar:
query = {'movie':'Shrek'} # input query
R(query) = ['A Bugs Life', 'Toy Story', 'Shrek 2'...] # ranked list of similar movies
I would also like to be able to optionally incorporate additional information, beyond just the movie title, which would somehow re-weight the recommendation scores.
For example, suppose I could optionally incorporate the gender of a user.
query = {'movie':'Shrek',
'user_gender' : 'female'} # query updated to specify user gender
# recommendation system takes gender into account, yielding different ordering in result
R(query) = ['Shrek 2', 'Finding Nemo', 'Toy Story', ...]
Considerations
The specific method doesn't matter to me - whether it be a collaborative filtering, matrix factorization or some other approach. What I'm most interested in are methods that:
- Are flexible, in the sense that it's easy to incorporate additional features (for example, If I'd like to weight recommendations by title genre, query time of day, etc).
- Item-to-Item. The system I have in mind will be used to find items similar to other items, agnostic of users.
- Space efficient. I do not want to keep track of a different model for each level of granularity of the query input, but rather reuse components of the model, and incorporate new components when optional information is provided.
If you know of any methods, papers or applications that you think could serve my purpose, please link it! Thanks.