【问题标题】:Designing a simple book recommendation system in python?用python设计一个简单的书籍推荐系统?
【发布时间】:2015-08-03 12:02:47
【问题描述】:

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

假设 Book 模型有一个字段 Genre_Score(一个文本字段,它是 json 格式的字典,键为流派,值为权重)类似于

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

类似地,每个用户模型都会有类似的 Genre_Score

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

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

【问题讨论】:

  • 你在使用 PostgreSQL 吗?你知道 Django 没有内置 DictField 吗?另一种方法是拥有一个Genre 模型和一个从BookGenre 的ManyToMany,并将分数存储在直通模型上
  • 我的意思是 JSON 格式的文本字段。对困惑感到抱歉。是的,您提到的另一种方法也是我认为会比这种方法更好的方法吗?
  • 如果您将 JSON 文本存储在文本字段中,您将无法在 dict 中查询特定值
  • 我会从多对多模型方法开始,首先让它以这种方式工作,稍后您将能够查看是否有任何查询太慢......并知道您是哪些将更好地了解需要优化的内容(如果有的话)
  • 所以一个类型模型与书籍/用户模型具有 m2m 关系。流派模型将包含字段genre_name、genre_score? Genre_score 会是一个问题吗?匹配仍然很困难,即为特定用户创建提要?

标签: python django recommendation-engine


【解决方案1】:

我建议你这样建模:

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

【讨论】:

  • 优秀。但是为什么 BookGenre 和 UserGenre 和 score 有 2 个不同的模型?我在想一个简单的带有标题和分数的另一种模型类型?这有什么好处?
  • 如果你把分数放在Genre 模型中,那么一个类型只能为所有书籍和用户提供一个分数......在你给出的例子中,你似乎希望每本书都能够每种类型都有自己的分数(有意义),对用户来说也一样
  • 谢谢。让我试试这个然后回来。
  • 迁移中的一些问题。何时在外键/m2m 字段中用引号写入模型名称,何时不使用引号。除了through= 之外,您每次都写引号?
  • 我认为它们都可以用引号来写...当您想要的模型尚未定义(即稍后在同一文件中定义)但在它们之上时,您需要使用引号不需要。如果模型在不同的应用程序中,那么您应该使用带有 genres = models.ManyToManyField('myotherapp.Genre', through='UserGenre') 之类路径的引号
猜你喜欢
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多