This is probably the simplest method, and it's based only on products modeled as m-dimensional feature vectors:
Just like users, features can also be categorical (indeed, for products it's easier), for example, the genre of a book or a movie, and they can be used together with numerical values (such as price, length, number of positive reviews, and so on) after encoding them.
Then, a clustering strategy is adopted, even if the most used strategy is k-NN, as it allows us to control the size of each neighborhood to determine, given a sample product, the quality and the number of suggestions.
Using scikit-learn, first of all we create a dummy product dataset:
nb_items = 1000
items = np.zeros(shape=(nb_items, 4))
for i in range(nb_items):
items[i, 0] = np.random.randint(0, 100)
items[i, 1] = np.random.randint(0, 100)
items[i, 2] = np.random...