提问人:RichW 提问时间:4/22/2011 最后编辑:CommunityRichW 更新时间:4/25/2011 访问量:1062
PHP/MySQL - 查找具有相似或匹配属性的项目
PHP/MySQL - find items that have similar or matching properties
问:
我正在尝试开发一种方法来获取具有许多属性的实体并在数据库中搜索相似的实体(以正确的顺序匹配尽可能多的属性)。这个想法是,然后它会返回它相似程度的百分比。
还应考虑属性的顺序,因此开头的属性比结尾的属性更重要。
例如:
项目1 - A、B、C、D、E
项目2 - A、B、C、D、E
将是 100% 匹配
项目1 - A、B、C、D、E
项目2 - B、C、A、D、E
这不是一个完美的匹配,因为属性的顺序不同
项目1 - A、B、C、D、E
议程项目2 - F、G、H、I、A
将是一个低匹配,因为只有一个属性是相同的,并且它位于位置 5
该算法将运行成千上万条记录,因此它需要高性能和高效。关于如何在PHP / MySQL中以快速有效的方式做到这一点的任何想法?
我正在考虑levenshtein,但据我所知,这也会考虑两个完全不同的单词在拼写方面的距离。对于这种情况来说似乎并不理想,除非我只是以错误的方式使用它。
它可能只能在MySQL中完成,也许使用全文搜索或其他东西。
这似乎是一个不错的解决方案,尽管不是为这种情况设计的。也许二元比较可以以某种方式使用?
答:
我要做的是将 Order 和 Property 值编码为一个数字。数字具有快速比较的优点。
这是一个一般的想法,可能还需要一些工作,但我希望它能在某种程度上有所帮助。
计算每个属性的数字(某种形式的哈希),并将表示项目属性的出现顺序的数字相乘。
假设 item1 有 3 个属性 A、B 和 C。
哈希 (A) = 123, 哈希 (B) = 345, 哈希 (C) = 456
然后将其乘以外观顺序,假设我们有已知数量的属性:
(哈希 (A) * 1,000,00) + (哈希 (B) * 1,000) + (哈希 (C) * 1) = 某个值
可以调整乘数的大小以反映您的数据集。您必须识别哈希函数。也许是Soundex?
由于哈希冲突,这个问题现在被简化为唯一性问题,但我们可以非常确定不匹配的属性。
此外,这样做的优点是,通过使用乘数的大小从生成的数字中提取哈希值,可以相对容易地检查属性是否以不同的顺序出现在另一个项目中。
HTH。
编辑:检查匹配项的示例
给定项目 1(a、b、c)和项目 2(a、b、c)。计算出的项哈希值将相等。这是最好的情况。无需进一步计算。
给定项目 1(a、b、c) 和项目 2(d、e、a)。计算出的项哈希值不相等。继续分解属性哈希...
假设属性 a = 1, b = 2, c = 3, d = 4, e = 5 的哈希表,乘数为 10^n。item1 的计算哈希值为 123,item2 为 451,分解每个属性的计算哈希值,并比较所有属性组合,每个 item1(变成 item1(1, 2, 3))和 item2(变成 item2(4, 5, 1))。然后计算分数。
另一种查看方式是逐个比较属性,但这次您使用的是数字而不是实际的字符串值
评论
您可以从各种序列比对算法(如 Smith-Waterman)中汲取灵感(或平坦的算法)。事实上,你正在寻找的似乎是对序列比对的描述。但是,我不确定是否可以将其作为 SQL 查询来执行。
评论
上一个:浮雕堆积条形图不堆积
下一个:PHP 包含在 cron 作业中
评论