【问题标题】:Similarity scores of composite items复合项目的相似度得分
【发布时间】:2013-09-13 15:29:29
【问题描述】:

我有一个在线商店应用程序和一个包含大约 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。
- 如果 common 中没有样式 -= 10p。 - 对于评分差异的每个点 -= 5p。

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

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

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

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

有没有更聪明的方法来比较和评估这类数据?

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

【问题讨论】:

  • 不知道,因为您没有向我们展示您如何比较和评估的代码。
  • ITEM是什么符号?

标签: php mysql


【解决方案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. 创建新产品时,必须创建链接行,因此必须为其他项目添加一行

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

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

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2012-05-09
    • 2012-10-29
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多