例如:
Item 1 – A,B,C,D,E
Item 2 – A,E
将100%匹配
Item 1 – A,E
Item 2 – B,A,E
这不是一个完美的匹配,因为属性的顺序不同
Item 1 – A,E
Item 2 – F,G,H,I,A
将是一个低匹配,因为只有一个属性是相同的,它位于第5位
该算法将运行成千上万的记录,因此需要具有高性能和高效率.有关如何以快速有效的方式在PHP / MysqL中执行此操作的任何想法?
我正在考虑levenshtein,但据我所知,这也将考虑拼写方面两个完全不同的单词之间的距离.除非我只是以错误的方式使用它,否则似乎不适合这种情况.
这似乎是nice solution,虽然不是为这种情况设计的.也许二进制比较可以用某种方式?
这是一个普遍的想法,可能仍然需要一些工作,但我希望它会在某种程度上有所帮助.
计算每个属性的数字(某种形式的散列),并将代表项目属性的出现顺序的数字相乘.
说item1有3个属性A,B和C.
hash(A)= 123,hash(B)= 345,hash(C)= 456
(hash(A)* 1,000,00)(hash(B)* 1,000)(hash(C)* 1)= someval
可以调整乘数的大小以反映您的数据集.你必须确定哈希函数. 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,项目2为451,分解每个属性的计算哈希值,并比较每个item1(变为item1(1 2 3))和item2(变为item2(4 5 1)的属性的所有组合. )).然后计算得分.