我正在构建一个功能,例如亚马逊的“购买此商品的客户也购买了”。我有大约 6 年的订单要挖掘这些数据,并且显然会继续使用来自新订单的数据进行更新。
想到几个问题:
- 我如何存储这些关系?我正在考虑一个包含 productA、productB 和计数(或排名)的简单表。这足够了吗?
- 我不认为旧数据与新数据一样重要。如何优先处理较新的数据?
编辑:这个网站只销售一种产品,所以几乎所有东西都是相关的,不需要过滤。我也希望尽可能简单——数据已经在我的数据库中,我正在寻找最简单的方法来计算和存储它。
我正在构建一个功能,例如亚马逊的“购买此商品的客户也购买了”。我有大约 6 年的订单要挖掘这些数据,并且显然会继续使用来自新订单的数据进行更新。
想到几个问题:
编辑:这个网站只销售一种产品,所以几乎所有东西都是相关的,不需要过滤。我也希望尽可能简单——数据已经在我的数据库中,我正在寻找最简单的方法来计算和存储它。
您可以使用easyrec来完成您的任务。它将以以下格式存储关系:
CREATE TABLE `itemassoc` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tenantId` int(11) NOT NULL DEFAULT '0',
`itemFromId` int(11) NOT NULL DEFAULT '0',
`itemFromTypeId` int(11) unsigned NOT NULL DEFAULT '0',
`assocTypeId` int(11) unsigned NOT NULL DEFAULT '0',
`assocValue` double NOT NULL DEFAULT '0',
`itemToId` int(11) NOT NULL DEFAULT '0',
`itemToTypeId` int(11) unsigned NOT NULL DEFAULT '0',
`sourceTypeId` int(11) NOT NULL DEFAULT '0',
`sourceInfo` varchar(250) DEFAULT '0',
`viewTypeId` int(11) unsigned NOT NULL DEFAULT '0',
`active` tinyint(1) NOT NULL DEFAULT '1',
`changeDate` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_itemassoc` (`tenantId`,`itemFromId`,`itemFromTypeId`,`itemToId`,`itemToTypeId`,`assocTypeId`,`sourceTypeId`),
KEY `idFrom_assoc` (`itemFromId`,`itemFromTypeId`,`assocTypeId`,`tenantId`),
KEY `recommender` (`itemFromId`,`itemFromTypeId`,`itemToTypeId`,`assocTypeId`,`tenantId`,`active`)
) ENGINE=InnoDB AUTO_INCREMENT=38480 DEFAULT CHARSET=latin1 COMMENT='Table containing item associations'
这基本上是
easyrec可以导入您的“购买操作”并从中计算出规则。
看看http://taste.sourceforge.net/
Taste 是一个灵活、快速的 Java 协同过滤引擎。该引擎获取用户对项目的偏好(“口味”)并返回对其他项目的估计偏好。例如,销售书籍或 CD 的网站可以轻松地使用 Taste 从过去的购买数据中找出客户可能有兴趣听的 CD。
谷歌还有一个可以为你的用例量身定制的预测 API。在这里查看他们的场景
我个人不会存储这些数据。我将创建一个动态选择要建议的产品的视图。
一种简单的实现可能是:
您可以通过删除第 2 步来简化它,这样您就可以只显示其他已购买的产品,而不管受欢迎程度如何。
正如 Simon Marc 所建议的,您可以通过按标准过滤您的产品来使其更加复杂。
至于较旧的数据,也许项目可以按日期或冗余标志使用,这意味着它们已从选择中过滤。
“我如何存储这些关系?我正在考虑一个包含 productA、productB 和计数(或排名)的简单表。这就足够了吗?”
这还不够,真的。最好是利用对象的语义
因此,获取与对象相关联的数据(例如一本书:事实上它是一本书,由 xxx 撰写,写作风格,书的种类......),并查看与其他数据的关系,从而将您带到另一个对象(例如这类书与此类相关,或此艺术家与此艺术家相关,或两者兼而有之……)。这确实是一项非常艰巨的工作。
之后你可以选择自己做,但它可能没有你想要的那么重要。
我真的认为你应该看看已经存在的东西(例如在 sourceforge 或 github 上)。