在python中设计一个简单的图书推荐系统?

时间:2015-08-03 12:02:48

标签: python django recommendation-engine

我一直在为书籍设计一个简单的推荐系统。所以在注册时我会要求用户选择他们喜欢的类型。每本书也会有一个类型加上每个类型都有一个权重。

假设 Book 模型有一个字段 Genre_Score (一个文本字段是json格式的字典,其中key为类型,值为权重)类似

{"Thriller":5, "Adventure":59,"Biography":21}

同样,每个用户模型都会有类似

的Genre_Score
{"Thriller":1, "Adventure":1,"Biography":2}

现在,每本书完成后,我都会要求用户回答他是否喜欢这本书,并相应地更新该书和用户的 Genre_Score 。 使用上面的(json格式的文本字段)数据结构是一个好方法吗? 查询会非常昂贵,因为每个用户都必须生成与他的Genre_score和Books的流派分数匹配的 Feed 吗?或者我应该采取不同的方法吗?

1 个答案:

答案 0 :(得分:2)

我建议你这样建模:

from django.db import models
from django.contrib.auth.models import AbstractUser


class Genre(models.Model):
    name = models.Charfield(max_length=255)


class BookGenre(models.Model):
    book = models.ForeignKey('Book')
    genre = models.ForeignKey('Genre')
    score = models.IntegerField()


class Book(models.Model):
    title = models.CharField(max_length=255)
    # etc...
    genres = models.ManyToManyField('Genre', through=BookGenre)


class UserGenre(models.Model):
    user = models.ForeignKey('User')
    genre = models.ForeignKey('Genre')
    score = models.IntegerField()


class User(AbstractUser):
    genres = models.ManyToManyField('Genre', through=UserGenre)

有关详细信息,请参阅此处的文档,例如如何查询得分等:

https://docs.djangoproject.com/en/1.8/topics/db/models/#extra-fields-on-many-to-many-relationships