Django - 如何推荐类似产品

时间:2015-09-27 13:56:11

标签: python django categories recommendation-engine

我有一个带有标签和产品的产品清单。类别,像这样

class Product(models.Model):
    tags = TaggableManager() #using django-taggit
    categories = models.ManyToManyField(Category)

我正在寻找一种有效实施方法的方法,例如

p = Product.objects.get(...)
p.similar_products() # -> should return a list sorted by similarity

如何计算相似度:两个产品之间的相似性得分应该是标签的数量和数量。他们有共同的类别。

挑战在于这种方法需要每秒计算数百次,因此有效地做到这一点非常重要。

我可以通过缓存加快速度,但问题仍然存在 - 是否有基于django本地的方式来计算和评分基于标签和类别的类似产品? (我知道django-recommended,但它似乎使用用户和评级)

谢谢:)

1 个答案:

答案 0 :(得分:3)

免责声明:以下是我如何解决问题的开始。按原样提供,不适合用途,不包括保修。

  

有基于标签和类别的django本地方式来计算和评分类似的产品吗?

简短的答案为否 - Django是一个Web应用程序框架,而不是推荐系统。

  

我正在寻找一种有效实施方法的方法(...)

请注意,这是一项非常重要的任务。您需要解决两个部分:

  1. 计算产品之间的相似性
  2. 检索给定产品的类似产品集,可能按相似性排序
  3. 一旦完成,2。变得微不足道。有许多方法可以计算相似度,您可能希望随着时间的推移改变方法,以获得经验。

    因此,我将从2.开始,然后向后工作以解决1.这将为您提供一种方法来存储和检索未绑定到任何特定方法以计算相似性的相似性。

    检索类似产品

    在Django本地解决这个问题的一种方法是ManyToMany关系:

    class Product(models.Model):
        tags = TaggableManager() #using django-taggit
        categories = models.ManyToManyField(Category)
        similars = models.ManyToManyField(Product)
    

    请注意,此处的关键思想是为每个产品存储所有类似产品的主键列表。那么similar_products方法就是:

    def similar_products(self):
         return self.similars.all()
    
      

    挑战在于这种方法需要每秒计算数百次

    根据产品目录的大小和类别列表,此方法可能无法很好地扩展。然而,存在相同概念的更有效的实现,例如,您可以在数据库之外缓存或存储类似产品密钥的列表,例如使用像Redis这样的内存商店。

    计算相似度

    计算相似性是一项计算复杂的任务。基本上你想要将每个产品与所有其他产品进行比较,其本质上是O(n ^ 2)。有很多research on the topic

      

    两个产品之间的相似度得分应为数量   标签&他们有共同的类别

    一种天真的方法如下。

    对于每种产品,

    1. 检索按类别主键排序的类别列表
    2. 构建产品x类别矩阵,其中每行代表一个产品的类别,每列代表类别(第1列代表第1类,第2列代表第2类,等等)。在矩阵中,每列都是一个类别变量(0,1),如果产品属于相应的类别,则为1,否则为0.
    3. 对于每个产品,计算category_score,它是类别指标的二进制表示(基本上是一个字符串)
    4. 构建产品x产品矩阵,每个产品计算相似度作为与所有其他产品的距离,例如similarity = abs(product1.category_score - product2.category_score)
    5. 给定一些截止最大距离,每个产品检索此最大距离内的所有其他产品,并填写Django模型中的Product.similars关系
    6. 显然,这是需要在某种批处理环境中脱机运行的任务。请注意,有更复杂的方法应用机器学习技术,特别是一些在线工作并且比上述更好地扩展。根据您的特定要求(例如#products,#transations,需要用户偏好匹配等),可能会或可能不值得研究这些方法。

      推荐阅读: