我有一个带有标签和产品的产品清单。类别,像这样
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,但它似乎使用用户和评级)
谢谢:)
答案 0 :(得分:3)
免责声明:以下是我如何解决问题的开始。按原样提供,不适合用途,不包括保修。
有基于标签和类别的django本地方式来计算和评分类似的产品吗?
简短的答案为否 - Django是一个Web应用程序框架,而不是推荐系统。
我正在寻找一种有效实施方法的方法(...)
请注意,这是一项非常重要的任务。您需要解决两个部分:
一旦完成,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。
两个产品之间的相似度得分应为数量 标签&他们有共同的类别
一种天真的方法如下。
对于每种产品,
category_score
,它是类别指标的二进制表示(基本上是一个字符串)similarity = abs(product1.category_score - product2.category_score)
Product.similars
关系显然,这是需要在某种批处理环境中脱机运行的任务。请注意,有更复杂的方法应用机器学习技术,特别是一些在线工作并且比上述更好地扩展。根据您的特定要求(例如#products,#transations,需要用户偏好匹配等),可能会或可能不值得研究这些方法。
推荐阅读: