复合项目的相似度得分

时间:2013-09-13 15:29:29

标签: php mysql

我有一个在线商店应用程序和大约1000个ITEMS的数据库。

ITEM{
  categories / up to 5  out of 60
  types / up to 2 out of 10
  styles / up to 2 out of 10
  rating / 0-5
}

现在我不会创建具有预定义条件的比较项目到项目:
  - 至少一个常见的类别 + = 25个点   - 至少一个常见的类型 + = 25p   - 如果第一项没有样式 + = 0p   - 如果普通 - = 10p中没有样式。   - 对于评级差异中的每个点 - = 5p。

并将结果存储在表格中。为item_to_item_similarity.score

现在我用一个漂亮而有光泽的PHP函数和类来完成整个事情 并且是一个计算和更新所有关系的函数。

在测试中有20个项目..一切顺利。 但是当测试数据增加到1000项时......导致1000x1000的关系 服务器开始抱怨script_time_out ..和内存不足:)

索引,交易和预加载一些数据..帮助了我一半。

是否有更智能的方法来比较和评估此类数据?

我想要代表相关的类别,风格等 作为一组ID,可能在一些二进制掩码中......以便可以轻松比较它们 (即使在SQL中?)也不需要创建类,并且通过数组循环数百万次。

1 个答案:

答案 0 :(得分:1)

我知道这不是最好,但是,以下内容如何:

  1. 你的桌子上有两个项目,一个时间戳,并有他们的分数。该表将保存1,000,00条记录。
  2. 你有一个CRON脚本,每15分钟运行一次。
  3. 第一次运行cron时,它会创建1,000,000行。没有计算得分。这可以通过计算表中的行来完成。如果count == 0那么它是第一次运行
  4. 第二次运行然后运行,它选择1000条记录,并计算其得分并更新时间戳。它应该选择按时间戳排序的1000条记录,以便选择1000条最早的记录。
  5. 让它在后台运行,每15分钟左右。总计需要10天才能运行并计算所有分数。
  6. 每当您更新产品时,都需要重置链接表上的日期,以便在cron运行时重新计算提及该项目的所有行的分数。
  7. 创建新产品时,必须创建链接行,因此必须为每个其他项添加一行
  8. 就个人而言,我会考虑完全使用不同的方法,那里有很多算法你必须找到一个适用于这种情况的算法。这是一个例子:

    此外,这里是用PHP编写的Jaccard索引,它可能比您当前的方法更有效