Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-如何推荐类似产品_Python_Django_Categories_Recommendation Engine - Fatal编程技术网

Python Django-如何推荐类似产品

Python Django-如何推荐类似产品,python,django,categories,recommendation-engine,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 so

我有一个带有标签和类别的产品列表,如下所示

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的建议,但它似乎使用用户和评级)


谢谢:)

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

是否有django原生方法根据标签和类别计算和评分类似产品

简短的回答是否定的——Django是一个web应用程序框架,而不是一个推荐系统

我正在寻找一种有效实现方法的方法(…)

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

  • 计算产品之间的相似性
  • 检索给定产品的相似产品集,可能按相似性排序
  • 一次1。完成了,2。变得微不足道。计算相似性的方法有很多种,随着经验的积累,您可能希望随着时间的推移改变方法

    因此,我将从2开始。然后倒向求解1。这将为您提供一个存储和检索相似度的方法,该方法不绑定到任何特定的计算相似度的方法

    检索类似产品

    Django本机解决此问题的一种方法是建立
    manytomy
    关系:

    class Product(models.Model):
        tags = TaggableManager() #using django-taggit
        categories = models.ManyToManyField(Category)
        similars = models.ManyToManyField(Product)
    
    注意,这里的关键思想是为每个产品存储所有类似产品的主键列表。那么
    类似的\u产品
    方法就是:

    def similar_products(self):
         return self.similars.all()
    
    挑战在于这种方法需要每秒计算数百次

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

    计算相似度

    计算相似性是一项计算复杂的任务。本质上,您希望将每个产品与所有其他产品进行比较,本质上是O(n^2)。有相当多的问题

    两个产品之间的相似性得分应为 它们有共同点的标记和类别

    一种天真的方法如下

    对于每种产品

  • 检索类别列表,按类别的主键排序
  • 构建产品x类别矩阵,其中每行表示一个产品的类别,每列表示类别(第1列表示类别1,第2列表示类别2,以此类推)。在矩阵中,每列都是一个类别变量(0,1),如果产品在各自的类别中,则为1,否则为0
  • 为每个产品计算
    类别\ U分数
    ,这是类别指标的二进制表示(基本上是一个位字符串)
  • 建立一个产品x产品矩阵,用于计算每个产品与所有其他产品之间的距离,例如
    similarity=abs(product1.category\u分数-product2.category\u分数)
  • 给定一些截止最大距离,对于每个产品,检索在此最大距离内的所有其他产品,并在Django模型中填充
    product.similar
    关系
  • 显然,这是需要在某种批处理环境中脱机运行的任务。注意,有更复杂的方法应用机器学习技术,特别是一些在线工作的方法,其规模比上述方法要好得多。根据您的特定需求(例如#产品、交易、用户偏好匹配需求等),这些方法可能值得研究,也可能不值得研究

    建议阅读:

    • 维基百科
    • 托比·塞加兰
    • 相关问题和答案(请参见==>)

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

    是否有django原生方法根据标签和类别计算和评分类似产品

    简短的回答是否定的——Django是一个web应用程序框架,而不是一个推荐系统

    我正在寻找一种有效实现方法的方法(…)

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

  • 计算产品之间的相似性
  • 检索给定产品的相似产品集,可能按相似性排序
  • 一次1。完成了,2。变得微不足道。计算相似性的方法有很多种,随着经验的积累,您可能希望随着时间的推移改变方法

    因此,我将从2开始。然后倒向求解1。这将为您提供一个存储和检索相似度的方法,该方法不绑定到任何特定的计算相似度的方法

    检索类似产品

    Django本机解决此问题的一种方法是建立
    manytomy
    关系:

    class Product(models.Model):
        tags = TaggableManager() #using django-taggit
        categories = models.ManyToManyField(Category)
        similars = models.ManyToManyField(Product)
    
    注意,这里的关键思想是为每个产品存储所有类似产品的主键列表。那么
    类似的\u产品
    方法就是:

    def similar_products(self):
         return self.similars.all()
    
    挑战在于这种方法需要每秒计算数百次

    根据产品目录和类别列表的大小,