php - 复合项目的相似度得分

标签 php mysql

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

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

现在我用漂亮而 Shiny 的 PHP 函数和类完成了整个事情..
以及一个计算和更新所有关系的函数。

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

索引、事务和预加载一些数据..帮了我一半的忙。

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

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

最佳答案

我知道这不是最好的,但是以下怎么样:

  1. 您有一个表格,其中链接了两个项目、时间戳以及它们的分数。该表将保存 1,000,00 条记录。
  2. 您有一个 CRON 脚本,每 15 分钟运行一次。
  3. 第一次运行 cron 时,它会创建 1,000,000 行。不计算分数。这可以通过计算表中的行数来完成。如果 count==0 则首先运行
  4. 第二次运行以及此后运行,它会选择 1000 条记录,计算它们的分数并更新时间戳。它应该选择按时间戳排序的 1000 条记录,以便选择 1000 条最旧的记录。
  5. 让它在后台运行,大约每 15 分钟运行一次。总共需要大约 10 天的时间来运行并计算所有分数。
  6. 每当您更新产品时,您都需要重置链接表上的日期,以便当 cron 运行时,它会重新计算提及该项目的所有行的分数。
  7. 创建新产品时,必须创建链接行,因此必须为每个其他项目添加一行

就我个人而言,我会考虑完全使用不同的方法,有很多算法,您只需找到一种适用于这种情况的算法即可。这是一个例子:

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

关于php - 复合项目的相似度得分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18790043/

相关文章:

mysql - 替代子查询

php - 如何在 CI 中的非对象上获取 num_rows()

php - CakePHP 3 关联删除

php - 使用 shell_exec(); 时是否需要配置我的远程服务器?

php - WooCommerce 3 中产品变体的 Ajax 添加到购物车按钮

php - 基本的 SQL 注入(inject)?

mysql - 将 SQL 语句中的 NOT IN 替换为 LEFT JOIN

PHP strtotime + 1 个月并返回 23 :59

php - 依赖下拉菜单或类似的,使用 mootools、php 和 MySQL

php - echarts:从URL获取数据